手机html5雪花飘落,如何使用HTML5canvas实现雪花飘落

5268f80b9b1e01f982625ef6fac83ca1.png

这篇文章主要为大家详细介绍了HTML5 canvas实现雪花飘落特效,效果实现引人入胜,很逼真的动画效果,感兴趣的小伙伴们可以参考一下

看到网上很多展示html5雪花飞动的效果,确实非常引人入胜,我相信大家也跟我一样看着心动的同时,也很好奇,想研究下代码如何实现;虽然很多地方也能下载这些源码,不过也不知道别人制作此类动画时的思路及难点分析。

我这几天刚好学习了一下,也趁着此刻有时间从需求分析、知识点、程序编写一步步给大家解剖下,要是在各位关公面前耍大刀了,可别见笑哟。

最终效果图如下:

1c6aec857a2684a8da082f842109db2c.gif

图1

一、需求分析

1、圆形雪花

本示例中雪花形状使用圆形

2、雪花数量固定

根据图1仔细观察白色雪花数量,飘落过程中,整张图的雪花数量应该是固定的,这个需求是需要通过我们观察分析所得。这与我们现实生活中看到一幅雪花满天飞的场景是一致的。

3、雪花大小不一致

每朵雪花它们大小各有不同,也就意味着雪花的半径是随机的。这与我们现实生活中看到一幅雪花满天飞的场景也是一致的。

4、雪花位置在移动

雪花飘落,自然它们的位置也在移动。

二、知识点

1、使用Html5 Canvas+JavaScript画圆——构成圆形雪花

在Html5中,需要使用Canvas同时借助JavaScript画圆,以构成圆形雪花——arc(x,y,r,start,stop);

2、随机数—产生不同半径、坐标的圆形雪花

本示例中,网页第一次加载时,需要生成一定数量的不同半径及位置的雪花,故半径、坐标为随机数;雪花在飘落过程中,其半径不变,坐标在一定幅度内变化,故此时坐标也为随机数——Math.random()

三、程序编写

1、准备工作

放一个画布canvas,并且设置整个body背景色为黑色

HTML代码:

您的浏览器不支持canvas画布

CSS代码:* {

margin: 0;

padding: 0;

}

#mycanvas {

background: black;

}

此时效果如如下:

d56a255cd984d219c81782cb2040371c.png

注意:canvas默认是有一个初始化高度和宽度的,所以不用去纠结

2、画布满屏显示

JavaScript代码如下://获取mycanvas画布

var can = document.getElementById("mycanvas");

var ctx = can.getContext("2d");

//画布宽度

var wid = window.innerWidth;

//画布高度

var hei = window.innerHeight;

can.width=wid;

can.height=hei;

此时效果如如下:

8085fb494431b16d4dfa875daf73d979.png

3、初始化生成固定数量的雪花

根据我们上述需求分析及知识点解读,首先雪花的数量是固定的,所以我们需要定义一个变量var snow = 100;这里假设雪花数量为100,;

生成雪花的时候,每个雪花半径、位置都不同,我们把每个雪花当做一个对象,那么这个对象的属性就包含:半径、坐标(X、Y),那么一个雪花对象可以写成var snowOject={x:1,y:10,r:5},这里就代表一个坐标为(1,10)半径为5的圆形雪花;本示例中由于半径和坐标都为随机数,故使用Math.random()分别为100个雪花生成半径、坐标(X、Y);

那我们这里是100个雪花,所以为了方便后面操作,就用一个数组保存这100个雪花对象。

JavaScript代码如下://雪花数目

var snow = 100;

//雪花坐标、半径

var arr = []; //保存各圆坐标及半径

for (var i = 0; i < snow; i++) {

arr.push({

x: Math.random() * wid,

y: Math.random() * hei,

r: Math.random() * 10 + 1

})

}

4、绘制雪花

上面我们已经将100个雪花半径、坐标(X、Y)生成,下面就是循环使用canvas画出雪花了(这里就是画圆),这里定义一个函数

JavaScript代码如下://画雪花

function DrawSnow() {

ctx.fillStyle="white";

ctx.beginPath();

for (var i = 0; i < snow; i++) {

var p = arr[i];

ctx.moveTo(p.x,p.y);

ctx.arc(p.x,p.y,p.r,0,2*Math.PI,false);

}

ctx.fill();

ctx.closePath();

然后调用 DrawSnow()函数,效果如下:

73ba06f0e6e390092372f96bf75e8d39.png

可以尝试多次刷新网页看是否会生成不同大小、位置的雪花(正常情况下是可以的),做到这里就已经接近最终效果了

注意:由于这里需要绘制100个圆,所以每当画一个圆时重新定义绘制开始坐标即:ctx.moveTo(p.x,p.y);否则会出现异样效果,不信可以试试呀

5、雪花飘动

上面我们已经画出100个雪花,可惜只能依靠刷新网页才能看到变化效果,但是我们需要实现的是雪花不停的移动位置。

首先我们需要借助setInterval函数不停的重画雪花,这里间隔时间为50毫秒:setInterval(DrawSnow,50);

同时每一朵雪花的坐标(X、Y)需要不停的改变(在一定幅度内),我们这里的雪花是从左上方飘落到右下方,所以每朵X、Y坐标值都在不停的增大,那我们用一个函数SnowFall()定义雪花飘过规则

该函数代码如下://雪花飘落

function SnowFall() {

for (var i = 0; i < snow; i++) {

var p = arr[i];

p.y += Math.random() * 2 + 1;

if (p.y > hei) {

p.y = 0;

}

p.x += Math.random() * 2 + 1;

if (p.x > wid) {

p.x = 0;

}

}

}

然后将该函数放入DrawSnow()执行,注意:我们每隔50毫毛重画雪花,必须擦除画布,所以DrawSnow()函数体内必须在前面执行clearRect()函数,即:ctx.clearRect(0, 0, wid, hei);

此时DrawSnow函数定义如下://画雪花

function DrawSnow() {

ctx.clearRect(0, 0, wid, hei);

ctx.fillStyle = "white";

ctx.beginPath();

for (var i = 0; i < snow; i++) {

var p = arr[i];

ctx.moveTo(p.x, p.y);

ctx.arc(p.x, p.y, p.r, 0, 2 * Math.PI, false);

}

ctx.fill();

SnowFall();

ctx.closePath();

}

最后执行setInterval(DrawSnow, 50);

OK,经过我们上述步骤,小伙伴们是否已经对整个过程及技术实现很清晰了。

完整代码如下(大家可以直接复制到自己项目中执行,测试下效果):

* {

margin: 0;

padding: 0;

}

#mycanvas {

background: black;

}

您的浏览器不支持canvas画布

//获取mycanvas画布

var can = document.getElementById("mycanvas");

var ctx = can.getContext("2d");

//画布宽度

var wid = window.innerWidth;

//画布高度

var hei = window.innerHeight;

can.width = wid;

can.height = hei;

//雪花数目

var snow = 100;

//雪花坐标、半径

var arr = []; //保存各圆坐标及半径

for (var i = 0; i < snow; i++) {

arr.push({

x: Math.random() * wid,

y: Math.random() * hei,

r: Math.random() * 10 + 1

})

}

//画雪花

function DrawSnow() {

ctx.clearRect(0, 0, wid, hei);

ctx.fillStyle = "white";

ctx.beginPath();

for (var i = 0; i < snow; i++) {

var p = arr[i];

ctx.moveTo(p.x, p.y);

ctx.arc(p.x, p.y, p.r, 0, 2 * Math.PI, false);

}

ctx.fill();

SnowFall();

ctx.closePath();

}

//雪花飘落

function SnowFall() {

for (var i = 0; i < snow; i++) {

var p = arr[i];

p.y += Math.random() * 2 + 1;

if (p.y > hei) {

p.y = 0;

}

p.x += Math.random() * 2 + 1;

if (p.x > wid) {

p.x = 0;

}

}

}

setInterval(DrawSnow, 50);

好了,今天分享就到这里,希望对大家的学习有所帮助。

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

如何在canvas里面基于随机点绘制一个多边形

用HTML5

Canvas来绘制三角形和矩形等多边形的方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

灰度调节_网关实现灰度发布

一、背景互联网产品开发有个非常特别的地方&#xff0c;就是不停的升级&#xff0c;升级&#xff0c;再升级。采用敏捷开发的方式&#xff0c;基本上保持每周或者每两周一次的发布频率&#xff0c;系统升级总是伴随着各种风险&#xff0c;新旧版本兼容的风险&#xff0c;用户使…

string类的erase函数属于stl吗_探索STL容器:vector

用了这么久的 vector &#xff0c;今天终于有时间来看下STL的实现源码了&#xff0c;开心?~最近几个月在刷 leetcode &#xff0c;用的较多的数据结构就是STL里面的 vector 了&#xff0c;相比较于直接的 array 数组&#xff0c;它具备了灵活地根据需求去分配管理内存&#xf…

泰森怎么会输给道格拉斯_泰森24岁就被击败,如果能像他学习巅峰时期至少能延长三年...

一个职业拳击手的运动生涯长短&#xff0c;除了与自身的打法风格有关外&#xff0c;最重要的就是自律&#xff0c;有很多拳手自身天赋极高&#xff0c;但当他成名之后&#xff0c;随着金钱和荣誉的到来往往无法把持自己&#xff0c;最终走向衰退。我们都知道&#xff0c;拳王迈…

数字加密c语言程序_国外程序员整理的 C++ 资源大全

喜欢的话可以收藏转发加关注摘要&#xff1a;C是在C语言的基础上开发的一种集面向对象编程、泛型编程和过程化编程于一体的编程语言。应用较为广泛&#xff0c;是一种静态数据类型检查的&#xff0c;支持多重编程的通用程序设计语言。关于 C 框架、库和资源的一些汇总列表&…

linux操作命令 mongo_Linux安装mongodb总结(仅学习)

原链接&#xff1a;Linux安装mongodb总结 - Lovebugs.cn - 博客园由于自己的博客上线部署时需要用到mongodb来存储图片文件&#xff0c;所以先在本地电脑上安装了mongodb做测试&#xff0c;由于之前没接触过mongodb&#xff0c;所以安装过程中遇到了各种小问题&#xff0c;折腾…

计算机二级必备快捷键知识,计算机二级考试中的一些注意事项️

原标题&#xff1a;计算机二级考试中的一些注意事项️科教武汉 【计算机二级考试中的一些注意事项️】1、要合理安排做题时间可以先通过观察整个题目的题形&#xff0c;判断整个试卷的难点&#xff0c;通过观察题型然后确定自己的应对策。选择题建议用时15-20分钟为好。自己要有…

vba 自定义function返回值_用vba解决excel如何求前面连续为0的个数

领导布置了任务&#xff0c;要求每天统计当月的发展量&#xff0c;并且统计有多少业务员最多连续多少天发展为0的情况&#xff0c;统计的表格是这样的。用几行简单的VBA语言就能解决这个问题首先打开vba编辑窗口&#xff0c;点击开发工具——visual basic(如果没有这个菜单&…

禁用计算机组策略和管理,计算机正在使用时,禁用或关闭组策略刷新 | MOS86

点击此处修复Windows错误并提高系统性能Group Policy(Windows 2000中引入的管理工具)可以确定组织中的用户和计算机的程序&#xff0c;网络资源和操作系统的运行方式。组策略可帮助用户通过在Windows Windows注册表中进行修改来为活动对象添加策略。通常&#xff0c;默认情况下…

怎么捡自己空投_使命召唤手游空投怎么快速找到?使命召唤手游快速找到空投技巧...

使命召唤手游怎么快速寻找空投&#xff1f;空投里面有高级武器跟护甲还有补给品&#xff0c;拿到空投你的装备就会比别人高几个档次。高手拿到空投后吃鸡概率大大提高。下面就为大家详细的介绍一下如何让你快速的找到空投。首先刚开始游戏的时候是不会出现空投的&#xff0c;一…

ubuntu rpm安装_为什么说Ubuntu是一个值得尊敬的Linux发行版

Ubuntu用了好长时间了&#xff0c;最早接触的是RedHat&#xff0c;个人使用体验并不好&#xff0c;当时一直在想&#xff0c;为什么就没有一个更好用的Linux操作系统呢&#xff1f;别万年不变的Windows不行吗&#xff1f;&#xff08;当时作为一个穷学生党&#xff0c;完全不想…

linux怎样自动检查link文件_怎样理解和识别 Linux 中的文件类型 | Linux 中国

众所周知&#xff0c;在 Linux 中一切皆为文件&#xff0c;包括硬盘和显卡等。在 Linux 中导航时&#xff0c;大部分的文件都是普通文件和目录文件。但是也有其他的类型&#xff0c;对应于 5 类不同的作用。因此&#xff0c;理解 Linux 中的文件类型在许多方面都是非常重要的。…

c++ map底层_深入浅出Redisredis底层数据结构(上)

来源:http://t.cn/AigEOwRE相信使用过Redis 的各位同学都很清楚&#xff0c;Redis 是一个基于键值对(key-value)的分布式存储系统&#xff0c;与Memcached类似&#xff0c;却优于Memcached的一个高性能的key-value数据库。在《Redis设计与实现》这样描述&#xff1a;Redis 数据…

绝对布局优势_前瞻布局+尖端科技+雄厚资金 恒大解锁造车的“正确姿势”

新能源汽车行业风起云涌&#xff0c;在造车新势力们交相厮杀之时&#xff0c;恒大闪电般完成“新能源车全产业链布局”&#xff0c;占据了绝对先发优势。先人一步驶入快车道的恒大并未止步于此&#xff0c;5月30日&#xff0c;恒大又宣布拿下英国顶级轮毂电机企业protean&#…

山东省计算机考试无法报名,山东省2017年9月全国计算机等级考试报名事项公告...

根据教育部考试中心《关于做好2017年全国计算机等级考试工作的通知》(教试中心函〔2016〕237号)和《关于做好2017年9月全国计算机等级考试报名工作的通知》(鲁招考[2017]67号)要求&#xff0c;现将2017年9月我省全国计算机等级考试报名有关事项公告如下&#xff1a;一、 考试科…

laravel redis_thinkphp+redis实现秒杀,缓存等功能

秒杀是商城常见功能 phpredis是最常见的秒杀功能1&#xff0c;安装redis&#xff0c;根据自己的php版本安装对应的redis扩展首先查看phpinfo();php环境信息2&#xff0c;下载redishttps://windows.php.net/downloads/pecl/snaps/redis/ https://windows.php.net/downloads/pecl…

freemarker ftl模板_效率提升百分之四十,AS模板也太好用了吧

点击蓝字 轻松关注CV 工程师你好&#xff0c;以下内容会让你感觉到不适&#xff0c;慎入&#xff01;在平时的开发工作中&#xff0c;我们经常将一个地方的代码&#xff0c;复制粘贴到另外一个地方&#xff0c;俗称搬砖&#xff0c;搬砖搬多了&#xff0c;作为一个资深的挨踢民…

python for循环连续输入五个成绩判断等级_Python基础(1)——输入输出/循环/条件判断/基本数据类型...

一、编程语言 1、 编译型语言&#xff1a;先编译&#xff0c;再执行 &#xff08;先编译成二进制&#xff09; 举例&#xff1a;英文书翻译成中文再看 C、C、C# 2、解释型语言&#xff1a;一边执行一边编译 举例&#xff1a;英文书找个翻译&#xff0c;它翻译一行你听一行 php、…

笔记本计算机无法开机怎么办,笔记本开机没反应,教您笔记本电脑开不了机怎么处理...

笔记本电脑使用的时间长了&#xff0c;都是会出现一些小故障&#xff0c;大毛病什么的&#xff0c;比如说像开机后&#xff0c;电源指示灯亮&#xff0c;但是电脑的显示器屏就是没有反应。这个问题让用户慌了神&#xff0c;为此&#xff0c;那笔记本电脑开不了机怎么解决&#…

离群点检测方法_干货 :时间序列异常检测

异常检测(Anomaly detection)是目前时序数据分析最成熟的应用之一,定义是从正常的时间序列中识别不正常的事件或行为的过程。有效的异常检测被广泛用于现实世界的很多领域,例如量化交易,网络安全检测、自动驾驶汽车和大型工业设备的日常维护。以在轨航天器为例,由于航天器昂…

centos6安装mysql并远程连接_MySQL5.7数据库安装与远程连接

系统&#xff1a;Redhat Linux 7.7MySQL版本&#xff1a;5.71. MySQL下载o 登录网站&#xff1a;https://dev.mysql.com/downloads/mysql/o 选择合适版本与系统Select version&#xff1a;5.7.31Select operating system&#xff1a;Red Hat Enterprise LinuxSelect OS Version…