JS+canvas画布实现炫酷的旋转星空效果示例


Posted in Javascript onFebruary 13, 2019

本文实例讲述了JS+canvas画布实现炫酷的旋转星空效果。分享给大家供大家参考,具体如下:

canvas是html5的新标签,其画布功能尤为强大。当然了canvas在IE10以下浏览器是不兼容的,所以呢为了特效肯定是牺牲一定的兼容性。这里呢,分享一个基于canvas开发的浩瀚星河插件,其实这个源代码是网上下载的,我把它整合了一下,重新封装一些参数提供更多的可改项。

首先引入两个javascript脚本,一个是jquery插件,另一个是封装好的cosmos_canvas.js

<script src="js/jquery-1.11.0.js" type="text/javascript" charset="utf-8"></script>
<script src="canvas/cosmos_canvas.js" type="text/javascript" charset="utf-8"></script>

HTML,当然如果浏览器不支持canvas的话,运行程序没效果,并显示“该浏览器不支持canvas”

<canvas id="starts">该浏览器不支持canvas</canvas>

cosmos_canvas.js脚本

function canvas(id,starscolor,starsamount,starsradius,movrange,speed,trailing){
  //宇宙特效
"use strict";
var canvas = document.getElementById(id),
 ctx = canvas.getContext('2d'),
 w = canvas.width = window.innerWidth,
 h = canvas.height = window.innerHeight,
 hue = starscolor,//230
 stars = [],
 count = 0,
 maxStars = starsamount;//星星数量
var canvas2 = document.createElement('canvas'),
 ctx2 = canvas2.getContext('2d');
canvas2.width = 100;
canvas2.height = 100;
var half = canvas2.width / 2,
 gradient2 = ctx2.createRadialGradient(half, half, 0, half, half, half);
gradient2.addColorStop(0.025, '#CCC');
gradient2.addColorStop(0.1, 'hsl(' + hue + ', 61%, 33%)');
gradient2.addColorStop(0.25, 'hsl(' + hue + ', 64%, 6%)');
gradient2.addColorStop(1, 'transparent');
ctx2.fillStyle = gradient2;
ctx2.beginPath();
ctx2.arc(half, half, half, 0, Math.PI * 2);
ctx2.fill();
// End cache
function random(min, max) {
 if (arguments.length < 2) {
  max = min;
  min = 0;
 }
 if (min > max) {
  var hold = max;
  max = min;
  min = hold;
 }
 return Math.floor(Math.random() * (max - min + 1)) + min;
}
function maxOrbit(x, y) {
 var max = Math.max(x, y),
  diameter = Math.round(Math.sqrt(max * max + max * max));
 return diameter / movrange;
 //星星移动范围,值越大范围越小,
}
var Star = function() {
 this.orbitRadius = random(maxOrbit(w, h));
 this.radius = random(starsradius, this.orbitRadius) / 8;
 //星星半径大小
 this.orbitX = w / 2;
 this.orbitY = h / 2;
 this.timePassed = random(0, maxStars);
 this.speed = random(this.orbitRadius) / speed;
 //星星移动速度
 this.alpha = random(2, 10) / 10;
 count++;
 stars[count] = this;
}
Star.prototype.draw = function() {
 var x = Math.sin(this.timePassed) * this.orbitRadius + this.orbitX,
  y = Math.cos(this.timePassed) * this.orbitRadius + this.orbitY,
  twinkle = random(10);
 if (twinkle === 1 && this.alpha > 0) {
  this.alpha -= 0.05;
 } else if (twinkle === 2 && this.alpha < 1) {
  this.alpha += 0.05;
 }
 ctx.globalAlpha = this.alpha;
 ctx.drawImage(canvas2, x - this.radius / 2, y - this.radius / 2, this.radius, this.radius);
 this.timePassed += this.speed;
}
for (var i = 0; i < maxStars; i++) {
 new Star();
}
function animation() {
 ctx.globalCompositeOperation = 'source-over';
 ctx.globalAlpha = trailing; //尾巴
 ctx.fillStyle = 'hsla(' + hue + ', 64%, 6%, 2)';
 ctx.fillRect(0, 0, w, h)
 ctx.globalCompositeOperation = 'lighter';
 for (var i = 1, l = stars.length; i < l; i++) {
  stars[i].draw();
 };
 window.requestAnimationFrame(animation);
}
animation();
}

调用方法:这里没写任何样式所以默认情况下是全屏效果

$(function(){
//canvas的id名,星星颜色(hsla的hue色调),星星数量,星星半径比,星星移动范围(值越大范围越小),星星移动速度(值越大速度越慢),星星拖尾效果(0~1值越小拖尾越明显)
canvas("starts",230,1000,60,2,50000,0.5);
});

效果:

JS+canvas画布实现炫酷的旋转星空效果示例

然后我再加3个canvas,改些参数做效果对比吧

HTML

<canvas id="starts">该浏览器不支持canvas</canvas>
<canvas id="starts1">该浏览器不支持canvas</canvas>
<canvas id="starts2">该浏览器不支持canvas</canvas>
<canvas id="starts3">该浏览器不支持canvas</canvas>

javascript

$(function(){
  //canvas的id名,星星颜色(hsla的hue色调),星星数量,星星半径比,星星移动范围(值越大范围越小),星星移动速度(值越大速度越慢),星星拖尾效果(0~1值越小拖尾越明显)
  canvas("starts",230,1000,60,2,50000,0.5);
  canvas("starts1",160,800,70,2.5,55000,0.4);
  canvas("starts2",80,600,80,3,60000,0.3);
  canvas("starts3",0,400,90,3.5,65000,0.2);
  $("canvas").width($(window).width()/2);
  $("canvas").height($(window).height()/2);
  $("canvas").css("float","left");
});

就这样,四个浩瀚的宇宙出来了

JS+canvas画布实现炫酷的旋转星空效果示例

更多关于JavaScript相关内容还可查看本站专题:《JavaScript+HTML5特效与技巧汇总》、《JavaScript图形绘制技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
解析javascript 实用函数的使用详解
May 10 Javascript
JQuery中$.ajax()方法参数详解及应用
Dec 12 Javascript
JavaScript中实现sprintf、printf函数
Jan 27 Javascript
Winform客户端向web地址传参接收参数的方法
May 17 Javascript
jQuery改变form表单的action,并进行提交的实现代码
May 25 Javascript
JavaScript随机打乱数组顺序之随机洗牌算法
Aug 02 Javascript
Node.js测试中的Mock文件系统详解
Nov 21 Javascript
JavaScript中关于for循环删除数组元素内容时出现的问题
Nov 21 Javascript
JavaScript实现的select点菜功能示例
Jan 16 Javascript
Bootstrap下拉菜单Dropdowns的实现代码
Mar 17 Javascript
node简单实现一个更改头像功能的示例
Dec 29 Javascript
深入了解JS之作用域和闭包
Jun 16 Javascript
JavaScript实现的拼图算法分析
Feb 13 #Javascript
推荐15个最好用的JavaScript代码压缩工具
Feb 13 #Javascript
Vue中CSS动画原理的实现
Feb 13 #Javascript
Vue中JS动画与Velocity.js的结合使用
Feb 13 #Javascript
JavaScript中.min.js和.js文件的区别讲解
Feb 13 #Javascript
node.js微信小程序配置消息推送的实现
Feb 13 #Javascript
vue实现购物车抛物线小球动画效果的方法详解
Feb 13 #Javascript
You might like
饭制《星际争霸》Mod:优化游戏机制 增加新单位
2017/07/02 星际争霸
php中检查文件或目录是否存在的代码小结
2012/10/22 PHP
PHP微信API接口类
2016/08/22 PHP
浅谈PHP的反射API
2017/02/26 PHP
javascript数字时钟示例分享
2014/04/23 Javascript
js动态切换图片的方法
2015/01/20 Javascript
浏览器兼容的JS写法总结
2016/04/27 Javascript
javascript中href和replace的比较(详解)
2016/11/25 Javascript
ReactNative实现图片上传功能的示例代码
2017/07/11 Javascript
js HTML5 canvas绘制图片的方法
2017/09/08 Javascript
jQuery实现的简单前端搜索功能示例
2017/10/28 jQuery
ajax请求data遇到的问题分析
2018/01/18 Javascript
Vue三种常用传值示例(父传子、子传父、非父子)
2018/07/24 Javascript
IE9 elementUI文件上传的问题解决
2018/10/17 Javascript
详解如何运行vue项目
2019/04/15 Javascript
Vue实现商品分类菜单数量提示功能
2019/07/26 Javascript
js基础之事件捕获与冒泡原理
2019/10/09 Javascript
Jquery让form表单异步提交代码实现
2019/11/14 jQuery
详解nginx配置vue h5 history去除#号
2020/11/09 Javascript
python实现对任意大小图片均匀切割的示例
2018/12/05 Python
selenium+python自动化测试之页面元素定位
2019/01/23 Python
对Python3 pyc 文件的使用详解
2019/02/16 Python
jupyter notebook 中输出pyecharts图实例
2020/04/23 Python
python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析
2019/09/05 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
2020/02/11 Python
使用Jupyter notebooks上传文件夹或大量数据到服务器
2020/04/14 Python
Python脚本破解压缩文件口令实例教程(zipfile)
2020/06/14 Python
HTML5离线缓存Manifest是什么
2016/03/09 HTML / CSS
法国一家多品牌成衣精品中/高档商店:Graduate Store
2019/08/28 全球购物
乌克兰网上珠宝商店:GoldSoveren
2020/03/31 全球购物
舞蹈毕业生的自我评价
2014/03/05 职场文书
财政局党的群众路线教育实践活动整改方案
2014/09/21 职场文书
大学生村官个人对照检查材料(群众路线)
2014/09/26 职场文书
2014年实习期工作总结
2014/11/27 职场文书
redis 查看所有的key方式
2021/05/07 Redis
Typescript类型系统FLOW静态检查基本规范
2022/05/25 Javascript