本文实例为大家分享了js实现旋转的星空效果的具体代码,供大家参考,具体内容如下
<!DOCTYPE HTML> <html lang="en"> <head> <meta charset="utf8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="keywords" content="starry sky"> <meta name="description" content="the starry sky"> <title>旋转的星空(the starry sky)</title> <style> body { margin: 0; padding: 0; overflow: hidden; } #canvas { position: absolute; left: 0; } #starCanvasDiv { background-color: white; } </style> </head> <body> <canvas id="canvas">Your browser can not support canvas</canvas> <script> var doublePI = Math.PI * 2; var canvas = document.getElementById("canvas"); var ctx = canvas.getContext("2d"); var cx,cy; var starCanvas; var alphaChangeProbability = new AlphaChangeProbability(); //色相 var hue = 217; //星空背景颜色 var bgColor = 'hsl(' + hue + ', 60%, 5%)'; //画布的外切圆半径 var canvasRadius; //每旋转一圈要需要的帧数 var radianStepCount; //星星的总个数 var starCount; //群星 var stars; function onResize() { canvas.width = window.innerWidth; canvas.height = window.innerHeight; cx = canvas.width / 2; cy = canvas.height / 2; canvasRadius = Math.sqrt(Math.pow(canvas.width, 2) + Math.pow(canvas.height, 2)) / 2; radianStepCount = canvasRadius * 100; starCount = parseInt((canvas.width + canvas.height) * 0.5); stars = []; for(var i=0; i<starCount; i++) { stars.push(new Star()); } //初始时要先绘制一层背景,否则第一波星星走过的路径会有画布底料涂抹不均匀的感觉 ctx.globalCompositeOperation = "source-over"; ctx.globalAlpha = 1; ctx.fillStyle = bgColor; ctx.fillRect(0, 0, canvas.width, canvas.height); } function init() { createStarCanvas(); window.addEventListener("resize", onResize); onResize(); loop(); } //在[min, max)范围内随机一个整数 function randomInt(min, max) { if(arguments.length === 1) { max = min; min = 0; } else if(min > max) { var tmp = max; mix = min; min = tmp; } return Math.floor(Math.random() * (max - min) + min); } //透明度改变的概率 function AlphaChangeProbability() { //透明度改变的步长 var alphaStep = 0.05; //透明度增加 var plus = 1; //透明度减少 var minus = 1; //透明度不变 var invariant = 8; //总概率 var totalChance = plus + minus + invariant; //获取随机的透明度改变值 function getRandomChangeValue() { var value = Math.random() * totalChance; if(value < plus) { return alphaStep; } value -= plus; if(value < minus) { return -alphaStep; } return 0; } //随机改变alpha的值 this.randomChangeAlpha = function(alpha) { alpha += getRandomChangeValue(); if(alpha > 1) { alpha = 1; } else if(alpha < 0) { alpha = 0; } return alpha; } } //创建星星图片 function createStarCanvas() { starCanvas = document.createElement("canvas"); var ctx = starCanvas.getContext("2d"); starCanvas.width = 100; starCanvas.height = 100; var cx = starCanvas.width / 2; var cy = starCanvas.height / 2; var radius = Math.max(cx, cy); var gradient = ctx.createRadialGradient(cx, cy, 0, cx, cy, radius); gradient.addColorStop(0.025, '#CCC'); gradient.addColorStop(0.1, 'hsl(' + hue + ', 65%, 35%)'); gradient.addColorStop(0.25, bgColor); gradient.addColorStop(1, "transparent"); ctx.fillStyle = gradient; ctx.beginPath(); ctx.arc(cx, cy, radius, 0, doublePI); ctx.fill(); } //星体对象 var Star = function() { //星体运行的轨道半径 this.orbitRadius = Math.random() * canvasRadius; //星体的半径 this.radius = randomInt(60, this.orbitRadius) / 8; //星体透明度 this.alpha = Math.random(); //相对轨道中心(即画布中心)的角度 this.theta = Math.random() * doublePI; //角速度 this.speed = Math.random() * this.orbitRadius / radianStepCount; //获取当前坐标 this.getPos = function() { return { x: cx + this.orbitRadius * Math.cos(this.theta), y: cy + this.orbitRadius * Math.sin(this.theta) } } } Star.prototype.update = function() { this.alpha = alphaChangeProbability.randomChangeAlpha(this.alpha); this.theta += this.speed; this.pos = this.getPos(); } Star.prototype.draw = function() { ctx.globalAlpha = this.alpha; ctx.drawImage(starCanvas, this.pos.x, this.pos.y, this.radius, this.radius); } function loop() { ctx.globalCompositeOperation = "source-over"; ctx.globalAlpha = 0.5; ctx.fillStyle = bgColor; ctx.fillRect(0, 0, canvas.width, canvas.height); ctx.globalCompositeOperation = "lighter"; for(var i = 0; i < stars.length; i++) { stars[i].update(); stars[i].draw(); } //绘制星体图样 ctx.globalCompositeOperation = "source-over"; ctx.globalAlpha = 1; ctx.fillStyle = "white"; ctx.fillRect(0, 0, starCanvas.width, starCanvas.height); ctx.drawImage(starCanvas, 0, 0, starCanvas.width, starCanvas.height); requestAnimationFrame(loop); } init(); </script> </body> </html>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
暂无评论...
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
2024年11月26日
2024年11月26日
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]