這篇文章將為大家詳細(xì)講解使用HTML5的canvas制作雪花飄落特效的方法,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站服務(wù)團(tuán)隊(duì)是一支充滿著熱情的團(tuán)隊(duì),執(zhí)著、敏銳、追求更好,是創(chuàng)新互聯(lián)的標(biāo)準(zhǔn)與要求,同時(shí)竭誠(chéng)為客戶提供服務(wù)是我們的理念。創(chuàng)新互聯(lián)公司把每個(gè)網(wǎng)站當(dāng)做一個(gè)產(chǎn)品來開發(fā),精雕細(xì)琢,追求一名工匠心中的細(xì)致,我們更用心!
最終效果圖如下:
圖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代碼:
<canvas id="mycanvas"> 您的瀏覽器不支持canvas畫布 </canvas>
CSS代碼:
* { margin: 0; padding: 0; } #mycanvas { background: black; }
此時(shí)效果如如下:
注意:canvas默認(rèn)是有一個(gè)初始化高度和寬度的,所以不用去糾結(jié)
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;
此時(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代碼如下:
//雪花數(shù)目 var snow = 100; //雪花坐標(biāo)、半徑 var arr = []; //保存各圓坐標(biāo)及半徑 for (var i = 0; i < snow; i++) { arr.push({ x: Math.random() * wid, y: Math.random() * hei, r: Math.random() * 10 + 1 }) }
4、繪制雪花
上面我們已經(jīng)將100個(gè)雪花半徑、坐標(biāo)(X、Y)生成,下面就是循環(huán)使用canvas畫出雪花了(這里就是畫圓),這里定義一個(gè)函數(shù)
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();
然后調(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ù)代碼如下:
//雪花飄落 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>} } }
然后將該函數(shù)放入DrawSnow()執(zhí)行,注意:我們每隔50毫毛重畫雪花,必須擦除畫布,所以DrawSnow()函數(shù)體內(nèi)必須在前面執(zhí)行clearRect()函數(shù),即:ctx.clearRect(0, 0, wid, hei);
此時(shí)DrawSnow函數(shù)定義如下:
//畫雪花 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(); }
最后執(zhí)行setInterval(DrawSnow, 50);
OK,經(jīng)過我們上述步驟,小伙伴們是否已經(jīng)對(duì)整個(gè)過程及技術(shù)實(shí)現(xiàn)很清晰了。
完整代碼如下(大家可以直接復(fù)制到自己項(xiàng)目中執(zhí)行,測(cè)試下效果):
<!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; //雪花數(shù)目 var snow = 100; //雪花坐標(biāo)、半徑 var arr = []; //保存各圓坐標(biāo)及半徑 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>
以上就是HTML5的canvas制作雪花飄落特效的詳細(xì)內(nèi)容了,看完之后是否有所收獲呢?如果想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊!
當(dāng)前文章:HTML5的canvas制作雪花飄落特效
URL網(wǎng)址:http://jinyejixie.com/article30/johgpo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、網(wǎng)站收錄、小程序開發(fā)、云服務(wù)器、電子商務(wù)、自適應(yīng)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)