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 相关文章推荐
js几个不错的函数 $$()
Oct 09 Javascript
jQuery循环滚动新闻列表示例代码
Jun 17 Javascript
浅谈JS闭包中的循环绑定处理程序
Nov 09 Javascript
JS获取网页图片name属性的方法
Apr 01 Javascript
JavaScript返回网页中锚点数目的方法
Apr 03 Javascript
JavaScript随机打乱数组顺序之随机洗牌算法
Aug 02 Javascript
Google 地图控件集详解及实例代码
Aug 06 Javascript
深入理解javascript中concat方法
Dec 12 Javascript
使用AngularJS 跨站请求如何解决jsonp请求问题
Jan 16 Javascript
Windows下Node.js安装及环境配置方法
Sep 18 Javascript
web前端vue之CSS过渡效果示例
Jan 10 Javascript
关于redux-saga中take使用方法详解
Feb 27 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 smarty模版引擎中的缓存应用
2009/12/02 PHP
ThinkPHP 表单自动验证运用示例
2014/10/13 PHP
PHP使用gmdate实现将一个UNIX 时间格式化成GMT文本的方法
2015/03/19 PHP
深入解析PHP的Laravel框架中的event事件操作
2016/03/21 PHP
php下载文件,添加响应头的简单实例
2016/09/22 PHP
PHP+redis实现微博的拉模型案例详解
2019/07/10 PHP
javascript 装载iframe子页面,自适应高度
2009/03/20 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
2010/09/06 Javascript
cookie在javascript中的使用技巧以及隐私在服务器端的设置
2012/12/03 Javascript
js动态改变select选择变更option的index值示例
2014/07/10 Javascript
原生javascript实现获取指定元素下所有后代元素的方法
2014/10/28 Javascript
jQuery中;function($,undefined) 前面的分号的用处
2014/12/17 Javascript
node.js操作mysql(增删改查)
2015/07/24 Javascript
AngularJS基础教程之简单介绍
2015/09/27 Javascript
jQuery实时显示鼠标指针位置和键盘ASCII码
2016/03/28 Javascript
VUE.js实现动态设置输入框disabled属性
2019/10/28 Javascript
Vue项目利用axios请求接口下载excel
2020/11/17 Vue.js
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python检测一个对象是否为字符串类的方法
2015/05/21 Python
Python DataFrame.groupby()聚合函数,分组级运算
2018/09/18 Python
NLTK 3.2.4 环境搭建教程
2018/09/19 Python
详解Python下Flask-ApScheduler快速指南
2018/11/04 Python
对Xpath 获取子标签下所有文本的方法详解
2019/01/02 Python
python获取引用对象的个数方式
2019/12/20 Python
jupyter notebook 添加kernel permission denied的操作
2020/04/21 Python
Python调用高德API实现批量地址转经纬度并写入表格的功能
2021/01/12 Python
css3编写浏览器背景渐变背景色的方法
2018/03/05 HTML / CSS
美国巧克力喷泉品牌:Sephra
2019/05/05 全球购物
Europcar意大利:汽车租赁
2019/07/07 全球购物
企业党员一句话承诺
2014/05/30 职场文书
建筑工地质量标语
2014/06/12 职场文书
个人批评与自我批评
2014/10/15 职场文书
2015年暑期实践报告范文
2015/07/13 职场文书
2015年度个人工作总结报告
2015/10/24 职场文书
2019个人工作态度自我评价
2019/04/24 职场文书
导游词之太原天龙山
2020/01/02 职场文书