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 相关文章推荐
Firefox+FireBug使JQuery的学习更加轻松愉快
Jan 01 Javascript
jQuery中filter(),not(),split()使用方法
Jul 06 Javascript
DLL+ ActiveX控件+WEB页面调用例子
Aug 07 Javascript
Tips 带三角可关闭的文字提示
Oct 06 Javascript
jquery实现表单验证并阻止非法提交
Jul 09 Javascript
jquery UI Datepicker时间控件的使用方法(基础版)
Nov 07 Javascript
JS组件Bootstrap实现图片轮播效果
May 16 Javascript
浅谈JavaScript中的this指针和引用知识
Aug 05 Javascript
Angular.JS判断复选框checkbox是否选中并实时显示
Nov 30 Javascript
解决OneThink中无法异步提交kindeditor文本框中修改后的内容方法
May 05 Javascript
浅谈用Webpack路径压缩图片上传尺寸获取的问题
Feb 22 Javascript
node获取客户端ip功能简单示例
Aug 24 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
PHP4在WinXP下IIS和Apache2服务器上的安装实例
2006/10/09 PHP
使用 MySQL 开始 PHP 会话
2006/12/21 PHP
采集邮箱的php代码(抓取网页中的邮箱地址)
2012/07/17 PHP
php中调用其他系统http接口的方法说明
2014/02/28 PHP
使用Composer安装Yii框架的方法
2016/03/15 PHP
ThinkPHP模板Volist标签嵌套循环输出多维数组的方法
2016/03/23 PHP
PHP封装XML和JSON格式数据接口操作示例
2019/03/06 PHP
Laravel实现搜索的时候分页并携带参数
2019/10/15 PHP
Javascript中产生固定结果的函数优化技巧
2013/01/16 Javascript
showModalDialog模态对话框的使用详解以及浏览器兼容
2014/01/11 Javascript
js实现iGoogleDivDrag模块拖动层拖动特效的方法
2015/03/04 Javascript
动态更新highcharts数据的实现方法
2016/05/28 Javascript
seajs模块之间依赖的加载以及模块的执行
2016/10/21 Javascript
原生js实现可拖动的登录框效果
2017/01/21 Javascript
canvas滤镜效果实现代码
2017/02/06 Javascript
jquery插件canvaspercent.js实现百分比圆饼效果
2017/07/18 jQuery
vue 组件使用中的一些细节点
2018/04/25 Javascript
一个简单的node.js界面实现方法
2018/06/01 Javascript
微信小程序开发之转发分享功能
2019/10/22 Javascript
微信小程序实现二维码签到考勤系统
2020/01/16 Javascript
vue学习笔记之给组件绑定原生事件操作示例
2020/02/27 Javascript
[58:12]Ti4第二日主赛事败者组 LGD vs iG 3
2014/07/21 DOTA
[02:12]2015国际邀请赛 SHOWOPEN
2015/08/05 DOTA
[01:29:17]RNG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
使用NumPy和pandas对CSV文件进行写操作的实例
2018/06/14 Python
pytorch torch.nn.AdaptiveAvgPool2d()自适应平均池化函数详解
2020/01/03 Python
经理助理岗位职责
2014/03/05 职场文书
2014年五一促销活动方案
2014/03/09 职场文书
信息技术课后反思
2014/04/27 职场文书
公共场所标语
2014/06/30 职场文书
落实八项规定专题民主生活会对照检查材料
2014/09/15 职场文书
2015年汽车销售员工作总结
2015/07/24 职场文书
就业指导讲座心得体会
2016/01/15 职场文书
python3实现无权最短路径的方法
2021/05/12 Python
mysql优化之query_cache_limit参数说明
2021/07/01 MySQL
Django + Taro 前后端分离项目实现企业微信登录功能
2022/04/07 Python