问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何使用HTML5canvas实现雪花飘落

发布网友 发布时间:2023-07-28 21:05

我来回答

1个回答

热心网友 时间:2024-08-04 16:46


这篇文章主要为大家详细介绍了HTML5 canvas实现雪花飘落特效,效果实现引人入胜,很*真的动画效果,感兴趣的小伙伴们可以参考一下
看到网上很多展示html5雪花飞动的效果,确实非常引人入胜,我相信大家也跟我一样看着心动的同时,也很好奇,想研究下代码如何实现;虽然很多地方也能下载这些源码,不过也不知道别人制作此类动画时的思路及难点分析。
我这几天刚好学习了一下,也趁着此刻有时间从需求分析、知识点、程序编写一步步给大家解剖下,要是在各位关公面前耍大刀了,可别见笑哟。
最终效果图如下:

图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 id="mycanvas">
您的浏览器不支持canvas画布
</canvas>CSS代码:
* {
margin: 0;
padding: 0;
}
#mycanvas {
background: black;
}此时效果如如下:
注意: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;此时效果如如下:
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()函数,效果如下:

可以尝试多次刷新网页看是否会生成不同大小、位置的雪花(正常情况下是可以的),做到这里就已经接近最终效果了
注意:由于这里需要绘制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;
<span style="white-space:pre"> </span>}
}
}然后将该函数放入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,经过我们上述步骤,小伙伴们是否已经对整个过程及技术实现很清晰了。
完整代码如下(大家可以直接复制到自己项目中执行,测试下效果):
<!DOCTYPE html>
<html>

<head>
<meta charset="utf-8" />
<title></title>
<script src="js/jquery-1.8.3.min.js"></script>
<style type="text/css">
* {
margin: 0;
padding: 0;
}

#mycanvas {
background: black;
}
</style>
</head>

<body>
<canvas id="mycanvas">
您的浏览器不支持canvas画布
</canvas>
<script>
//获取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);
</script>
</body>

</html>好了,今天分享就到这里,希望对大家的学习有所帮助。
如何使用HTML5canvas实现雪花飘落

最终效果图如下: 图1一、需求分析1、圆形雪花本示例中雪花形状使用圆形2、雪花数量固定根据图1仔细观察白色雪花数量,飘落过程中,整张图的雪花数量应该是固定的,这个需求是需要通过我们观察分析所得。这与我们现实生活中看到一幅雪花满天飞的场景是一致的。3、雪花大小不一致每朵雪花它们大小各有不同,...

ai生成ppt工具有哪些?

博思AIPPT是基于ai制作PPT的智能在线工具,它提供了4种AI制作PPT的方式,包括AI生成大纲、AI直接生成PPT、文本生成PPT、AI提炼文档生成PPT,一站式集成多种AI生成PPT的方式,可满足办公用户的不同需求和使用场景。ai生成ppt工具有哪些?相比较其...

HTML5用canvas怎么实现动画效果

使用HTML5画布canvas能够快速实现简单的动画效果,基本原理如下:每隔一定时间绘制图形并且清除图形,用来模拟出一个动画过程,可以使用context.clearRect(0, 0, x, y)方法来刷新需要绘制的图形 首先是绘制图形的方法,如下:function myAnimation() {ctx.clearRect(0, 0, canvas_size_x, canvas_size_y...

如何使用html5中的canvas标签,画一个圆及一个矩形

进入DW后,选择:文件--&gt;新建 在弹出的对话框中选择文件类型为Html5 选择“创建”后,即会形成一个空白网页,选择“文件”--"保存“起名为:juxing 这个名字可以依据自己的喜好起,但最好名字与网页内容相关,以后好找,另外一个需要注意的是,最好不用汉字。我们将视图切换为”代码“视图 并将标题...

如何开发一个简单的HTML5 Canvas 小游戏

1. 创建一个Canvas对象 [javascript] view plaincopy // Create the canvas var canvas = document.createElement("canvas");var ctx = canvas.getContext("2d");canvas.width = 512;canvas.height = 480;document.body.appendChild(canvas);我们首先要做的是创建一个canvas对象。可以用JavaScript或HTM...

大学生web前端项目

1、【HTML5 canvas龙卷风动画制作】 2、【CSS 3七夕表白页面特效】 3、【csS 20行代码见证七色花动画】 4、【HTML 5敲出一个牛逼的雪景】 5、【CSS 3特效拉窗帘】 6、【HTML 5游戏项目】 7、【英雄联盟官网特效】 8、【web动画形成原理-滚动】 9、【天猫官网必用技术-獭加载】 10、【csS 3炫酷的轮播...

html5 javascript实现canvas里边多图层显示怎么弄

html5中的canvas本身的API是不存在图层概念的。要想实现实现多图层功能,必须要使用多个canvas对象,不过这些canvas对象,是在内存中的,而不是在html的元素树中。每个canvas维持一个图层就可以,然后主canvas是负责显示最后的合成的效果。js动态创建canvas对象如下:var layer1=document.createElement('canvas'...

Canvas怎么使用

canvas元素只能作为图形的容器; 因此,我们应该使用JavaScript来渲染图形我们在Canvas上绘制图形,需要首先使用文档对象模型(DOM)进行目标定位。并且,使用id属性将帮助你识别匹配的目标位置。我们来看一个canvas元素的代码&lt;canvas width="320" height="160" id="canvasExample"&gt;&lt;/canvas&gt;Canvas元素允许两个...

如何使用 HTML5 Canvas 制作水波纹效果

1、首先:html &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta charset=utf-8 /&gt; &lt;title&gt;Water drops effect&lt;/title&gt; &lt;link rel="stylesheet" href="css/main.css" type="text/css" /&gt; &lt;script src="js/vector2d.js" type="text/javascript" charset="utf-8"&gt;&lt;/script&gt; &lt;script src="js/...

如何判断浏览器是否支持HTML5 Canvas

1、首先,打开html编辑器,新建html文件,例如:index.html。2、在index.html中的&lt;body&gt;标签中,输入js代码:。try{ document.createElement("canvas").getContext("2d");('body').append('支持canvas');}catch(e){ ('body').append('不支持canvas');} 3、浏览器运行index.html页面,此时会...

如何在网页上用HTML5实现动画效果?

1、h5元素本身的位移、缩放,控制css属性即可,left、right、top、bottom,width、height,另外使用transform可以完成更复杂的变化。2、透明度属性可以完成渐隐渐现效果,切换background-image属性,background-color属性。3、在画布元素canvas中绘制,这是很多h5游戏引擎实现动画的方法,可以去学习一个h5的游戏...

canvas实现文本编辑 雪花飘落的时候 雪花飘落 雪花像什么飘落下来 每当雪花纷纷飘落 怎么拍雪花飘落 不断飘落的雪花就像什么 什么雪花从空中什么飘落下来 雪花飘落的诗句
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
新买的一个7口USB集线器,想固定在桌子侧面,不知道有什么方法?类似挂物 ... 我学校的桌子两侧都有挂钩,但是右边不能挂东西,可是我的风琴包没地方... 如何给物品开光? 今期生肖留三形,只盼二七在眼前打一生肖 只盼二七在眼前指什么生肖 一斤二两白酒什么概念 牙齿上有烟渍怎么去除 微信头像什么样子最好? 手机号码可以找到一个人的社交信息吗? 杭州众创空间扶持政策有哪些 JavaScript如何实现飘落星星特效的实例代码详解 古诗词分为两个部分,分别叫什么 古诗的上下两段怎么说 诗词上下片 黑子的篮球,青峰说教黑子球风的是赤司,为什么赤司要这么做呢? 在黑子的篮球中,赤司征十郎是作为一个什么样的存在 我孩子嘴周围长了些黄水疮,怎么办? 下巴长了黄水疮怎么办,应该怎样治疗才是比较合适的 433分能上本科吗 咸宁最好的买房地段 黄水疮和单纯疱疹如何区别?中药治疗方法类似吗? 湖南高考431分能考什么大学 下巴长的跟水泡一样的疙瘩,还流水,不流水以后就是黄色的硬块,痒... 表达朋友很心疼自己的辛苦的诗句 心疼一个人有无法照顾的诗句 你对文理科有什么认识,文生和理生应该有什么关系? 古代的文生、武生、贡生有什么不同 汪氏宗普里清邑庠文生是什么职称 请教几个关于清朝海军的问题 北洋海军的旗舰是什么 使用JQuery如何实现雪花飘落 怎么让樱花飘落秒速5CM开机自动运行 为什么人在走夜路的时候害怕。 CSS3如何实现雪花飘落的效果 怎样能缓解压力呢? 用什么方式可以放松自己的压力 一千是名词还是形容词还是动词 杰字繁体字多少笔? 保家仙会害自己家人吗 湘潭大学双一流学科 fgo隐匿猎手在哪刷 阿米尼48v电动车应该配多少AH充电器 翻译“泉而茗者,﹡而歌者,红装而蹇者,亦时时有。” 英德人均gdp 脚母指怎么突然又胀又疼,整个指甲都积血? 打篮球后,脚趾下面出现大面积积血怎么办,怎么去除积血? 脚趾母低积血怎么办? 抖音如何解除禁止播放 如何使用PHP和MySQL创建个性的网站分页 Php文章上下页分页如何实现