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 相关文章推荐
如何做到打开一个页面,过几分钟自动转到另一页面
Apr 20 Javascript
使用JavaScript switch case 另类写法
Mar 14 Javascript
js实现的点击数量加一可操作数据库
May 09 Javascript
简述Jquery与DOM对象
Jul 10 Javascript
JavaScript设置、获取、清除单值和多值cookie的方法
Nov 17 Javascript
jQuery计算文本框字数及限制文本框字数的方法
Mar 01 Javascript
深入理解JS函数的参数(arguments)的使用
May 28 Javascript
JS实现的样式切换功能tableCSS实例
Dec 30 Javascript
jQuery中map函数的两种方式
Apr 07 jQuery
JavaScript实现选中文字提示新浪微博分享效果
Jun 15 Javascript
实现两个文本框同时输入的实例
Sep 25 Javascript
JSON stringify方法原理及实例解析
Oct 23 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
Laravel5.1框架注册中间件的三种场景详解
2019/07/09 PHP
实现laravel 插入操作日志到数据库的方法
2019/10/11 PHP
基于PHP实现堆排序原理及实例详解
2020/06/19 PHP
nodejs中实现sleep功能实例
2015/03/24 NodeJs
Jquery实现顶部弹出框特效
2015/08/08 Javascript
JavaScript实现的Tween算法及缓冲特效实例代码
2015/11/03 Javascript
js上传图片预览的实现方法
2017/05/09 Javascript
详解Vue用axios发送post请求自动set cookie
2017/05/10 Javascript
vue+webpack 打包文件 404 页面空白的解决方法
2018/02/28 Javascript
原生JS实现DOM加载完成马上执行JS代码的方法
2018/09/07 Javascript
Vue 全家桶实现移动端酷狗音乐功能
2018/11/16 Javascript
Angular PWA使用的Demo示例
2019/01/31 Javascript
vue封装swiper代码实例解析
2019/10/08 Javascript
React生命周期原理与用法踩坑笔记
2020/04/28 Javascript
Javascript call及apply应用场景及实例
2020/08/26 Javascript
JavaScript交换变量常用4种方法解析
2020/09/02 Javascript
[45:56]Ti4正赛第一天 VG vs NEWBEE 3
2014/07/19 DOTA
Python判断文件和文件夹是否存在的方法
2015/05/21 Python
学习python之编写简单乘法口诀表实现代码
2016/02/27 Python
python实现多线程的两种方式
2016/05/22 Python
在python环境下运用kafka对数据进行实时传输的方法
2018/12/27 Python
python实现飞机大战游戏(pygame版)
2020/10/26 Python
python进行参数传递的方法
2020/05/12 Python
8种常用的Python工具
2020/08/05 Python
收集的22款给力的HTML5和CSS3帮助工具
2012/09/14 HTML / CSS
C# Debug和Testing相关面试题
2015/10/25 面试题
中专毕业自我鉴定
2013/10/16 职场文书
酒店保洁主管岗位职责
2013/11/28 职场文书
校园公益广告语
2014/03/13 职场文书
农民工工资支付承诺函
2014/03/31 职场文书
火箭队口号
2014/06/18 职场文书
三问三解心得体会
2014/09/05 职场文书
2015年教师节慰问信
2015/03/23 职场文书
消费者理赔投诉书
2015/07/02 职场文书
学雷锋广播稿大全
2015/08/19 职场文书
解决 Redis 秒杀超卖场景的高并发
2022/04/12 Redis