亚洲最大看欧美片,亚洲图揄拍自拍另类图片,欧美精品v国产精品v呦,日本在线精品视频免费

  • 站長(zhǎng)資訊網(wǎng)
    最全最豐富的資訊網(wǎng)站

    h5canvas實(shí)現(xiàn)雪花飄落的特效代碼

    這篇文章主要為大家詳細(xì)介紹了HTML5 canvas實(shí)現(xiàn)雪花飄落特效,效果實(shí)現(xiàn)引人入勝,很逼真的動(dòng)畫(huà)效果,感興趣的小伙伴們可以參考一下

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

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

    最終效果圖如下:

    h5canvas實(shí)現(xiàn)雪花飄落的特效代碼

    圖1

    一、需求分析

    1、圓形雪花

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

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

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

    3、雪花大小不一致

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

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

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

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

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

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

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

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

    三、程序編寫(xiě)

    1、準(zhǔn)備工作

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

    HTML代碼:

    XML/HTML Code復(fù)制內(nèi)容到剪貼板

    <canvas id="mycanvas">      您的瀏覽器不支持canvas畫(huà)布     </canvas>

    CSS代碼:

    CSS Code復(fù)制內(nèi)容到剪貼板

    * {         margin: 0;         padding: 0;     }     #mycanvas {         background: black;     }

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

    h5canvas實(shí)現(xiàn)雪花飄落的特效代碼

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

    2、畫(huà)布滿屏顯示

    JavaScript代碼如下:

    JavaScript Code復(fù)制內(nèi)容到剪貼板

    //獲取mycanvas畫(huà)布         var can = document.getElementById("mycanvas");         var ctx = can.getContext("2d");         //畫(huà)布寬度         var wid = window.innerWidth;         //畫(huà)布高度         var hei = window.innerHeight;         can.width=wid;         can.height=hei;

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

    h5canvas實(shí)現(xiàn)雪花飄落的特效代碼

    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ì)象可以寫(xiě)成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)容到剪貼板

    //雪花數(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畫(huà)出雪花了(這里就是畫(huà)圓),這里定義一個(gè)函數(shù)

    JavaScript代碼如下:

    JavaScript Code復(fù)制內(nèi)容到剪貼板

    //畫(huà)雪花     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ù),效果如下:

    h5canvas實(shí)現(xiàn)雪花飄落的特效代碼

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

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

    5、雪花飄動(dòng)

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

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

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

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

    JavaScript Code復(fù)制內(nèi)容到剪貼板

    //雪花飄落     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毫毛重畫(huà)雪花,必須擦除畫(huà)布,所以DrawSnow()函數(shù)體內(nèi)必須在前面執(zhí)行clearRect()函數(shù),即:ctx.clearRect(0, 0, wid, hei);

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

    JavaScript Code復(fù)制內(nèi)容到剪貼板

    //畫(huà)雪花     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)過(guò)我們上述步驟,小伙伴們是否已經(jīng)對(duì)整個(gè)過(guò)程及技術(shù)實(shí)現(xiàn)很清晰了。

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

    XML/HTML Code復(fù)制內(nèi)容到剪貼板

    <!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畫(huà)布             </canvas>            <script>                //獲取mycanvas畫(huà)布                 var can = document.getElementById("mycanvas");                 var ctx = can.getContext("2d");                 //畫(huà)布寬度                 var wid = window.innerWidth;                 //畫(huà)布高度                 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                     })                 }                 //畫(huà)雪花                 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>

    【相關(guān)推薦】

    1. 特別推薦:“php程序員工具箱”V0.1版本下載

    2. h5 Canvas中Fill 與Stroke文字效果實(shí)現(xiàn)實(shí)例

    3. 分享用canvas實(shí)現(xiàn)水流和水池動(dòng)畫(huà)的代碼

    贊(0)
    分享到: 更多 (0)
    網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)