亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識(shí)庫 > HTML5 canvas實(shí)現(xiàn)雪花飄落特效

HTML5 canvas實(shí)現(xiàn)雪花飄落特效

熱門標(biāo)簽:濟(jì)南辦理400電話 鶴壁手機(jī)自動(dòng)外呼系統(tǒng)怎么安裝 跟電銷機(jī)器人做同事 漳州人工外呼系統(tǒng)排名 中紳電銷智能機(jī)器人 鄭州電銷外呼系統(tǒng)違法嗎 農(nóng)村住宅地圖標(biāo)注 ai電銷機(jī)器人連接網(wǎng)關(guān) 威海營銷外呼系統(tǒng)招商

看到網(wǎng)上很多展示html5雪花飛動(dòng)的效果,確實(shí)非常引人入勝,我相信大家也跟我一樣看著心動(dòng)的同時(shí),也很好奇,想研究下代碼如何實(shí)現(xiàn);雖然很多地方也能下載這些源碼,不過也不知道別人制作此類動(dòng)畫時(shí)的思路及難點(diǎn)分析。

我這幾天剛好學(xué)習(xí)了一下,也趁著此刻有時(shí)間從需求分析、知識(shí)點(diǎn)、程序編寫一步步給大家解剖下,要是在各位關(guān)公面前耍大刀了,可別見笑喲。

最終效果圖如下:

 

圖1

一、需求分析

1、圓形雪花

本示例中雪花形狀使用圓形

2、雪花數(shù)量固定

根據(jù)圖1仔細(xì)觀察白色雪花數(shù)量,飄落過程中,整張圖的雪花數(shù)量應(yīng)該是固定的,這個(gè)需求是需要通過我們觀察分析所得。這與我們現(xiàn)實(shí)生活中看到一幅雪花滿天飛的場(chǎng)景是一致的。

3、雪花大小不一致

每朵雪花它們大小各有不同,也就意味著雪花的半徑是隨機(jī)的。這與我們現(xiàn)實(shí)生活中看到一幅雪花滿天飛的場(chǎng)景也是一致的。

4、雪花位置在移動(dòng)

雪花飄落,自然它們的位置也在移動(dòng)。

二、知識(shí)點(diǎn)

1、使用Html5 Canvas+JavaScript畫圓——構(gòu)成圓形雪花

在Html5中,需要使用Canvas同時(shí)借助JavaScript畫圓,以構(gòu)成圓形雪花——arc(x,y,r,start,stop);

2、隨機(jī)數(shù)—產(chǎn)生不同半徑、坐標(biāo)的圓形雪花

本示例中,網(wǎng)頁第一次加載時(shí),需要生成一定數(shù)量的不同半徑及位置的雪花,故半徑、坐標(biāo)為隨機(jī)數(shù);雪花在飄落過程中,其半徑不變,坐標(biāo)在一定幅度內(nèi)變化,故此時(shí)坐標(biāo)也為隨機(jī)數(shù)——Math.random() 

三、程序編寫

1、準(zhǔn)備工作

放一個(gè)畫布canvas,并且設(shè)置整個(gè)body背景色為黑色

HTML代碼:

XML/HTML Code復(fù)制內(nèi)容到剪貼板
  1. <canvas id="mycanvas">  
  2.     您的瀏覽器不支持canvas畫布   
  3. </canvas>    
  4.   

CSS代碼:

CSS Code復(fù)制內(nèi)容到剪貼板
  1. * {   
  2.     margin: 0;   
  3.     padding: 0;   
  4. }   
  5.                
  6. #mycanvas {   
  7.     backgroundblack;   
  8. }   
  9.   

此時(shí)效果如如下:

 

注意:canvas默認(rèn)是有一個(gè)初始化高度和寬度的,所以不用去糾結(jié)

2、畫布滿屏顯示

JavaScript代碼如下:

JavaScript Code復(fù)制內(nèi)容到剪貼板
  1. //獲取mycanvas畫布   
  2.     var can = document.getElementById("mycanvas");   
  3.     var ctx = can.getContext("2d");   
  4.     //畫布寬度   
  5.     var wid = window.innerWidth;   
  6.     //畫布高度   
  7.     var hei = window.innerHeight;   
  8.     can.width=wid;   
  9.     can.height=hei;   

此時(shí)效果如如下:

3、初始化生成固定數(shù)量的雪花

根據(jù)我們上述需求分析及知識(shí)點(diǎn)解讀,首先雪花的數(shù)量是固定的,所以我們需要定義一個(gè)變量var snow = 100;這里假設(shè)雪花數(shù)量為100,;

生成雪花的時(shí)候,每個(gè)雪花半徑、位置都不同,我們把每個(gè)雪花當(dāng)做一個(gè)對(duì)象,那么這個(gè)對(duì)象的屬性就包含:半徑、坐標(biāo)(X、Y),那么一個(gè)雪花對(duì)象可以寫成var snowOject={x:1,y:10,r:5},這里就代表一個(gè)坐標(biāo)為(1,10)半徑為5的圓形雪花;本示例中由于半徑和坐標(biāo)都為隨機(jī)數(shù),故使用Math.random()分別為100個(gè)雪花生成半徑、坐標(biāo)(X、Y);

那我們這里是100個(gè)雪花,所以為了方便后面操作,就用一個(gè)數(shù)組保存這100個(gè)雪花對(duì)象。

JavaScript代碼如下:

JavaScript Code復(fù)制內(nèi)容到剪貼板
  1. //雪花數(shù)目   
  2. var snow = 100;   
  3. //雪花坐標(biāo)、半徑   
  4. var arr = []; //保存各圓坐標(biāo)及半徑   
  5. for (var i = 0; i < snow; i++) {   
  6. arr.push({   
  7. x: Math.random() * wid,   
  8. y: Math.random() * hei,   
  9. r: Math.random() * 10 + 1   
  10. })   
  11. }   


4、繪制雪花

上面我們已經(jīng)將100個(gè)雪花半徑、坐標(biāo)(X、Y)生成,下面就是循環(huán)使用canvas畫出雪花了(這里就是畫圓),這里定義一個(gè)函數(shù)

JavaScript代碼如下:

JavaScript Code復(fù)制內(nèi)容到剪貼板
  1. //畫雪花   
  2. function DrawSnow() {   
  3.     ctx.fillStyle="white";   
  4.     ctx.beginPath();   
  5.     for (var i = 0; i < snow; i++) {   
  6.         var p = arr[i];   
  7.         ctx.moveTo(p.x,p.y);   
  8.         ctx.arc(p.x,p.y,p.r,0,2*Math.PI,false);   
  9.     }   
  10.     ctx.fill();   
  11.   
  12.     ctx.closePath();   
  13.   

然后調(diào)用 DrawSnow()函數(shù),效果如下:

可以嘗試多次刷新網(wǎng)頁看是否會(huì)生成不同大小、位置的雪花(正常情況下是可以的),做到這里就已經(jīng)接近最終效果了

注意:由于這里需要繪制100個(gè)圓,所以每當(dāng)畫一個(gè)圓時(shí)重新定義繪制開始坐標(biāo)即:ctx.moveTo(p.x,p.y);否則會(huì)出現(xiàn)異樣效果,不信可以試試呀

 5、雪花飄動(dòng)

上面我們已經(jīng)畫出100個(gè)雪花,可惜只能依靠刷新網(wǎng)頁才能看到變化效果,但是我們需要實(shí)現(xiàn)的是雪花不停的移動(dòng)位置。

首先我們需要借助setInterval函數(shù)不停的重畫雪花,這里間隔時(shí)間為50毫秒:setInterval(DrawSnow,50);

同時(shí)每一朵雪花的坐標(biāo)(X、Y)需要不停的改變(在一定幅度內(nèi)),我們這里的雪花是從左上方飄落到右下方,所以每朵X、Y坐標(biāo)值都在不停的增大,那我們用一個(gè)函數(shù)SnowFall()定義雪花飄過規(guī)則

該函數(shù)代碼如下:

JavaScript Code復(fù)制內(nèi)容到剪貼板
  1. //雪花飄落   
  2. function SnowFall() {   
  3.     for (var i = 0; i < snow; i++) {   
  4.         var p = arr[i];   
  5.         p.y += Math.random() * 2 + 1;   
  6.         if (p.y > hei) {   
  7.             p.y = 0;   
  8.         }   
  9.         p.x += Math.random() * 2 + 1;   
  10.         if (p.x > wid) {   
  11.             p.x = 0;   
  12.     <span style="white-space:pre">    </span>}   
  13.     }   
  14. }  


然后將該函數(shù)放入DrawSnow()執(zhí)行,注意:我們每隔50毫毛重畫雪花,必須擦除畫布,所以DrawSnow()函數(shù)體內(nèi)必須在前面執(zhí)行clearRect()函數(shù),即:ctx.clearRect(0, 0, wid, hei);

此時(shí)DrawSnow函數(shù)定義如下:

JavaScript Code復(fù)制內(nèi)容到剪貼板
  1. //畫雪花   
  2. function DrawSnow() {   
  3.     ctx.clearRect(0, 0, wid, hei);   
  4.     ctx.fillStyle = "white";   
  5.     ctx.beginPath();   
  6.     for (var i = 0; i < snow; i++) {   
  7.         var p = arr[i];   
  8.         ctx.moveTo(p.x, p.y);   
  9.         ctx.arc(p.x, p.y, p.r, 0, 2 * Math.PI, false);   
  10.     }   
  11.     ctx.fill();   
  12.     SnowFall();   
  13.     ctx.closePath();   
  14. }   

最后執(zhí)行setInterval(DrawSnow, 50); 

OK,經(jīng)過我們上述步驟,小伙伴們是否已經(jīng)對(duì)整個(gè)過程及技術(shù)實(shí)現(xiàn)很清晰了。

完整代碼如下(大家可以直接復(fù)制到自己項(xiàng)目中執(zhí)行,測(cè)試下效果):

XML/HTML Code復(fù)制內(nèi)容到剪貼板
  1. <!DOCTYPE html>  
  2. <html>  
  3.   
  4.     <head>  
  5.         <meta charset="utf-8" />  
  6.         <title></title>  
  7.         <script src="js/jquery-1.8.3.min.js"></script>  
  8.         <style type="text/css">  
  9.             * {   
  10.                 margin: 0;   
  11.                 padding: 0;   
  12.             }   
  13.                
  14.             #mycanvas {   
  15.                 background: black;   
  16.             }   
  17.         </style>  
  18.     </head>  
  19.   
  20.     <body>  
  21.         <canvas id="mycanvas">  
  22.             您的瀏覽器不支持canvas畫布   
  23.         </canvas>  
  24.         <script>  
  25.             //獲取mycanvas畫布   
  26.             var can = document.getElementById("mycanvas");   
  27.             var ctx = can.getContext("2d");   
  28.             //畫布寬度   
  29.             var wid = window.innerWidth;   
  30.             //畫布高度   
  31.             var hei = window.innerHeight;   
  32.             can.width = wid;   
  33.             can.height = hei;   
  34.             //雪花數(shù)目   
  35.             var snow = 100;   
  36.             //雪花坐標(biāo)、半徑   
  37.             var arr = []; //保存各圓坐標(biāo)及半徑   
  38.             for (var i = 0; i < snow; i++) {   
  39.                 arr.push({   
  40.                     x: Math.random() * wid,   
  41.                     y: Math.random() * hei,   
  42.                     r: Math.random() * 10 + 1   
  43.                 })   
  44.             }   
  45.             //畫雪花   
  46.             function DrawSnow() {   
  47.                 ctx.clearRect(0, 0, wid, hei);   
  48.                 ctx.fillStyle = "white";   
  49.                 ctx.beginPath();   
  50.                 for (var i = 0; i < snow; i++) {   
  51.                     var p = arr[i];   
  52.                     ctx.moveTo(p.x, p.y);   
  53.                     ctx.arc(p.x, p.y, p.r, 0, 2 * Math.PI, false);   
  54.                 }   
  55.                 ctx.fill();   
  56.                 SnowFall();   
  57.                 ctx.closePath();   
  58.             }   
  59.             //雪花飄落   
  60.             function SnowFall() {   
  61.                 for (var i = 0; i < snow; i++) {   
  62.                     var p = arr[i];   
  63.                     p.y += Math.random() * 2 + 1;   
  64.                     if (p.y > hei) {   
  65.                         p.y = 0;   
  66.                     }   
  67.                     p.x += Math.random() * 2 + 1;   
  68.                     if (p.x > wid) {   
  69.                         p.x = 0;   
  70.                     }   
  71.                 }   
  72.             }   
  73.             setInterval(DrawSnow, 50);   
  74.         </script>  
  75.     </body>  
  76.   
  77. </html>  
  78.   

好了,今天分享就到這里,希望對(duì)大家的學(xué)習(xí)有所幫助。
原文:http://www.cnblogs.com/tangyifeng/p/5253629.html

標(biāo)簽:惠州 營口 咸陽 甘南 萍鄉(xiāng) 紅河 蘇州 文山

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《HTML5 canvas實(shí)現(xiàn)雪花飄落特效》,本文關(guān)鍵詞  HTML5,canvas,實(shí)現(xiàn),雪花,飄落,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《HTML5 canvas實(shí)現(xiàn)雪花飄落特效》相關(guān)的同類信息!
  • 本頁收集關(guān)于HTML5 canvas實(shí)現(xiàn)雪花飄落特效的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    日本在线不卡视频| 免费一级片在线观看| 999久久狠狠免费精品| 国产91丝袜高跟系列| 可以免费在线看黄的网站| 欧美另类videosbestsex视频| 国产麻豆精品免费密入口| 亚洲女人国产香蕉久久精品| 久久久成人网| 91麻豆爱豆果冻天美星空| 色综合久久天天综线观看| 日本伦理片网站| 日本伦理黄色大片在线观看网站| 日本免费看视频| 久久精品大片| 国产视频久久久久| 国产麻豆精品高清在线播放| 日韩中文字幕一区二区不卡| 欧美1区2区3区| 日本在线播放一区| 精品久久久久久中文字幕一区| 日韩av片免费播放| 黄视频网站在线看| 色综合久久天天综线观看| 天天做日日干| 超级乱淫黄漫画免费| 91麻豆国产级在线| 可以在线看黄的网站| 日本在线不卡视频| 亚洲第一色在线| 精品视频在线看 | 成人影院久久久久久影院| 日日日夜夜操| 精品视频在线观看免费| 九九免费高清在线观看视频| 欧美激情一区二区三区在线 | 黄视频网站免费| 黄视频网站免费看| 免费毛片播放| 国产高清在线精品一区a| 青青久久精品| 日日爽天天| 日本在线播放一区| 四虎影视库国产精品一区| 成人在免费观看视频国产| 色综合久久手机在线| 日本伦理片网站| 久久精品免视看国产成人2021| 久久久成人影院| 天堂网中文在线| 国产亚洲精品成人a在线| 可以免费看污视频的网站| 精品国产香蕉在线播出| 日本特黄特黄aaaaa大片| 国产精品免费精品自在线观看| 日韩专区亚洲综合久久| 欧美日本韩国| 999久久66久6只有精品| 黄色免费三级| 精品久久久久久中文字幕2017| 美女免费精品高清毛片在线视 | 亚洲 国产精品 日韩| 国产综合91天堂亚洲国产| 日日日夜夜操| 国产一区精品| 香蕉视频久久| 91麻豆高清国产在线播放| 高清一级片| 黄色免费网站在线| 国产91素人搭讪系列天堂| 国产高清视频免费| 99色视频在线观看| 国产一区二区精品久久| 国产成人欧美一区二区三区的| 精品视频一区二区三区| 国产视频一区二区在线播放| 久久精品免视看国产明星| 99久久精品国产国产毛片| 久草免费在线视频| 欧美激情影院| 欧美激情一区二区三区视频| 天天做日日干| 日本在线www| 黄色短视频网站| 国产精品1024永久免费视频| 精品视频一区二区| 欧美大片毛片aaa免费看| 国产韩国精品一区二区三区| 国产麻豆精品免费密入口| 成人a级高清视频在线观看| 欧美大片毛片aaa免费看| 麻豆系列 在线视频| 久久国产一区二区| 久久99欧美| 精品毛片视频| 麻豆网站在线看| 日日夜人人澡人人澡人人看免| 国产激情一区二区三区| 国产伦精品一区三区视频| 欧美激情一区二区三区中文字幕| 尤物视频网站在线| 成人免费观看视频| 一级女性全黄久久生活片| 国产一区精品| 91麻豆精品国产综合久久久| 久久国产一久久高清| 91麻豆精品国产片在线观看| 午夜在线影院| 日韩免费在线| 九九免费高清在线观看视频| 国产精品免费精品自在线观看| 国产伦精品一区三区视频| 国产精品1024永久免费视频| 午夜在线影院| 成人免费观看男女羞羞视频| 黄色短视频网站| 免费国产在线观看不卡| 美国一区二区三区| 久久精品店| 夜夜操天天爽| 久久99这里只有精品国产| 久草免费在线色站| 亚洲第一页乱| 国产伦精品一区二区三区在线观看| 欧美激情一区二区三区视频 | 国产麻豆精品免费视频| 欧美日本免费| 国产成人啪精品| 一本高清在线| 天天做日日爱| 91麻豆精品国产高清在线| 天天色成人| 日本在线不卡免费视频一区| 日韩一级黄色片| 韩国毛片| 国产伦久视频免费观看 视频| 日本伦理片网站| 二级特黄绝大片免费视频大片| 亚洲www美色| 日韩男人天堂| 国产91精品系列在线观看| 麻豆网站在线看| 国产一区二区精品| 精品国产亚洲一区二区三区| 欧美一级视频高清片| 国产不卡在线看| 香蕉视频三级| 国产精品自拍在线观看| 国产a视频| 日韩男人天堂| 四虎久久精品国产| 麻豆系列 在线视频| 免费国产一级特黄aa大片在线| 欧美激情一区二区三区中文字幕| 色综合久久手机在线| 香蕉视频三级| 99久久视频| 久久国产精品自由自在| 国产福利免费观看| 四虎影视久久| 日本特黄特色aaa大片免费| 超级乱淫伦动漫| 亚洲天堂免费| 一级女人毛片人一女人| 久久久久久久免费视频| 色综合久久天天综线观看| 日本免费看视频| 午夜激情视频在线观看 | 中文字幕一区二区三区 精品| 日本特黄一级| 精品国产一区二区三区久久久蜜臀| 午夜欧美成人香蕉剧场| 欧美大片一区| 国产不卡在线看| 日韩在线观看视频免费| 韩国三级一区| 久久99欧美| 毛片成人永久免费视频| 日韩在线观看视频网站| 亚洲女初尝黑人巨高清在线观看| 四虎论坛| 欧美大片a一级毛片视频| 黄色福利| 天堂网中文字幕| 久久精品免视看国产明星| 欧美一级视频高清片| 99热精品在线| 美女免费毛片| 久久久久久久男人的天堂| 一级毛片视频播放| 国产一区二区福利久久| 在线观看成人网 | 精品视频在线看| 国产成a人片在线观看视频| 成人高清视频免费观看| 亚洲精品久久玖玖玖玖| 国产不卡精品一区二区三区| 欧美另类videosbestsex久久| 色综合久久天天综合| 国产视频一区二区在线播放|