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判断当前日期是否大于某个日期的实现代码
Sep 02 Javascript
各种页面定时跳转(倒计时跳转)代码总结
Oct 24 Javascript
js实现简单计算器
Nov 22 Javascript
JS控制弹出悬浮窗口(一览画面)的实例代码
May 30 Javascript
Ionic如何创建APP项目
Jun 03 Javascript
AngularJS Bootstrap详细介绍及实例代码
Jul 28 Javascript
js实现图片上传预览原理分析
Jul 13 Javascript
Vue AST源码解析第一篇
Jul 19 Javascript
bootstrap时间控件daterangepicker使用方法及各种小bug修复
Oct 25 Javascript
简单谈谈CommonsChunkPlugin抽取公共模块
Dec 31 Javascript
vue axios数据请求get、post方法及实例详解
Sep 11 Javascript
Vue实现Layui的集成方法步骤
Apr 10 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/08/20 PHP
PHPCMS V9 添加二级导航的思路详解
2016/10/20 PHP
Thinkphp3.2实用篇之计算型验证码示例
2017/02/09 PHP
laravel批量生成假数据的方法
2019/10/09 PHP
使用正则替换变量
2007/05/05 Javascript
form中限制文本字节数js代码
2007/06/10 Javascript
jQuery 版本的文本输入框检查器Input Check
2009/07/09 Javascript
JavaScript 实现简单的倒计时弹窗DEMO附图
2014/03/05 Javascript
Javascript基础知识(一)核心基础语法与事件模型
2014/09/29 Javascript
jQuery下拉美化搜索表单效果代码分享
2015/08/25 Javascript
多功能jQuery树插件zTree实现权限列表简单实例
2016/07/12 Javascript
Angularjs中ng-repeat-start与ng-repeat-end的用法实例介绍
2016/12/31 Javascript
又一款MVVM组件 构建自己的Vue组件(2)
2017/03/13 Javascript
利用Jasmine对Angular进行单元测试的方法详解
2017/06/12 Javascript
JS使用正则表达式验证身份证号码
2017/06/23 Javascript
JavaScript获取tr td 的三种方式全面总结(推荐)
2017/08/15 Javascript
vue mounted组件的使用
2018/06/18 Javascript
微信小程序动态设置图片大小的方法
2019/11/21 Javascript
Js视频播放器插件Video.js使用方法详解
2020/02/04 Javascript
JavaScript 函数用法详解【函数定义、参数、绑定、作用域、闭包等】
2020/05/12 Javascript
pycharm 使用心得(八)如何调用另一文件中的函数
2014/06/06 Python
Python中常见的数据类型小结
2015/08/29 Python
使用Python生成随机密码的示例分享
2016/02/18 Python
Python通过future处理并发问题
2017/10/17 Python
python利用有道翻译实现&quot;语言翻译器&quot;的功能实例
2017/11/14 Python
JupyterNotebook设置Python环境的方法步骤
2019/12/03 Python
python数据类型可变不可变知识点总结
2020/03/06 Python
Pandas替换及部分替换(replace)实现流程详解
2020/10/12 Python
CSS3实现滚动条动画效果代码分享
2016/08/03 HTML / CSS
Eastbay官网:美国最大的运动鞋网络零售商
2016/07/27 全球购物
机电一体化大学生求职信
2013/11/08 职场文书
自荐书格式
2013/12/01 职场文书
九寨沟导游词
2015/02/02 职场文书
eclipse创建项目没有dynamic web的解决方法
2021/06/24 Java/Android
SQL语句多表联合查询的方法示例
2022/04/18 MySQL
vue @click.native 绑定原生点击事件
2022/04/22 Vue.js