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

html5怎样在页面中加入雪花效果

发布网友 发布时间:2022-05-12 00:35

我来回答

3个回答

懂视网 时间:2022-05-12 04:57

这篇文章主要为大家详细介绍了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>

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

热心网友 时间:2022-05-12 02:05

在后台添加js特效可实现这样的效果。
js代码为:
<script language="JavaScript">
<!--
var no = 5; //雪片数目
var speed = 20; //飘动速度。(值越大越慢)
var ns4up = (document.layers) ? 1 : 0; //当前浏览器类型,如果是NS则为1
var ie4up = (document.all) ? 1 : 0; //当前浏览器类型,如果是IE则为1
var s, x, y, sn, cs;
var a, r, cx, cy;
var i, doc_width = 800, doc_height = 600;
x = new Array();
y = new Array();
r = new Array();
cx = new Array();
cy = new Array();
s = 8; //每次下落的高度,越小越平滑,但是也越慢
if (ns4up) { //以NS兼容方式
doc_width = self.innerWidth; //取页面宽度
doc_height = self.innerHeight; //取页面高度
}
else
if (ie4up) { //以IE兼容方式
doc_width = document.body.clientWidth; //取页面宽度
doc_height = document.body.clientHeight; //取页面高度
}
for (i = 0; i < no; ++ i) { //根据前面定义的雪片数目写进相应数目的层
initSnow(); //随机初始化层的坐标
if (ns4up) { //如果浏览器是NS
//用layer作为雪片(星号)的容器
document.write("<layer name=\"dot"+ i +"\" left=\"1\" ");
document.write("top=\"1\" visibility=\"show\"><font color=\"red\">");
document.write("*</font></layer>");
}
else
if (ie4up) { //如果浏览器是IE
//用div作为雪片的容器
document.write("<div id=\"dot"+ i +"\" style=\"POSITION: ");
document.write("absolute; Z-INDEX: "+ i +"; VISIBILITY: ");
document.write("visible; TOP: 15px; LEFT: 15px;\"><font color=\"red\">");
document.write("*</font></div>");
}
}
//初始化雪片,生成随机坐标
function initSnow() {
a = 6;
r[i] = 1;
sn = Math.sin(a);
cs = Math.cos(a);
cx[i] = Math.random() * doc_width + 1;
cy[i] = Math.random() * doc_height + 1;
x[i] = r[i] * sn + cx[i];
y[i] = cy[i];
}
//计算雪花位置,从新位置上出现,看起来就像是新产生的一样。
function makeSnow() {
r[i] = 1;
cx[i] = Math.random() * doc_width + 1;
cy[i] = 1;
x[i] = r[i] * sn + cx[i];
y[i] = r[i] * cs + cy[i];
}
//雪花下落的计算
function updateSnow() {
r[i] += s;
x[i] = r[i] * sn + cx[i];
y[i] = r[i] * cs + cy[i];
}
//在NS浏览器上处理雪片下落的主程序
function SnowdropNS() {
for (i = 0; i < no; ++ i) { //依次处理每片雪花
updateSnow(); //下落
if ((x[i] <= 1) || (x[i] >= (doc_width - 20)) || (y[i] >= (doc_height - 20))) { //如果超出屏幕范围
makeSnow(); //则调整雪片到新位置上
doc_width = self.innerWidth; //更新页面宽度数据
doc_height = self.innerHeight; //更新页面高度数据
}
document.layers["dot"+i].top = y[i]; //改变层的Y坐标,应用新的位置
document.layers["dot"+i].left = x[i]; //改变层的X坐标,应用新的位置
}
setTimeout("SnowdropNS()", speed);
}
//在IE浏览器上处理雪片下落的主程序
function SnowdropIE() {
for (i = 0; i < no; ++ i) { //依次处理每片雪花
updateSnow(); //下落
if ((x[i] <= 1) || (x[i] >= (doc_width - 20)) || (y[i] >= (doc_height - 20))) { //如果超出屏幕范围
makeSnow(); //则调整雪片到新位置上
doc_width = document.body.clientWidth; //更新页面宽度数据
doc_height = document.body.clientHeight; //更新页面高度数据
}
document.all["dot"+i].style.pixelTop = y[i]; //改变层的坐标,应用新的位置
document.all["dot"+i].style.pixelLeft = x[i];
}
setTimeout("SnowdropIE()", speed); //准备下一次下落过程。
}
if (ns4up) { //如果是NS
SnowdropNS(); //调用SnowdropNS使雪片下落
}
else
if (ie4up) { //如果是NS
SnowdropIE(); //调用SnowdropIE使雪片下落
}
-->
</script>
说明:可以根据自己的需求根据说明进行相应参数的修改

热心网友 时间:2022-05-12 03:23

不是非的html5才行的,js就行了,雪花就是一张图片,某些情况下可以用'****'星号代替的,我平常都是这么写的,我是干这行的
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
arrive in和arrive at 有什么区别? 磁力泵为什么可空转? 为什么不让衬氟塑料磁力泵空转?怎样提升设备稳定性? 工业软管泵 塑料磁力泵为什么不能空转 求推荐男主和女配在一起的小说? 《红衣天下》txt全集下载 检测公司检测哪些 检测公司是怎么样的 检测公司属于什么企业 什么是彗星的轨道? 山姆在中国哪些城市有 粉幽灵的功效与寓意 广告素材制作受到限额限制吗 幽灵兰的功效与作用 广告制作前期如何收集素材 准备回老家了,趁过年想给爸妈买一套房子,泸州有高端点的不? 想在泸州买套带学区、品质上乘的房,孩子要上初中了各位朋友有没有好点的? 泸州买房,城北和城西哪里更有优势? 现在泸州的房价还会降么?现在买房划不划算? 想把房子买在泸州城西新城,选怎么样的房子比较好? 泸州哪的房子住起来最有面子啊,朋友们都买房了,不想落下? 想在泸州买房子,比较看好这边未来的发展前景,有没得啥子楼盘推荐哦? 外地无房者在泸州买房需要哪些条件 过年想在泸州买房子,大家有什么推荐吗? 在泸州买房子要注意什么? 请问泸州买房子性价比高、价格也实惠、出门也比较方便一点的位置是哪里? 在泸州,买房子要注意什么? 泸州城西和城北,哪个区域买房更好? 在泸州买一套房子大概要多少钱? 优衣库429164停产了吗。 优衣库的羊毛西装夹克该怎么洗 优衣库可以代理么 优衣库衣服出门为什么会响 优衣库鸭绒衣闹上油怎么洗吃饭 不小心滴上油了怎么洗也洗不干净怎么办 如何提高足球传球的准确性训练课教案 足球短传练习怎么结合比赛场景写教案 这是什么牌子的台湾凤梨酥? 什么的方式? 常用的方式方法有4种,分别是 正确的工作方式和方法是什么 QQ音乐怎么开启流量提醒 QQ音乐开启流量提醒教程 方式是什么词语? 我们平时手机上网用的是什么流量?什么是国内流量?本地流量?国内定向流量?_百度问一问 如何通过QQ音乐手机客户端激活QQ音乐小王卡专属流量特权? 国内手机上网流量和国内流量有什么区别,国内流量怎么使用? QQ音乐的免流量跟哪开 手机国内流量指的是什么意思 手机的“语音国内流量”什么意思?怎样使用?语音流量是指拔打电话的时长吗!_百度问一问 qq音乐怎么设置用自己的流量在线听