js实现旋转的星空效果


Posted in Javascript onNovember 01, 2019

本文实例为大家分享了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>

js实现旋转的星空效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
设为首页和收藏的Javascript代码(亲测兼容IE,Firefox,chrome等浏览器)
Nov 18 Javascript
Javascript setInterval的两种调用方法(实例讲解)
Nov 29 Javascript
js控制href内容的连接内容的变化示例
Apr 30 Javascript
IE6-8中Date不支持toISOString的修复方法
May 04 Javascript
jQuery手机浏览器中拖拽动作的艰难性分析
Feb 04 Javascript
JavaScript将数组转换成CSV格式的方法
Mar 19 Javascript
微信小程序中实现一对多发消息详解及实例代码
Feb 14 Javascript
详解node.js的http模块实例演示
Jul 12 Javascript
快速解决angularJS中用post方法时后台拿不到值的问题
Aug 14 Javascript
React Native中Mobx的使用方法详解
Dec 04 Javascript
使用webpack搭建vue环境的教程详解
Dec 31 Javascript
ES6中的类(Class)示例详解
Dec 09 Javascript
浅谈小程序globalData的那些事儿
Nov 01 #Javascript
小程序怎样让wx.navigateBack更好用的方法实现
Nov 01 #Javascript
vue实现配置全局访问路径头(axios)
Nov 01 #Javascript
vue.js路由mode配置之去掉url上默认的#方法
Nov 01 #Javascript
js实现漂亮的星空背景
Nov 01 #Javascript
Vue实现push数组并删除的例子
Nov 01 #Javascript
vue实现跳转接口push 转场动画示例
Nov 01 #Javascript
You might like
10条PHP编程习惯助你找工作
2008/09/29 PHP
php抽象类使用要点与注意事项分析
2015/02/09 PHP
php实现将数组转换为XML的方法
2015/03/09 PHP
php根据指定位置和长度获得子字符串的方法
2015/03/17 PHP
PHP+Mysql+jQuery中国地图区域数据统计实例讲解
2015/10/10 PHP
php从数据库中获取数据用ajax传送到前台的方法
2018/08/20 PHP
Add a Formatted Table to a Word Document
2007/06/15 Javascript
JavaScript 学习笔记(七)字符串的连接
2009/12/31 Javascript
Jquery知识点三 jquery表单对象操作
2011/01/17 Javascript
JavaScript将相对地址转换为绝对地址示例代码
2013/07/19 Javascript
jquery与prototype框架的详细对比
2013/11/21 Javascript
jQuery取得设置清空select选择的文本与值
2014/07/08 Javascript
Nodejs学习笔记之NET模块
2015/01/13 NodeJs
使用OpenLayers3 添加地图鼠标右键菜单
2015/12/29 Javascript
jQuery 移动端artEditor富文本编辑器
2016/01/11 Javascript
Jquery组件easyUi实现选项卡切换示例
2016/08/23 Javascript
js数组去重的hash方法
2016/12/22 Javascript
input获取焦点时底部菜单被顶上来问题的解决办法
2017/01/24 Javascript
Angular2 自定义validators的实现方法
2017/07/05 Javascript
JavaScript调试之console.log调试的一个小技巧分享
2017/08/07 Javascript
原生JavaScript实现todolist功能
2018/03/02 Javascript
JavaScript实现异步图像上传功能
2018/07/12 Javascript
vue elementUI 表单校验功能之数组多层嵌套
2019/06/04 Javascript
[48:32]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs VG
2018/04/01 DOTA
Python中的__SLOTS__属性使用示例
2015/02/18 Python
python基础知识小结之集合
2015/11/25 Python
Python实现网络端口转发和重定向的方法
2016/09/19 Python
python爬虫的工作原理
2017/03/05 Python
对python中不同模块(函数、类、变量)的调用详解
2019/07/16 Python
动态设置django的model field的默认值操作步骤
2020/03/30 Python
总经理岗位职责描述
2014/02/08 职场文书
团日活动总结模板
2014/06/25 职场文书
导游词之重庆渣滓洞
2020/01/08 职场文书
如何使用Python实现一个简易的ORM模型
2021/05/12 Python
golang中的struct操作
2021/11/11 Golang
光之国的四大叛徒:第一贝利亚导致宇宙毁灭,赛文奥特曼在榜
2022/03/18 日漫