canvas雪花效果核心代码分享


Posted in Javascript onFebruary 19, 2017

话不多说,请看代码:

var ca = document.getElementById("ca");
 var ctx = ca.getContext('2d');
 //生成n~m之间的随机数的函数
 function random(n,m){
 return Math.floor(Math.random() * (m - n) + n);
 }
 //角度转弧度的函数
 function toRd(angle){
 return angle * Math.PI / 180;
 }
 //设置变量存储画布的最大宽高度
 var maxH = ca.height;
 var maxW = ca.width;
 //每一个雪花都具有的特性
 //x,y坐标、雪花半径、角度、
 //先生成100个雪花
 var snows = [];
 for(var i=0;i<200;i++){
 snows.push({
 "left": random(0, maxW),
 "top": random(0, maxH),
 "deg": random(-20, 20), //这个是起到更新数据的作用
 "radius": random(2, 10)
 });
 }
 //将这些属性应用到每一雪花上
// for(var i=0;i<snows.length;i++) {
// var r = snows[i].radius;
// var x = snows[i].left;
// var y = snows[i].top;
// var ra = ctx.createRadialGradient(x, y, r / 4, x, y, r);
// ra.addColorStop(0, "rgba(255,0,0,1)");
// ra.addColorStop(1, "rgba(255,0,0,0.1)");
// ctx.fillStyle = ra;
// ctx.beginPath();
// ctx.arc(x, y, r, 0, 2 * Math.PI);
// ctx.fill();
// }
 //如果向上面这样写的话不会有动画效果
 //要实现动画效果就要让每一个雪花的特性都变动起来
 //设置定时器,定时改变特性
 var timer = setInterval(function () {
 snow();
 //要实现动画效果首先要清除画布内容
 ctx.clearRect(0, 0, maxW, maxH);
 //每一个雪花每隔16ms需要变动的特性是
 //x、y坐标,这是需要一个新的数值来做计算,改变它们的值
 //为了避免重新定义这里直接利用snows.radius来计算
 for (var i = 0; i < snows.length; i++) {
 //一开始每一个雪花的x,y坐标和半径r
 //注意不能这样写,后面的雪花的数据会把前面的顶掉,这个bug找了好长时间
// var r = snows[i].radius;
// var x = snows[i].left;
// var y = snows[i].top;
// var d = snows[i].deg;
 //y变化量
 var yChange = 0.5 * snows[i].radius;
 //x变化量 这里可以将x的变化量和y的变化量通过snows.deg关联起来,
 //从而使每一个雪花都沿着自己的轨迹走,也可以单独设定,所有的雪花轨迹一样
 var xChange = Math.tan(toRd(snows[i].deg)) * yChange; //这里的三角公式经过测试 tan 是最合适的
 snows[i].top += yChange;
 snows[i].left += xChange;
 //经过上面这些步骤每一个雪花的x,y坐标都发生了改变,随着时间的推移,
 //雪花都会飘出画布,雪花最后就没有了,这里需要作出判断,把超出画布的雪花从snows
 //里面删掉,然后再添加新的雪花,这一步在最后进行,这里只做判断
 if (snows[i].left < 0 || snows[i].left > maxW || snows[i].top > maxH) {
 //这里的x<0 是因为 xChange可能为负值
 if(i>0){
  snows.splice(i--, 1);
  continue;//如果超出范围了
  // 那这个雪花就没必要再进行后面的渲染了,所以这个判断可以降低性能消耗
 }
 }
 //开始渲染
 var ra = ctx.createRadialGradient(snows[i].left, snows[i].top, snows[i].radius / 4, snows[i].left, snows[i].top, snows[i].radius);
 ra.addColorStop(0, "rgba(255,255,255,1)");
 ra.addColorStop(1, "rgba(255,255,255,0.1)");
 ctx.fillStyle = ra;
 ctx.beginPath();
 ctx.arc(snows[i].left, snows[i].top, snows[i].radius, 0, 2 * Math.PI);
 ctx.fill();
 }
 }, 16);
 //增加雪花的数量
 //就是往snows数组中添加成员
 function snow(){
 if(snows.length<220) {
 var l = 220 - snows.length;
 for(var i=0;i<l;i++){
 snows.push({
  "left": random(0, maxW),
  "top": 0,
  "deg": random(-20, 20), //这个是起到更新数据的作用
  "radius": random(2, 10)
 })
 }
 }
 }

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
弹出层之1:JQuery.Boxy (一) 使用介绍
Oct 06 Javascript
PHP abstract与interface之间的区别
Nov 11 Javascript
js获取当前月的第一天和最后一天的小例子
Nov 18 Javascript
node.js操作mongodb学习小结
Apr 25 Javascript
使用JavaScript实现ajax的实例代码
May 11 Javascript
Javascript小技能总结(推荐)
Jun 02 Javascript
jquery 多个radio的click事件实例
Dec 03 Javascript
使用JavaScript实现表格编辑器(实例讲解)
Aug 02 Javascript
vue-router路由懒加载和权限控制详解
Dec 13 Javascript
使用Jenkins部署React项目的方法步骤
Mar 11 Javascript
jQuery+ajax实现批量删除功能完整示例
Jun 06 jQuery
JS绘图Flot如何实现可选显示曲线图功能
Oct 16 Javascript
Ajax和Comet技术总结
Feb 19 #Javascript
thinkphp标签实现bootsrtap轮播carousel实例代码
Feb 19 #Javascript
Angularjs中的ui-bootstrap的使用教程
Feb 19 #Javascript
Java中int与integer的区别(基本数据类型与引用数据类型)
Feb 19 #Javascript
RequireJs的使用详解
Feb 19 #Javascript
Vue.js -- 过滤器使用总结
Feb 18 #Javascript
JS打开摄像头并截图上传示例
Feb 18 #Javascript
You might like
浅谈PHP 闭包特性在实际应用中的问题
2009/10/30 PHP
PHP下escape解码函数的实现方法
2010/08/08 PHP
php中simplexml_load_file函数用法实例
2014/11/12 PHP
老生常谈PHP面向对象之注册表模式
2017/05/26 PHP
PHP基于array_unique实现二维数组去重
2020/07/14 PHP
Extjs中常用表单介绍与应用
2010/06/07 Javascript
JS Date函数整理方便使用
2013/10/23 Javascript
设为首页和收藏的Javascript代码(亲测兼容IE,Firefox,chrome等浏览器)
2013/11/18 Javascript
关于js中for in的缺陷浅析
2013/12/02 Javascript
node.js中的fs.futimesSync方法使用说明
2014/12/17 Javascript
js代码实现点击按钮出现60秒倒计时
2021/01/28 Javascript
AngularJS实践之使用NgModelController进行数据绑定
2016/10/08 Javascript
seajs学习教程之基础篇
2016/10/20 Javascript
js处理层级数据结构的方法小结
2017/01/17 Javascript
angularjs指令之绑定策略(@、=、&amp;)
2017/04/13 Javascript
解决vue2.x中数据渲染以及vuex缓存的问题
2017/07/13 Javascript
[53:21]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-CDEC
2014/05/22 DOTA
[01:07:53]RNG vs VG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python中装饰器高级用法详解
2017/12/25 Python
python版微信跳一跳游戏辅助
2018/01/11 Python
Python实现购物车购物小程序
2018/04/18 Python
爬虫代理池Python3WebSpider源代码测试过程解析
2019/12/20 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
2020/05/17 Python
Python爬虫之Selenium警告框(弹窗)处理
2020/12/04 Python
巴西葡萄酒销售网站:Wine.com.br
2017/11/07 全球购物
办公室经理岗位职责
2014/01/01 职场文书
《鹬蚌相争》教学反思
2014/04/22 职场文书
加入学生会演讲稿
2014/04/24 职场文书
读书小明星事迹材料
2014/05/03 职场文书
企业口号大全
2014/06/12 职场文书
网络技术专业求职信
2014/07/13 职场文书
导游词欢迎词
2015/02/02 职场文书
windows11怎么查看wifi密码? win11查看wifi密码的技巧
2021/11/21 数码科技
MySQL 分区表中分区键为什么必须是主键的一部分
2022/03/17 MySQL
了解Kubernetes中的Service和Endpoint
2022/04/01 Servers