首頁 web前端 H5教程 實例教學 HTML5 Canvas 超酷煙火綻放動畫實作程式碼_html5教學技巧

實例教學 HTML5 Canvas 超酷煙火綻放動畫實作程式碼_html5教學技巧

May 16, 2016 pm 03:47 PM

  這是一個很酷的HTML5 Canvas動畫,它將模擬的是我們現實生活中煙火綻放的動畫特效,效果非常逼真,但是畢竟是電腦模擬,帶女朋友看就算了,效果還是差了點,呵呵。這個HTML5 Canvas動畫有一點比較出色,就是其效能,Chrome上基本上沒有卡片的感覺,就算你放出很多煙火也一樣。

  下面我們來簡單分析實現這款HTML5煙火特效的過程及程式碼,主要由HTML程式碼、CSS程式碼以及Javascript程式碼組成,當然javascript程式碼是最重要的。

  HTML程式碼:

XML/HTML Code複製內容到剪貼簿
  1. div id=”gui”div>  
  2. div id >> div id=”id=”id=”id=”
  3. id
  4. =” >>div>     div id”mountains1″id=”mountains1″id div>div id=”skyline”>
div

>

 

div
>  
  HTML的結構非常簡單,也就是建構了一個canvas容器,我們會利用JS在這個容器中產生一個Canvas物件。看最後的JS程式碼你就會知道了。   CSS代碼: CSS Code複製內容到剪貼簿
  1. #canvas-容器{ 背景#000#000url(bg.jpg); 高度400px; >左:50%; 邊距: -200px 300px位置絕對; 絕對; 寬度600px;  > } 畫布 { 遊標
  2. 十字線; >: 阻止職位相對;  z 索引:3;    } 畫布:活動 { 遊標十字線;   
  3. 十字線
  4. ;    #skyline { 
  5. 背景背景: 重複-x 50% 0; 底部底部底部底部底部底部底部底部底部底部底部高度135px; :0; :0; 。 >絕對; 
  6. 寬度:100%; :100%; :100%; >指數 #mountains1 { 背景 (mountains1.png) 重複-x 40% 0; 底部底部底部底部底部底部:0;>高度200px; :0; 
  7. :0; 。 >絕對; 寬度:100%; :100%; :100%; >指數 #mountains2 { 背景: 重複-x 30% 0; 底部底部底部底部底部底部:0;>高度
  8. 250px; :0; :0; 。 >絕對; 寬度:100%; :100%; :100%; >
  9. 指數
#gui
 { 右右: 0; 位置:固定; 上方:0;  索引🎜> :3;    }  

  CSS程式碼沒什麼特別,主要也就定義一下背景色和邊框之類的。

  接下來是最重要的Javascript程式碼。

  Javascript程式碼:

JavaScript Code複製內容到剪貼簿
  1. self.init = 函數(){       
  2.     self.dt = 0;   
  3.         self.oldTime = Date.now();   
  4.         self.canvas = document.createElement('canvas');                   
  5.         self.canvasContainer = $('#canvas-container'); var canvasContainerDisabled = document.getElementById('canvas-container''canvas-container'
  6. );            self.canvas.onselectstart = 函數() { 函數() { > >;   
  7.         };   
  8.   
  9.         self.canvas.width = self.cw = 600;   
  10.         self.canvas.height = self.ch = 400;       
  11.   
  12.         self.articles = [];       
  13.         self.partCount = 30;   
  14.         self.fireworks = [];       
  15.         self.mx = self.cw/2;   
  16.         self.my = self.ch/2;   
  17.         self.currentHue = 170;   
  18.         self.partSpeed = 5;   
  19.         self.partSpeedVariance = 10;   
  20.         self.partWind = 50;   
  21.         self.partFriction = 5;   
  22.         self.partGravity = 1;   
  23.         self.hueMin = 150;   
  24.         self.hueMax = 200;   
  25.         self.fworkSpeed = 2;   
  26.         self.fworkAccel = 4;   
  27.         self.hueVariance = 30;   
  28.         self.flickerDensity = 20;   
  29.         self.showShockwave = false;   
  30.         self.showTarget = true;   
  31.         self.clearAlpha = 25;   
  32.   
  33.         self.canvasContainer.append(self.canvas);   
  34.         self.ctx = self.canvas.getContext('2d');   
  35.         self.ctx.lineCap = '圓形';   
  36.         self.ctx.lineJoin = '圓形';   
  37.         self.lineWidth = 1;   
  38.         self.bindEvents();               
  39.         self.canvasLoop();   
  40.   
  41.         self.canvas.onselectstart = 函數() { 函數() { > >;            };  
  42.   
  43.     };  
  44.   這段JS程式碼主要是往canvas容器中建構一個Canvas對象,並且對這個canvas對象的外觀以及動畫屬性作了初始化。

    JavaScript Code複製內容到剪貼簿
    1. var 粒子 = 函數(x, y, 色調){ (x, y, 色調){ (x, y, 🎜>.x = x; 這個.y = y; 這個.coordLast = >             {x: x, y: y},   
    2.             {x: x, y: y},   
    3.             {x: x, y: y}   
    4.         ]; 
    5. .angle = rand(0, 360); .angle = rand(0, 360); 這個這個<. friction=" 1 - self.partFriction/100; 這個.gravity = self.partGravity/2; 這個這個這個.brightness = rand(50, 80); 這個這個.decay = rand(10, 50)/1000; 這個.lineWidth = self.lineWidth;      };   
    6.   
    7.     Particle.prototype.update = 函數(索引){ var(索引){ var.angle * Math.PI / 180; var vx = Math.cos(弧度) * 這個這個.speed; var vy = Math.sin(弧度) * 這個.speed > 。重力; 這個.速度*= 這個.摩擦力; 這個. coordLast[2].x = .coordLast[1].x; .coordLast[2].y = 這個.coordLast[1].y; 這個.coordLast[1].x = 這個.coordLast[0].x; 這個.coordLast[1].y = .coordLast[0 ].y; 這個.coordLast[0].x = .x; 這個.x; >.coordLast[0].y = 這個.y; 這個.x = vx 這個.y = vy * self.dt; 這個.angle  = 這個.wind; 這個.alpha -= .decay; .decay; .decay; if.decay; if.decay; if.decay; if.decay; if.decay; if.decay; if. (!hitTest(0,0,self.cw,self.ch,這個.x-這個.radius,
    8. 這個
    9. .y-
    10. 這個
    11. .radius,
    12. 這個
    13. .radius*2, 這個.radius*2, 這個.radius*2, 這個.radius*2, 這個.radius*2, 這個.radius*2) ||  這個.alpha              self.articles.splice(index, 1);                }                    };   
    14.   
    15.     Particle.prototype.draw = 函數(){ var -1);   
    16.         self.ctx.beginPath();                 
    17.         self.ctx.moveTo(Math.round(
    18. .coordLast[coordRand].x),這個.coordLast[coordRand].x),o.coordLast[coordRand].y));            self.ctx.lineTo(Math.round(
    19. 。 .y));            self.ctx.closePath();                         self.ctx.tripStyle = 'hsla('
    20. 這樣, 100%, '
    21. 這個.亮度'%, '.alpha ')';            self.ctx.中風(); if(self.flicker) 50 - self.flickerDensity; if(rand(0, inverseDensity) === inverseDensity){   
    22.                 self.ctx.beginPath();                    self.ctx.arc(Math.round(這; .y), rand(這個.lineWidth,
    23. 這個
    24. .lineWidth 3)/2, 0, Math.PI*2,
    25. false
    26. )  self.ctx.closePath(); var                  self.ctx.fillStyle = 'hsla('' , 100%, '這個.亮度'%, ' randpha🎜>'%, ' randpha; )';   
    27.                 self.ctx.fill();                }                }        };   某個JS程式碼的功能是實現煙火爆炸後的小顆粒的均勻性,從draw方法中可以看出,創建幾個隨機點,煙火顆粒就可以在這個範圍的隨機點中散落。 JavaScript 程式碼 將內容複製到剪切板
      1. var Firework = 函數(startX, startY, targetX, getget >.x = startX; 這個.y = startY; 這個. >這個.startY = startY; 這個.hitX = false .hitY = 這個.coordLast =              {x: startX, y: startY},                {x: startX, y: startY},   
      2.             {x: startX, y: startY}   
      3.         ]; 
      4. .targetX = targetX; 
      5. .targetX = targetX; 
      6. .targetX = targetX; 
      7. .targetX = targetX; .targetX = targetX; 這個.speed = self.fworkSpeed; 這個.angle = Math.atan2(targetY - startY, targetX - startX); .shockwaveAngle = Math.atan2(targetY - startY, targetX - startX) (90*(Math.PI/180));  .fworkAccel/100; 這個.hue = self.currentHue; 這個.alpha = rand(50,100)/100; .lineWidth =.targetRadius = 1;        };           Firework.prototype.update = 函數
      8. (索引){   
      9.         self.ctx.lineWidth = 
      10. .lineWidth;   
      11. .lineWidth;   
      12.   
      13.         vx = Math.cos(
      14. .angle) * 
      15. .angle) * 
      16. .angle) *          vy = Math.sin(這個.angle) * 
      17. .angle) * 
      18. 這個.angle) * 這個🎜>這個🎜>這個.速度*= 1   這個.加速; 這個.coordLast[2].coordLast 這個.coordLast[1].x; 這個.coordLast[2].y = .coordLast[2].y = 這個.coordLast[1].y; .coordLast[1].x = 這個.coordLast[1].y = .coordLast[0].y; 這個.coordLast[0].x = .x; 這個 0].y = 這個.y; if(self.showTarget){ (self.showTarget){ ifif (這個.targetRadius (這個.targetRadius 這個
      19. .targetRadius { 這.targetRadius = .25 * self.dt;                } 其他 { 這個.targetRadius = 1 *  
      20.             }   
      21.         } 
      22. 如果(((這個(這個.這個.. >.targetX){ if(.x   vx .x   vx 這個.x = 
      23. .targetX; 
      24. 這個.targetX; 這個。 hitX = true;   
      25.             } 
      26. 其他
      27.  {              }            } 否則 { 如果這個> vx >= 這個.targetX){ 這個.x = 這個.x = 這個.x = 這個。 targetX; 
      28. .hitX = ;   ;   
      29. ;   
      30.             } 
      31. 其他 {              }            } if(((這個(這個.. >.targetY){ if(.y   vy 
      32. 。 .targetY){ 這個
      33. .y = .targetY; 這個.targetY; 這個.targetY; 
      34. 這個
      35. 這個.targetY; 
      36. 這個
      37. 。 hitY = true;                } 其他 {              }            } 否則 { 如果這個🎜>這個🎜> vy >= 這個.targetY){ 這個
      38. .y = 
      39. 這個.y = 這個.y = 這個. targetY; 這個
      40. .hitY = 這個
      41. ;   ;   ;   ;               } 其他 {              }            }如果(.hitX && 這個這個var
      42. randExplosion = rand(0, 9);                self.createParticles(a.色調);                self.fireworks.splice(index, 1);            
      43.         }   
      44.     };   
      45.   
      46.     Firework.prototype.draw = 
      47. 函數
      48. (){   
      49.         self.ctx.lineWidth = 
      50. .lineWidth; 
      51. 這個.lineWidth; 這個.lineWidth; .lineWidth; > -1);                       
      52.         self.ctx.beginPath();                 
      53.         self.ctx.moveTo(Math.round(.coordLast[coordRand].x),這個.coordLast[coordRand].x),o.coordLast[coordRand].y));   
      54.         self.ctx.lineTo(Math.round(
      55. 。 .y));            self.ctx.closePath();   
      56.         self.ctx.tripStyle = 
      57. 'hsla('
      58. 這樣, 100%, '這個.亮度'%, '.alpha ')';            self.ctx.中風(); if(self.showTarget){ o>Target             self.ctx.save();   
      59.             self.ctx.beginPath();                self.ctx.arc(Math.round(
      60. .targetX), Math🎜>這個
      61. .targetX), Math. .targetY), 
      62. 這個
      63. .targetRadius, 0, Math.PI*2, 
      64. false 🎜>false)               self.ctx.closePath();                self.ctx.lineWidth = 1;                self.ctx.中風();   
      65.             self.ctx.restore();   
      66.         } if(self.showShockwave){   
      67.             self.ctx.save();   
      68.             self.ctx.translate(Math.round(這個.             self.ctx.rotate(
      69. .shockwaveAngle);   >這.shockwaveAngle);   
      70.             self.ctx.beginPath();   
      71.             self.ctx.arc(0, 0, 1*(
      72. .speed/5),50正確);                self.ctx.strokeStyle = 'hsla('
      73. 'hsla(' 這個.亮度'%, ' 蘭特(25, 60) 100 ')';                self.ctx.lineWidth = 這個.lineWidth  
      74.             self.ctx.中風();   
      75.             self.ctx.restore();   
      76.         }                       
      77.     };  
      78. 某個JS程式碼是建立煙火實例的,我們也可以從draw方法中看出,當我們滑鼠點擊中部的某個點時,煙火發射的目的地就在那個點上。
      79. 這個HTML5 Canvas煙火效果的核心程式碼就是這樣,謝謝閱讀,希望能幫助大家,請繼續關注腳本之家,我們會努力分享更多優秀的文章。
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何使用視口元標記來控制移動設備上的頁面縮放? 如何使用視口元標記來控制移動設備上的頁面縮放? Mar 13, 2025 pm 08:00 PM

本文討論了使用視口元標記來控制移動設備上的頁面縮放,重點是寬度和初始尺度之類的設置,以獲得最佳響應和性能。

如何使用地理位置API處理用戶位置隱私和權限? 如何使用地理位置API處理用戶位置隱私和權限? Mar 18, 2025 pm 02:16 PM

本文討論了使用GeOlocation API管理用戶位置隱私和權限,並強調要求權限,確保數據安全性並遵守隱私法律的最佳實踐。

如何將HTML5拖放API用於交互式用戶界面? 如何將HTML5拖放API用於交互式用戶界面? Mar 18, 2025 pm 02:17 PM

本文介紹瞭如何使用HTML5拖放API來創建交互式用戶界面,詳細介紹了使元素可拖動的步驟,處理關鍵事件並通過自定義反饋來增強用戶體驗。它還討論了一個常見的陷阱

如何使用HTML5頁面可見性API檢測頁面何時可見? 如何使用HTML5頁面可見性API檢測頁面何時可見? Mar 13, 2025 pm 07:51 PM

本文討論了使用HTML5頁面可見性API來檢測頁面可見性,提高用戶體驗並優化資源使用情況。關鍵方麵包括暫停媒體,減少CPU負載以及基於可見性變化管理分析。

h5項目怎麼運行 h5項目怎麼運行 Apr 06, 2025 pm 12:21 PM

運行 H5 項目需要以下步驟:安裝 Web 服務器、Node.js、開發工具等必要工具。搭建開發環境,創建項目文件夾、初始化項目、編寫代碼。啟動開發服務器,使用命令行運行命令。在瀏覽器中預覽項目,輸入開發服務器 URL。發布項目,優化代碼、部署項目、設置 Web 服務器配置。

如何使用HTML5 Websockets API進行客戶端和服務器之間的雙向通信? 如何使用HTML5 Websockets API進行客戶端和服務器之間的雙向通信? Mar 12, 2025 pm 03:20 PM

本文解釋了HTML5 Websockets API,用於實時雙向客戶服務器通信。 它詳細詳細介紹了客戶端(JavaScript)和服務器端(Python/Flask)的實現,以應對可伸縮性,狀態管理,一個挑戰

H5頁面製作是否需要持續維護 H5頁面製作是否需要持續維護 Apr 05, 2025 pm 11:27 PM

H5頁面需要持續維護,這是因為代碼漏洞、瀏覽器兼容性、性能優化、安全更新和用戶體驗提升等因素。有效維護的方法包括建立完善的測試體系、使用版本控制工具、定期監控頁面性能、收集用戶反饋和製定維護計劃。

如何使用HTML5通知API顯示桌面通知? 如何使用HTML5通知API顯示桌面通知? Mar 13, 2025 pm 07:57 PM

本文介紹瞭如何使用HTML5通知API顯示桌面通知,重點關注許可要求,自定義和瀏覽器支持。

See all articles