婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 實例教程 HTML5 Canvas 超炫酷煙花綻放動畫實現代碼

實例教程 HTML5 Canvas 超炫酷煙花綻放動畫實現代碼

熱門標簽:申請400電話流程簡介 呼和浩特外呼電銷系統排名 阜陽企業外呼系統 外呼線穩定線路 地圖標注位置能賺錢嗎 pageadm實現地圖標注 南通數據外呼系統推廣 外呼系統電話怎么投訴 邢臺縣地圖標注app

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

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

  HTML代碼:

XML/HTML Code復制內容到剪貼板
  1. <div id=”gui”></div>  
  2. <div id=”canvas-container”> <div id=”mountains2″></div>    
  3. <div id=”mountains1″></div><div id=”skyline”></div> </div>  

  HTML的結構非常簡單,即構造了一個canvas容器,我們會利用JS在這個容器中生成一個Canvas對象。看最后的JS代碼你就會知道了。

  CSS代碼:

CSS Code復制內容到剪貼板
  1. #canvas-container { background#000 url(bg.jpg); height400pxleft: 50%; margin: -200px 0 0 -300pxpositionabsolutetop: 50%; width600pxz-index: 2;   
  2. } canvas { cursorcrosshairdisplayblockpositionrelativez-index: 3;   
  3. } canvas:active { cursorcrosshair;   
  4. #skyline { backgroundurl(skyline.png) repeat-x 50% 0; bottombottom: 0; height135pxleft: 0; positionabsolutewidth: 100%; z-index: 1;       
  5. #mountains1 { backgroundurl(mountains1.png) repeat-x 40% 0; bottombottom: 0; height200pxleft: 0; positionabsolutewidth: 100%; z-index: 1;       
  6. #mountains2 { backgroundurl(mountains2.png) repeat-x 30% 0; bottombottom: 0; height250pxleft: 0; positionabsolutewidth: 100%; z-index: 1;       
  7. #gui { rightright: 0; positionfixedtop: 0; z-index: 3;   
  8. }  

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

  接下來是最重要的Javascript代碼。

  Javascript代碼:

JavaScript Code復制內容到剪貼板
  1. self.init = function(){       
  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');   
  6.         self.canvas.onselectstart = function() { return false;   
  7.         };   
  8.   
  9.         self.canvas.width = self.cw = 600;   
  10.         self.canvas.height = self.ch = 400;       
  11.   
  12.         self.particles = [];       
  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 = 'round';   
  36.         self.ctx.lineJoin = 'round';   
  37.         self.lineWidth = 1;   
  38.         self.bindEvents();               
  39.         self.canvasLoop();   
  40.   
  41.         self.canvas.onselectstart = function() { return false;   
  42.         };   
  43.   
  44.     };  

  這段JS代碼主要是往canvas容器中構造一個Canvas對象,并且對這個canvas對象的外觀以及動畫屬性作了初始化。

JavaScript Code復制內容到剪貼板
  1. var Particle = function(x, y, hue){ this.x = x; this.y = y; this.coordLast = [   
  2.             {x: x, y: y},   
  3.             {x: x, y: y},   
  4.             {x: x, y: y}   
  5.         ]; this.angle = rand(0, 360); this.speed = rand(((self.partSpeed - self.partSpeedVariance) <= 0) ? 1 : self.partSpeed - self.partSpeedVariance, (self.partSpeed + self.partSpeedVariance)); this.friction = 1 - self.partFriction/100; this.gravity = self.partGravity/2; this.hue = rand(hue-self.hueVariance, hue+self.hueVariance); this.brightness = rand(50, 80); this.alpha = rand(40,100)/100; this.decay = rand(10, 50)/1000; this.wind = (rand(0, self.partWind) - (self.partWind/2))/25; this.lineWidth = self.lineWidth;   
  6.     };   
  7.   
  8.     Particle.prototype.update = function(index){ var radians = this.angle * Math.PI / 180; var vx = Math.cos(radians) * this.speed; var vy = Math.sin(radians) * this.speed + this.gravity; this.speed *= this.friction; this.coordLast[2].x = this.coordLast[1].x; this.coordLast[2].y = this.coordLast[1].y; this.coordLast[1].x = this.coordLast[0].x; this.coordLast[1].y = this.coordLast[0].y; this.coordLast[0].x = this.x; this.coordLast[0].y = this.y; this.x += vx * self.dt; this.y += vy * self.dt; this.angle += this.wind; this.alpha -= this.decay; if(!hitTest(0,0,self.cw,self.ch,this.x-this.radius, this.y-this.radius, this.radius*2, this.radius*2) || this.alpha < .05){                       
  9.             self.particles.splice(index, 1);       
  10.         }               
  11.     };   
  12.   
  13.     Particle.prototype.draw = function(){ var coordRand = (rand(1,3)-1);   
  14.         self.ctx.beginPath();                                   
  15.         self.ctx.moveTo(Math.round(this.coordLast[coordRand].x), Math.round(this.coordLast[coordRand].y));   
  16.         self.ctx.lineTo(Math.round(this.x), Math.round(this.y));   
  17.         self.ctx.closePath();                   
  18.         self.ctx.strokeStyle = 'hsla('+this.hue+', 100%, '+this.brightness+'%, '+this.alpha+')';   
  19.         self.ctx.stroke(); if(self.flickerDensity > 0){ var inverseDensity = 50 - self.flickerDensity; if(rand(0, inverseDensity) === inverseDensity){   
  20.                 self.ctx.beginPath();   
  21.                 self.ctx.arc(Math.round(this.x), Math.round(this.y), rand(this.lineWidth,this.lineWidth+3)/2, 0, Math.PI*2, false)  self.ctx.closePath(); var randAlpha = rand(50,100)/100;   
  22.                 self.ctx.fillStyle = 'hsla('+this.hue+', 100%, '+this.brightness+'%, '+randAlpha+')';   
  23.                 self.ctx.fill();   
  24.             }       
  25.         }   
  26.     };  

  這段JS代碼的功能是實現煙花爆炸后的小顆粒的繪制,從draw方法中可以看出,創建幾個隨機點,煙花顆粒即可在這個范圍的隨機點中散落。

JavaScript Code復制內容到剪貼板
  1. var Firework = function(startX, startY, targetX, targetY){ this.x = startX; this.y = startY; this.startX = startX; this.startY = startY; this.hitX = falsethis.hitY = falsethis.coordLast = [   
  2.             {x: startX, y: startY},   
  3.             {x: startX, y: startY},   
  4.             {x: startX, y: startY}   
  5.         ]; this.targetX = targetX; this.targetY = targetY; this.speed = self.fworkSpeed; this.angle = Math.atan2(targetY - startY, targetX - startX); this.shockwaveAngle = Math.atan2(targetY - startY, targetX - startX)+(90*(Math.PI/180)); this.acceleration = self.fworkAccel/100; this.hue = self.currentHue; this.brightness = rand(50, 80); this.alpha = rand(50,100)/100; this.lineWidth = self.lineWidth; this.targetRadius = 1;   
  6.     };   
  7.   
  8.     Firework.prototype.update = function(index){   
  9.         self.ctx.lineWidth = this.lineWidth;   
  10.   
  11.         vx = Math.cos(this.angle) * this.speed,   
  12.         vy = Math.sin(this.angle) * this.speed; this.speed *= 1 + this.acceleration; this.coordLast[2].x = this.coordLast[1].x; this.coordLast[2].y = this.coordLast[1].y; this.coordLast[1].x = this.coordLast[0].x; this.coordLast[1].y = this.coordLast[0].y; this.coordLast[0].x = this.x; this.coordLast[0].y = this.y; if(self.showTarget){ if(this.targetRadius < 8){ this.targetRadius += .25 * self.dt;   
  13.             } else { this.targetRadius = 1 * self.dt;       
  14.             }   
  15.         } if(this.startX >= this.targetX){ if(this.x + vx <= this.targetX){ this.x = this.targetX; this.hitX = true;   
  16.             } else { this.x += vx * self.dt;   
  17.             }   
  18.         } else { if(this.x + vx >= this.targetX){ this.x = this.targetX; this.hitX = true;   
  19.             } else { this.x += vx * self.dt;   
  20.             }   
  21.         } if(this.startY >= this.targetY){ if(this.y + vy <= this.targetY){ this.y = this.targetY; this.hitY = true;   
  22.             } else { this.y += vy * self.dt;   
  23.             }   
  24.         } else { if(this.y + vy >= this.targetY){ this.y = this.targetY; this.hitY = true;   
  25.             } else { this.y += vy * self.dt;   
  26.             }   
  27.         } if(this.hitX && this.hitY){ var randExplosion = rand(0, 9);   
  28.             self.createParticles(this.targetX, this.targetY, this.hue);   
  29.             self.fireworks.splice(index, 1);                       
  30.         }   
  31.     };   
  32.   
  33.     Firework.prototype.draw = function(){   
  34.         self.ctx.lineWidth = this.lineWidth; var coordRand = (rand(1,3)-1);                       
  35.         self.ctx.beginPath();                               
  36.         self.ctx.moveTo(Math.round(this.coordLast[coordRand].x), Math.round(this.coordLast[coordRand].y));   
  37.         self.ctx.lineTo(Math.round(this.x), Math.round(this.y));   
  38.         self.ctx.closePath();   
  39.         self.ctx.strokeStyle = 'hsla('+this.hue+', 100%, '+this.brightness+'%, '+this.alpha+')';   
  40.         self.ctx.stroke(); if(self.showTarget){   
  41.             self.ctx.save();   
  42.             self.ctx.beginPath();   
  43.             self.ctx.arc(Math.round(this.targetX), Math.round(this.targetY), this.targetRadius, 0, Math.PI*2, false)   
  44.             self.ctx.closePath();   
  45.             self.ctx.lineWidth = 1;   
  46.             self.ctx.stroke();   
  47.             self.ctx.restore();   
  48.         } if(self.showShockwave){   
  49.             self.ctx.save();   
  50.             self.ctx.translate(Math.round(this.x), Math.round(this.y));   
  51.             self.ctx.rotate(this.shockwaveAngle);   
  52.             self.ctx.beginPath();   
  53.             self.ctx.arc(0, 0, 1*(this.speed/5), 0, Math.PI, true);   
  54.             self.ctx.strokeStyle = 'hsla('+this.hue+', 100%, '+this.brightness+'%, '+rand(25, 60)/100+')';   
  55.             self.ctx.lineWidth = this.lineWidth;   
  56.             self.ctx.stroke();   
  57.             self.ctx.restore();   
  58.         }                                    
  59.     };  

  這段JS代碼是創建煙花實例的,我們也可以從draw方法中看出,當我們鼠標點擊畫布中的某點時,煙花發射的目的地就在那個點上。

  這款HTML5 Canvas煙花效果的核心代碼就是這樣,謝謝閱讀,希望能幫到大家,請繼續關注腳本之家,我們會努力分享更多優秀的文章。

標簽:辛集 楊凌 黃山 撫順 蚌埠 內蒙古 鶴崗 德州

巨人網絡通訊聲明:本文標題《實例教程 HTML5 Canvas 超炫酷煙花綻放動畫實現代碼》,本文關鍵詞  實例,教程,HTML5,Canvas,超炫,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《實例教程 HTML5 Canvas 超炫酷煙花綻放動畫實現代碼》相關的同類信息!
  • 本頁收集關于實例教程 HTML5 Canvas 超炫酷煙花綻放動畫實現代碼的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产成人av自拍| 91精品国产一区二区三区蜜臀| 粉嫩av一区二区三区粉嫩| 欧美一区二区播放| 免费视频最近日韩| 欧美一区二区三区免费视频 | 亚洲视频在线一区| 成人开心网精品视频| 亚洲三级在线观看| 欧美日本一区二区| 开心九九激情九九欧美日韩精美视频电影| 91精品综合久久久久久| 麻豆91免费观看| 国产日韩一级二级三级| 99这里都是精品| 亚洲一级片在线观看| 欧美一区欧美二区| 国产精品亚洲人在线观看| 亚洲色图欧洲色图婷婷| 91精品久久久久久蜜臀| 国产成人av电影在线播放| 亚洲免费伊人电影| 日韩你懂的电影在线观看| 大桥未久av一区二区三区中文| 一区二区三区在线视频观看 | 欧美在线|欧美| 久久国产乱子精品免费女| 国产片一区二区| 精品1区2区3区| 国产精品88888| 午夜伊人狠狠久久| 国产午夜精品一区二区三区嫩草| 一本大道久久a久久综合婷婷| 五月天婷婷综合| 国产精品天干天干在线综合| 欧美男人的天堂一二区| 成人a免费在线看| 蜜臀a∨国产成人精品| 亚洲精品乱码久久久久久| 日韩欧美国产综合一区| 91影视在线播放| 国产自产高清不卡| 日韩av一区二区三区| 日韩毛片精品高清免费| 久久久91精品国产一区二区精品 | 亚洲国产精品麻豆| 国产欧美一区二区精品忘忧草| 欧美日韩亚洲综合一区二区三区| 精品一区二区精品| 一区二区三区在线观看欧美| 久久午夜羞羞影院免费观看| 67194成人在线观看| 一本大道久久精品懂色aⅴ| 成人h精品动漫一区二区三区| 国产成人免费视频网站| 精品在线观看视频| 免费成人在线视频观看| 亚洲最新视频在线观看| 国产精品成人免费| 26uuu另类欧美| 精品国产乱码久久久久久1区2区| 欧美一区二区三区视频免费播放| 国产一区二区不卡| 免费看欧美女人艹b| 亚洲在线视频免费观看| 一区二区三区四区蜜桃| 亚洲欧美国产77777| 精品国产电影一区二区| 日韩一区二区三区在线视频| 欧美群妇大交群中文字幕| 97精品国产露脸对白| 国产91精品欧美| 国产综合色产在线精品| 国产精品亚洲成人| 国产美女av一区二区三区| 蜜臀av性久久久久蜜臀aⅴ流畅| 亚洲国产精品久久久男人的天堂 | 欧美tickling网站挠脚心| 一区2区3区在线看| 麻豆高清免费国产一区| 日韩在线一区二区三区| 亚洲成年人影院| 日韩电影网1区2区| 久久久不卡网国产精品一区| 欧美福利电影网| 91在线视频官网| 奇米精品一区二区三区四区| 亚洲国产精品影院| 蜜臀av性久久久久蜜臀aⅴ流畅| 欧美精品高清视频| 一区二区三区四区在线免费观看 | 欧美成人bangbros| 91极品视觉盛宴| 岛国一区二区在线观看| 色哟哟亚洲精品| 国内久久精品视频| 91毛片在线观看| 国产精品久久久久婷婷二区次| 国产精品人成在线观看免费| 亚洲欧美日韩中文字幕一区二区三区 | 欧美日韩亚洲高清一区二区| 99久免费精品视频在线观看| 国产精品一卡二| 欧美视频三区在线播放| 93久久精品日日躁夜夜躁欧美| 91在线丨porny丨国产| 国产日韩精品一区二区三区| 欧美亚洲国产一区二区三区va | 中文字幕一区二区日韩精品绯色| 国产精品久久久久久久久快鸭 | 亚洲第一福利视频在线| 日本一区二区免费在线| 亚洲国产精品激情在线观看| 国产精品超碰97尤物18| 日韩精品乱码免费| 欧美喷潮久久久xxxxx| 555www色欧美视频| 国产精品丝袜一区| 国产福利精品导航| 欧美乱妇15p| 国产在线国偷精品产拍免费yy | 国产色产综合产在线视频| 椎名由奈av一区二区三区| 日韩一二三四区| 91视频免费看| 成人av中文字幕| 波多野结衣欧美| 韩国女主播一区二区三区| 日韩精品欧美精品| 久久精品国产精品亚洲红杏| 免费看精品久久片| 亚洲午夜免费电影| 国产精品伦理在线| 亚洲国产中文字幕在线视频综合| 亚洲精品欧美激情| 日本亚洲电影天堂| 激情av综合网| av资源网一区| 欧美另类高清zo欧美| 国产黄人亚洲片| www.欧美.com| 欧美一区二区三区小说| 中文字幕不卡在线观看| 亚洲成人av在线电影| 丰满亚洲少妇av| 欧美二区乱c少妇| 亚洲欧洲国产日本综合| 亚洲成人在线观看视频| 午夜精品福利视频网站| 99精品欧美一区二区三区小说| 欧美一级在线免费| 一区二区三区精品视频在线| 美女视频第一区二区三区免费观看网站| 国产一区二区剧情av在线| 欧美亚洲国产一区二区三区va| 精品国产乱码久久久久久影片| 亚洲综合色噜噜狠狠| 欧美精品免费视频| 久久久久久久久99精品| 五月天中文字幕一区二区| 91污片在线观看| 日韩理论片一区二区| 波多野结衣91| 国产精品乱子久久久久| 国产精品一区二区久久精品爱涩| 欧美精品久久99| 免费观看在线综合| 欧美一区二区久久| 麻豆精品一区二区综合av| 在线视频你懂得一区二区三区| 国产喷白浆一区二区三区| 激情综合亚洲精品| 日韩精品中文字幕在线不卡尤物 | 久久久久成人黄色影片| 成人动漫在线一区| 亚洲欧美另类久久久精品2019| jizz一区二区| 日韩av中文字幕一区二区| 国产日韩欧美电影| 欧美图片一区二区三区| 另类欧美日韩国产在线| 亚洲视频一区在线观看| 精品国产一区二区三区av性色| 99久久综合99久久综合网站| 亚洲免费在线观看视频| 国产欧美一区二区三区沐欲| 91美女在线视频| 国产综合色精品一区二区三区| 亚洲女同ⅹxx女同tv| 国产亚洲1区2区3区| 久久久99久久| 国产精品护士白丝一区av| 色天天综合色天天久久| 日韩av高清在线观看| 亚洲在线观看免费视频| 亚洲日本中文字幕区| 亚洲日本青草视频在线怡红院| 久久精品人人爽人人爽| 欧美激情一区二区三区不卡| 国产亚洲欧美激情|