實例教學 HTML5 Canvas 超酷煙火綻放動畫實作程式碼_html5教學技巧
這是一個很酷的HTML5 Canvas動畫,它將模擬的是我們現實生活中煙火綻放的動畫特效,效果非常逼真,但是畢竟是電腦模擬,帶女朋友看就算了,效果還是差了點,呵呵。這個HTML5 Canvas動畫有一點比較出色,就是其效能,Chrome上基本上沒有卡片的感覺,就算你放出很多煙火也一樣。
下面我們來簡單分析實現這款HTML5煙火特效的過程及程式碼,主要由HTML程式碼、CSS程式碼以及Javascript程式碼組成,當然javascript程式碼是最重要的。
HTML程式碼:
- div id=”gui”div>
- div id >> div id=”id=”id=”id=” id
- =” >>div> div id”mountains1″id=”mountains1″id div>div id=”skyline”>
>
- #canvas-容器{ 背景: #000: #000url(bg.jpg); 高度:400px; >左:50%; 邊距: -200px 300px; 位置:絕對; 絕對; 上寬度:600px; > } 畫布 { 遊標 :
- 十字線; >: 阻止; 職位:相對; z 索引:3; } 畫布:活動 { 遊標:十字線; 十字線
- ; } #skyline {
- 背景: 背景: 重複-x 50% 0; 底部底部底部底部底部底部底部底部底部底部底部高度:135px; 左:0; 左:0; 。 >:絕對;
- 寬度:100%; :100%; :100%; >指數 } #mountains1 { 背景 (mountains1.png) 重複-x 40% 0; 底部底部底部底部底部底部:0;>高度:200px; 左:0; 左
- :0; 。 >:絕對; 寬度:100%; :100%; :100%; >指數 } #mountains2 { 背景: 重複-x 30% 0; 底部底部底部底部底部底部:0;>高度 :
- 250px; 左:0; 左:0; 。 >:絕對; 寬度:100%; :100%; :100%; > 指數 }
CSS程式碼沒什麼特別,主要也就定義一下背景色和邊框之類的。
接下來是最重要的Javascript程式碼。
Javascript程式碼:
- self.init = 函數(){
- self.dt = 0;
- self.oldTime = Date.now();
- self.canvas = document.createElement('canvas');
- self.canvasContainer = $('#canvas-container'); var canvasContainerDisabled = document.getElementById('canvas-container''canvas-container'
- ); self.canvas.onselectstart = 函數() { 函數() { > >;
- };
- self.canvas.width = self.cw = 600;
- self.canvas.height = self.ch = 400;
- self.articles = [];
- self.partCount = 30;
- self.fireworks = [];
- self.mx = self.cw/2;
- self.my = self.ch/2;
- self.currentHue = 170;
- self.partSpeed = 5;
- self.partSpeedVariance = 10;
- self.partWind = 50;
- self.partFriction = 5;
- self.partGravity = 1;
- self.hueMin = 150;
- self.hueMax = 200;
- self.fworkSpeed = 2;
- self.fworkAccel = 4;
- self.hueVariance = 30;
- self.flickerDensity = 20;
- self.showShockwave = false;
- self.showTarget = true;
- self.clearAlpha = 25;
- self.canvasContainer.append(self.canvas);
- self.ctx = self.canvas.getContext('2d');
- self.ctx.lineCap = '圓形';
- self.ctx.lineJoin = '圓形';
- self.lineWidth = 1;
- self.bindEvents();
- self.canvasLoop();
- self.canvas.onselectstart = 函數() { 函數() { > >; };
- };
- var 粒子 = 函數(x, y, 色調){ (x, y, 色調){ (x, y, 🎜>.x = x; 這個.y = y; 這個.coordLast = > {x: x, y: y},
- {x: x, y: y},
- {x: x, y: y}
- ];
- 這.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; };
- 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, 這個
- .y- 這個
- .radius, 這個
- .radius*2, 這個.radius*2, 這個.radius*2, 這個.radius*2, 這個.radius*2, 這個.radius*2) || 這個.alpha self.articles.splice(index, 1); } };
- Particle.prototype.draw = 函數(){ var -1);
- self.ctx.beginPath(); self.ctx.moveTo(Math.round(
-
這.coordLast[coordRand].x),這個.coordLast[coordRand].x),o
.coordLast[coordRand].y)); self.ctx.lineTo(Math.round( - 這。 .y)); self.ctx.closePath(); self.ctx.tripStyle = 'hsla('
- 這樣, 100%, '
- 這個.亮度'%, '.alpha ')'; self.ctx.中風(); if(self.flicker) 50 - self.flickerDensity; if(rand(0, inverseDensity) === inverseDensity){
- self.ctx.beginPath(); self.ctx.arc(Math.round(這這; .y), rand(這個.lineWidth, 這個
- .lineWidth 3)/2, 0, Math.PI*2, false
- ) self.ctx.closePath(); var self.ctx.fillStyle = 'hsla('' , 100%, '這個.亮度'%, ' randpha🎜>'%, ' randpha; )';
- self.ctx.fill();
}
}
};
某個JS程式碼的功能是實現煙火爆炸後的小顆粒的均勻性,從draw方法中可以看出,創建幾個隨機點,煙火顆粒就可以在這個範圍的隨機點中散落。
JavaScript 程式碼 將內容複製到剪切板
- var Firework = 函數(startX, startY, targetX, getget >.x = startX; 這個.y = startY; 這個. >這個.startY = startY; 這個.hitX = false .hitY = 假; 這個.coordLast = {x: startX, y: startY}, {x: startX, y: startY}, {x: startX, y: startY}
- ];
- 這 .targetX = targetX;
- .targetX = targetX; .targetX = targetX;
-
.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 = 函數 (索引){ - self.ctx.lineWidth =
- 這 .lineWidth;
- .lineWidth;
- vx = Math.cos(這 .angle) *
- .angle) *
- .angle) * vy = Math.sin(這個.angle) * .angle) *
- 這個.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 這個
- .targetRadius { 這.targetRadius = .25 * self.dt; } 其他 { 這個.targetRadius = 1 * }
- }
- 如果(這(這(這個(這個.這個.. >.targetX){ if(這.x vx .x vx 這這個.x = 這 .targetX;
- 這個.targetX; 這個。 hitX = true;
- } 其他
- { } } 否則 { 如果這個> vx >= 這個.targetX){ 這個.x = 這個.x = 這個.x = 這個。 targetX;
- 這.hitX = ;
; 。 .targetY){ 這個- ;
}- 其他 { } } if(這(這(這個(這個.. >.targetY){ if(這.y vy
- ;
- .y = 這.targetY; 這個.targetY; 這個.targetY; 這個
- 這個.targetY; 這個
- 。 hitY = true; } 其他 { } } 否則 { 如果這個🎜>這個🎜> vy >= 這個.targetY){ 這個 .y =
- 這個.y = 這個.y = 這個. targetY; 這個
- .hitY = 這個
- ;
; 如果(這.hitX && 這個這個var; ; } 其他 { } } - randExplosion = rand(0, 9);
self.createParticles(這a
.色調); self.fireworks.splice(index, 1); } - };
- Firework.prototype.draw =
- 函數 (){
- self.ctx.lineWidth = 這 .lineWidth;
- 這個.lineWidth; 這個.lineWidth; .lineWidth; > -1);
- self.ctx.beginPath();
- self.ctx.moveTo(Math.round(這.coordLast[coordRand].x),這個.coordLast[coordRand].x),o
.coordLast[coordRand].y)); self.ctx.lineTo(Math.round( - 這。 .y)); self.ctx.closePath(); self.ctx.tripStyle =
- 'hsla('
- 這樣, 100%, '這個.亮度'%, '.alpha ')'; self.ctx.中風(); if(self.showTarget){ o>Target self.ctx.save();
- self.ctx.beginPath(); self.ctx.arc(Math.round( 這
- .targetX), Math🎜>這個 .targetX), Math. .targetY),
- 這個 .targetRadius, 0, Math.PI*2,
- false 🎜>false) self.ctx.closePath(); self.ctx.lineWidth = 1; self.ctx.中風();
- self.ctx.restore();
- } if(self.showShockwave){
- self.ctx.save();
- self.ctx.translate(Math.round(這個. self.ctx.rotate( 這
- .shockwaveAngle); >這.shockwaveAngle); self.ctx.beginPath();
- self.ctx.arc(0, 0, 1*(
- 這.speed/5),50正確); self.ctx.strokeStyle = 'hsla('
- 'hsla(' 這個.亮度'%, ' 蘭特(25, 60) 100 ')'; self.ctx.lineWidth = 這個.lineWidth self.ctx.中風();
- self.ctx.restore(); }
- };
- 某個JS程式碼是建立煙火實例的,我們也可以從draw方法中看出,當我們滑鼠點擊中部的某個點時,煙火發射的目的地就在那個點上。
- 這個HTML5 Canvas煙火效果的核心程式碼就是這樣,謝謝閱讀,希望能幫助大家,請繼續關注腳本之家,我們會努力分享更多優秀的文章。
這段JS程式碼主要是往canvas容器中建構一個Canvas對象,並且對這個canvas對象的外觀以及動畫屬性作了初始化。

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

熱門話題

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

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

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

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

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

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

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