css雪花飘落效果,雪花飘落js特效代码

  css雪花飘落效果,雪花飘落js特效代码

  在网上看到很多展示html5雪花飞舞的效果真的很迷人。我相信每个人都和我一样兴奋,好奇研究如何实现代码。虽然很多地方都可以下载这些源代码,但是我不知道别人在制作这类动画时的想法和难处。

  这几天刚学习,趁着这一刻,从需求分析,知识点,编程,一步一步的解剖。如果你在关公面前玩大刀,不要笑。

  最终效果图如下:

  图1

  一、需求分析

  1.圆形雪花

  在本例中,雪花形状使用了一个圆形。

  2.雪花的数量是固定的。

  根据图1,仔细观察白色雪花的数量。在下落过程中,整个图形中雪花的数量应该是固定的。这个需求需要通过我们的观察和分析来获得。这和现实生活中我们看到一片雪花漫天飞舞的场景是一致的。

  3.雪花大小不一样。

  每片雪花都有自己的大小,也就是说雪花的半径是随机的。这也和现实生活中我们看到一片雪花漫天飞舞的场景相吻合。

  4.雪花在移动。

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

  二、知识点

  1.用Html5 Canvas JavaScript画一个圆3354形成圆形雪花。

  在Html5中,需要用Canvas和JavaScript画一个圆,形成一个圆形的雪花——arc (x,y,r,start,stop);

  2.生成不同半径和坐标的随机数圆形雪花。

  在这个例子中,第一次加载网页时,需要生成一定数量的不同半径和位置的雪花,所以半径和坐标都是随机数;在落雪的过程中,其半径不变,坐标在一定范围内变化,所以此时的坐标也是随机数——Math.random()

  三、程序编写

  1、准备工作

  放一块帆布画布,全身背景色设置为黑色。

  HTML代码:

  XML/HTML代码将内容复制到剪贴板canvasid=mycanvas 您的浏览器不支持画布/画布CSS代码:

  代码将内容复制到剪贴板* { margin:0;填充:0;} #mycanvas{背景:黑色;}此时的效果如下:

  注意:canvas默认有一个初始高度和宽度,不用担心。

  2、画布满屏显示

  JavaScript代码如下:

  代码将内容复制到剪贴板//Get my canvas canvas varcan=document . getelementbyid( my canvas );var CTX=can . get context( 2d );//画布宽度var wid=window . inner width;//画布高度var hei=window . inner height;can.width=widcan.height=hei这时,效果如下:

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

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

  当雪花生成时,每个雪花都有不同的半径和位置。我们把每一片雪花看成一个对象,这个对象的属性包括:半径和坐标(x,y)。那么一个雪花对象可以写成varsnowobject={x: 1,y: 10,r: 5},表示一个坐标为(1,10),半径为5的圆形雪花。在这个例子中,由于半径和坐标是随机数,所以使用Math.random()分别生成100片雪花的半径和坐标(x,y);

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

  JavaScript代码如下:

  代码将内容复制到剪贴板//雪花数量varsnow=100//雪花坐标,半径vararr=[];//保存每个圆的坐标和半径为(vari=0;isnowI){ arr . push({ x:math . random()* wid,y:Math.random()*hei,r:math . random()* 10 1 })}4、绘制雪花

  上面,我们已经生成了100片雪花的半径和坐标(x,y),下面,我们用圆形使用画布绘制雪花(这里是画圆)。这里,我们定义一个函数。

  JavaScript代码如下:

  代码将内容复制到剪贴板//Draw snow函数Draw snow(){ CTX . fill style= white ;CTX . begin path();for(vari=0;isnowI){ varp=arr[I];ctx.moveTo(p.x,p . y);ctx.arc(p.x,p.y,p.r,0,2 *数学。圆周率,假);} CTX . fill();CTX . close path();然后调用DrawSnow()函数,效果如下:

  你可以试着刷新几次网页,看看会不会产生不同大小和位置的雪花(正常情况下是有可能的),最后的效果接近这里。

  注意:由于这里需要画100个圆,所以每画一个圆就重新定义一次画图起点坐标,即:ctx.moveTo(p.x,p . y);否则会有奇怪的效果。不信你可以试试。

  5、雪花飘动

  我们在上面画了100片雪花。遗憾的是,我们只能通过刷新网页来看到变化的效果,而我们需要实现的是雪花不停的移动。

  首先我们需要借助setInterval函数不断重画雪花,其中间隔为50毫秒:setInterval(DrawSnow,50);

  同时,每片雪花的坐标(x,y)需要不断变化(在一定范围内)。这里的雪花是从左上往右下落下的,所以每片雪花的坐标值都在不断增加。然后,我们用一个函数snowflake()来定义雪花漂移的规则。

  功能代码如下:

  代码将内容复制到剪贴板//雪花飘落函数snow den(){ for(vari=0;isnowI){ varp=arr[I];p . y=math . random()* 2 1;if(p . yhei){ p . y=0;} p . x=math . random()* 2 1;if(p . xwid){ p . x=0;span style= white-space:pre /span } } }

  然后把这个函数放到DrawSnow()中执行。注意:每隔50毫重绘雪花时我们要擦除画布,所以必须在DrawSnow()函数体前面执行clearRect()函数,即:ctx.clearRect(0,0,wid,hei);

  此时,DrawSnow函数定义如下:

  代码将内容复制到剪贴板//Draw snow函数drawsnow () {ctx.clearrect (0,0,WID,HEI);ctx.fillStyle= whiteCTX . begin path();for(vari=0;isnowI){ varp=arr[I];ctx.moveTo(p.x,p . y);ctx.arc(p.x,p.y,p.r,0,2 *数学。圆周率,假);} CTX . fill();降雪();CTX . close path();}最后执行setInterval(DrawSnow,50);

  好了,经过以上步骤,小伙伴们都清楚整个流程和技术实现了吗?

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

  XML/HTML代码复制内容到剪贴板!doctype html html head meta charset= utf-8 /title/title脚本RC= js/jquery-1。8 .3 .量滴js /script style type= text/CSS * { margin:0;填充:0;} #我的画布{背景:黑色;}/style/head body canvasid=我的画布您的浏览器不支持帆布画布/画布脚本//获取我的画布画布varcan=文档。getelementbyid(我的画布);var CTX=can。获取上下文(“2d”);//画布宽度var wid=窗口。内部宽度;//画布高度var hei=窗口。内部高度;can.width=widcan.height=hei//雪花数目varsnow=100//雪花坐标、半径vararr=[];//保存各圆坐标及半径for(vari=0;isnowI){ arr。推({ x:数学。random()* wid,y:Math.random()*hei,r:Math.random()*10 1 }) } //画雪花functionDrawSnow(){ CTX。clear rect(0,0,wid,hei);ctx.fillStyle= whiteCTX。begin path();for(vari=0;is nowi){ varp=arr[I];ctx.moveTo(p.x,p . y);ctx.arc(p.x,p.y,p.r,0,2 *数学。圆周率,假);} CTX。fill();降雪();CTX。关闭路径();} //雪花飘落函数snow den(){ for(vari=0;is nowi){ varp=arr[I];数学。random()* 2 ^ 1;if(p . yhei){ p . y=0;} p . x=数学。random()* 2 ^ 1;if(p . xwid){ p . x=0;} } } setInterval(DrawSnow,50);/script /body /html好了,今天分享就到这里,希望对大家的学习有所帮助。

  原文:http://www。cnblogs。com/唐一锋/p/5253629.html

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: