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实现仿银行密码输入框效果的代码
Dec 13 Javascript
JQERY limittext 插件0.2版(长内容限制显示)
Aug 27 Javascript
JavaScript 大数据相加的问题
Aug 03 Javascript
JavaScript回调(callback)函数概念自我理解及示例
Jul 04 Javascript
JS判断不能为空实例代码
Nov 26 Javascript
基于JS实现简单的样式切换效果代码
Sep 04 Javascript
Bootstrap表格和栅格分页实例详解
May 20 Javascript
jquery Banner轮播选项卡
Dec 26 Javascript
jQuery中extend函数简单用法示例
Oct 11 jQuery
详解Vue 全局引入bass.scss 处理方案
Mar 26 Javascript
layui实现动态和静态分页
Apr 28 Javascript
JavaScript实现多张图片放大镜效果示例【不限定图片尺寸,rem单位】
May 14 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
php下判断数组中是否存在相同的值array_unique
2008/03/25 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
2011/01/27 PHP
php+mysql+jquery实现简易的检索自动补全提示功能
2017/04/15 PHP
laravel执行php artisan migrate报错的解决方法
2019/10/09 PHP
对象的类型:本地对象(1)
2006/12/29 Javascript
js宝典学习笔记(上)
2007/01/10 Javascript
Javascript Jquery 遍历Json的实现代码
2010/03/31 Javascript
zepto中使用swipe.js制作轮播图附swipeUp,swipeDown不起效果问题
2015/08/27 Javascript
JavaScript中最容易混淆的作用域、提升、闭包知识详解(推荐)
2016/09/05 Javascript
原生js验证简洁注册登录页面
2016/12/17 Javascript
微信小程序--onShareAppMessage分享参数用处(页面分享)
2017/04/18 Javascript
Javascript实现数组中的元素上下移动
2017/04/28 Javascript
JavaScript中的FileReader图片预览上传功能实现代码
2017/07/24 Javascript
BootStrap selectpicker后台动态绑定数据的方法
2017/07/28 Javascript
解决angular2 获取到的数据无法实时更新的问题
2018/08/31 Javascript
Vue 页面权限控制和登陆验证功能的实例代码
2019/06/20 Javascript
微信小程序实现3D轮播图效果(非swiper组件)
2019/09/21 Javascript
layui添加动态菜单与选项卡 AJAX请求的例子
2019/09/25 Javascript
Python实现备份文件实例
2014/09/16 Python
用Python写一个无界面的2048小游戏
2016/05/24 Python
利用Python实现网络测试的脚本分享
2017/05/26 Python
python读取excel表格生成erlang数据
2017/08/26 Python
python集合比较(交集,并集,差集)方法详解
2018/09/13 Python
python tkinter界面居中显示的方法
2018/10/11 Python
详解Django+Uwsgi+Nginx 实现生产环境部署
2018/11/06 Python
基于python解线性矩阵方程(numpy中的matrix类)
2019/10/21 Python
俄罗斯在线购买飞机票、火车票、巴士票网站:Tutu.ru
2020/03/16 全球购物
大学班级干部的自我评价分享
2014/02/10 职场文书
教师师德承诺书
2014/03/26 职场文书
霸气押韵的班级口号
2014/06/09 职场文书
酒店端午节活动方案
2014/08/26 职场文书
2014教师党员个人自我评议
2014/09/20 职场文书
领导班子四风对照检查材料思想汇报
2014/09/26 职场文书
2015婚礼主持词开场白
2015/05/28 职场文书
AI:如何训练机器学习的模型
2021/04/16 Python
C站最全Python标准库总结,你想要的都在这里
2021/07/03 Python