首頁  >  文章  >  web前端  >  HTML5 canvas實作雪花飄落特效_html5教學技巧

HTML5 canvas實作雪花飄落特效_html5教學技巧

WBOY
WBOY原創
2016-05-16 15:51:471638瀏覽

看到網路上很多展示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程式碼:

XML/HTML Code複製內容到剪貼簿
  1. canvas id=id=id=
  2. id>
  3.   
  4.     您的瀏覽器不支援canvas畫布   
  5. canvas>
    

    

  
    CSS代碼:
  1. CSS Code
  2. 複製內容到剪貼簿
  3. * {   
  4.     margin
  5. : 0;   
  6.     
  7. padding
  8. : 0;   
  9. }   
  10.                
  11. #mycanvas {   
  12.     
  13. background
  14. black
  15. ; 🎜>
black
; 🎜>

}   

  

此時效果如下:
  注意:canvas預設是有一個初始化高度和寬度的,所以不用去糾結
2、畫布滿螢幕顯示 JavaScript程式碼如下: JavaScript Code複製內容到剪貼簿
  1. //取得mycanvas畫布   
  2.     var can = document.getElementById("mycanvas"     
  3. var ctx = can.getContext(     //畫布寬度   
  4.     var wid = window.innerWidth;   
  5.     //畫布高度   
  6.     var hei = window.innerHeight;   
  7.     can.width=wid;        can.height=hei;   
  8. 此時效果如下:
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程式碼如下:

JavaScript Code

複製內容到剪貼簿

//雪花數目
  
  1. var snow = 100;   
  2. //雪花座標、半徑   
  3. var arr = []; 
  4. //保存各圓座標與半徑 for (var i =  
  5. arr.push({    x: Math.random() * wid,    y: Math.random() * hei,   
  6. r: Math.random() * 10   1   
  7. })   
  8. }   
  9. 4、畫雪花
  10. 上面我們已經將100個雪花半徑、座標(X、Y)生成,下面就是循環使用canvas畫出雪花了(這裡就是畫圓),這裡定義一個函數
  11. JavaScript程式碼如下:
JavaScript Code

複製內容到剪貼簿

  1. //畫雪花   
  2. function DrawSnow() {   
  3.     ctx.fillStyle="white";   
  4.     ctx.beginPath();   
  5.     for (var io> 0;
  6.         
  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,
  10. false);     }   
  11.     ctx.fill();   
  12.   
  13.     ctx.closePath();   
  14.   
  15. 然後呼叫 DrawSnow()函數,效果如下:

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

注意:由於這裡需要繪製100個圓,所以每當畫一個圓時重新定義繪製開始坐標即:ctx.moveTo(p.x,p.y);否則會出現異樣效果,不信可以試試呀

 5、雪花飄動

上面我們已經畫出100個雪花,可惜只能靠刷新網頁才能看到變化效果,但是我們需要實現的是雪花不停的移動位置。 首先我們需要藉助setInterval函數不停的重畫雪花,這裡間隔時間為50毫秒:setInterval(DrawSnow,50);

同時每一朵雪花的座標(X、Y)需要不停的改變(在一定幅度內),我們這裡的雪花是從左上方飄落到右下方,所以每朵X、Y座標值都在不停的增大,那我們用一個函數SnowFall()定義雪花飄過規則

函數程式碼如下:

JavaScript Code

複製內容到剪貼簿
  1. //雪花飄落  
  2. 函數 SnowFall() {   
  3.     for (var imm= 0;
  4.         
  5. var p = arr[i];   
  6.         p.y  = Math.random() * 2   1;   
  7.         
  8.  (p.y > hei) {   
  9.             p.y = 0;   
  10.         }   
  11.         p.x  = Math.random() * 2   1;            
  12. if (p.x > wid) {   
            p.x = 0;   


    

"white-space:pre"

>    } 
    }   
}  
  1. 然後封裝函數必須裝入DrawSnow()執行,注意:我們每50毫毛重畫雪花,必須廖廖,所以DrawSnow()函數裡面在前面執行clearRect()函數,即: ctx.clearRect (0, 0, 寬, 黑); 此時DrawSnow函式定義如下:
  2. JavaScript 程式碼 將內容複製到剪切板
  3. //畫雪花
  4.   
  5. 函數 DrawSnow() {   
  6.     ctx.clearRect(0, 0, wid, hei);        ctx.fillStyle = "白色";   
  7.     ctx.beginPath();        
  8. for (
  9. var imm= 0;         var
  10.  p = arr[i];   
  11.         ctx.moveTo(p.x, p.y);   
  12.         ctx.arc(p.x, p.y, p.r, 0, 2 * Math.PI, false
  13.     }   
  14.     ctx.fill();   

    SnowFall();   

    ctx.closePath();   

}   
最後執行setInterval(DrawSnow, 50);  好了,經過我們上述步驟,小夥伴們是否已經對整個流程及技術實現已經很清楚了。 完整程式碼如下(大家可以直接複製到自己專案執行,測試下效果): XML/HTML 程式碼將內容複製到剪貼簿
  1. html>  
  2. html>  
  3.   
  4.     >  
  5.             字符集="utf- 8" 
  6. />           標題>>   
  7.         腳本 src src; -1.8.3.min.js">腳本>  
  8.         樣式 類型 類型 
  9. >
  10.   
  11.             * {   
  12.                 邊距:0;  
  13.                 已填中:0;   
  14.             }   
  15.                
  16.             #mycanvas {   
  17.                  背景:黑色;               }  
  18.         style> 🎜>>
  19.  🎜>>      head
  20. >
  21.   
  22.           
  23. body>              
  24. canvas 
  25. id id idid
  26. >
  27.                您的瀏覽器並未支援canvas畫布            
  28. canvas
  29. >
  30.  >          
  31. script
  32. > 🎜>> 🎜>> 
  33.             //取得mycanvas畫布   
  34.             var 
  35. can = documum             var ctx
  36.  = 
  37. can
  38. .getContext("2d");   
  39.             //畫布寬度                var wid
  40.  = 
  41. window             //畫布高度                var 
  42. hei =             
  43. can.width
  44.  = wid;   
  45.  = wid; 鎜>
  46.             can.height = hei;    = hei;   
  47.  = hei;   
  48.             //雪花數目   
  49.             var snow
  50.  = 
  51.             //雪花座標、半徑                var arr = []; ///所有圓座標及半徑               for (var i = 
  52.  
  53. snow
  54. ; i ) {   
  55.                 arr.push({                        x: Math.random() * wid,   
  56. y: Math.random() * hei,
  57. r: Math.random() * 10 1
  58. })
  59. }
  60. //画雪花
  61. 関数 DrawSnow() {
  62. ctx.clearRect(0, 0, wid, hei);   
  63. ctx.fillStyle = "白";   
  64. ctx.beginPath();   
  65. for (var i = 0; i < ; i ) {
  66. var p = arr[i];   
  67. ctx.moveTo(p.x, p.y);   
  68. ctx.arc(p.x, p.y, p.r, 0, 2 * Math.PI, false);   
  69. }
  70. ctx.fill();   
  71. SnowFall();   
  72. ctx.closePath();   
  73. }  
  74. //雪花飘落
  75. 関数 SnowFall() {
  76. for (var i = 0; i < ; i ) {
  77. var p = arr[i];   
  78. p.y = Math.random() * 2 1;   
  79. if (p.y > hei) {
  80. p.y = 0;   
  81. }
  82. p.x = Math.random() * 2 1;   
  83. if (p.x > wid) {
  84. p.x = 0;   
  85. }
  86. }
  87. }
  88. setInterval(DrawSnow, 50);   
  89. スクリプト>
  90. ボディ>
  91. html>

よろしくお願いいたします。本日ここに到着しました。大家の学術的支援を希望します。
翻訳:http://www.cnblogs.com/tangyifeng/p/5253629.html

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn