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 相关文章推荐
JavaScript函数、方法、对象代码
Oct 29 Javascript
JS上传图片前的限制包括(jpg jpg gif及大小高宽)等
Dec 19 Javascript
window.onload追加函数使用示例
Mar 03 Javascript
javascript图片切换综合实例(循环切换、顺序切换)
Jan 13 Javascript
JS+HTML5手机开发之滚动和惯性缓动实现方法分析
Jun 12 Javascript
Node.js包管理器Yarn的入门介绍与安装
Oct 17 Javascript
JavaScript实现反转字符串的方法详解
Apr 27 Javascript
VUE饿了么树形控件添加增删改功能的示例代码
Oct 17 Javascript
原生javascript AJAX 三级联动的实现代码
May 04 Javascript
JavaScript实现预览本地上传图片功能完整示例
Mar 08 Javascript
对layer弹出框中icon数字参数的说明介绍
Sep 04 Javascript
JS中this的4种绑定规则详解
Feb 04 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导出oracle库的php代码
2009/04/20 PHP
深入PHP中的HashTable结构详解
2013/06/13 PHP
phpQuery占用内存过多的处理方法
2013/11/13 PHP
php微信开发之批量生成带参数的二维码
2016/06/26 PHP
thinkPHP简单实现多个子查询语句的方法
2016/12/05 PHP
jQuery.fn和jQuery.prototype区别介绍
2013/10/05 Javascript
jQuery实现级联菜单效果(仿淘宝首页菜单动画)
2014/04/10 Javascript
javascript实现在网页中运行本地程序的方法
2016/02/03 Javascript
Javascript自定义事件详解
2017/01/13 Javascript
Vue指令的钩子函数使用方法
2017/03/20 Javascript
在NPM发布自己造的轮子的方法步骤
2019/03/09 Javascript
jQuery中使用validate插件校验表单功能
2019/05/24 jQuery
微信小程序上传图片并等比列压缩到指定大小的实例代码
2019/10/24 Javascript
[03:40]DOTA2亚洲邀请赛小组赛第二日 赛事回顾
2015/01/31 DOTA
讲解Python中if语句的嵌套用法
2015/05/14 Python
在Django的URLconf中使用命名组的方法
2015/07/18 Python
Python利用ElementTree模块处理XML的方法详解
2017/08/31 Python
对numpy中向量式三目运算符详解
2018/10/31 Python
Django ModelForm组件使用方法详解
2019/07/23 Python
对Django url的几种使用方式详解
2019/08/06 Python
ORM Django 终端打印 SQL 语句实现解析
2019/08/09 Python
pygame库实现俄罗斯方块小游戏
2019/10/29 Python
如何选择使用结构还是类
2014/05/30 面试题
建筑专业毕业生推荐信
2013/11/21 职场文书
员工年终演讲稿
2014/01/03 职场文书
母婴店促销方案
2014/03/05 职场文书
幼儿园安全责任书
2014/04/14 职场文书
常务副县长“三严三实”对照检查材料思想汇报
2014/10/05 职场文书
党的群众路线教育实践活动个人对照检查材料(乡镇)
2014/11/05 职场文书
出差报告范文
2014/11/06 职场文书
2014年网络管理员工作总结
2014/12/01 职场文书
2015年出纳工作总结与计划
2015/05/18 职场文书
对学校的意见和建议
2015/06/04 职场文书
Go语言带缓冲的通道实现
2021/04/26 Golang
分享3个非常实用的 Python 模块
2022/03/03 Python
Java完整实现记事本代码
2022/06/16 Java/Android