亚洲免费不卡_在线视频精品_国产尤物精品_久久久久网址_久久精品91_欧美va天堂在线_狠狠入ady亚洲精品_亚洲午夜精品福利_国产精品草草_午夜精品久久99蜜桃的功能介绍

實例教程 HTML5 Canvas 超炫酷煙花綻放動畫實現代碼
來源:易賢網 閱讀:2416 次 日期:2016-07-11 09:56:47
溫馨提示:易賢網小編為您整理了“實例教程 HTML5 Canvas 超炫酷煙花綻放動畫實現代碼”,方便廣大網友查閱!

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

名單

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

HTML代碼:

XML/HTML Code

<div id=”gui”></div>  

<div id=”canvas-container”> <div id=”mountains2″></div>    

<div id=”mountains1″></div><div id=”skyline”></div> </div>  

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

CSS代碼:

CSS Code

#canvas-container { background: #000 url(bg.jpg); height: 400px; left: 50%; margin: -200px 0 0 -300px; position: absolute; top: 50%; width: 600px; z-index: 2;   

} canvas { cursor: crosshair; display: block; position: relative; z-index: 3;   

} canvas:active { cursor: crosshair;   

} #skyline { background: url(skyline.png) repeat-x 50% 0; bottombottom: 0; height: 135px; left: 0; position: absolute; width: 100%; z-index: 1;       

} #mountains1 { background: url(mountains1.png) repeat-x 40% 0; bottombottom: 0; height: 200px; left: 0; position: absolute; width: 100%; z-index: 1;       

} #mountains2 { background: url(mountains2.png) repeat-x 30% 0; bottombottom: 0; height: 250px; left: 0; position: absolute; width: 100%; z-index: 1;       

} #gui { rightright: 0; position: fixed; top: 0; z-index: 3;   

}  

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

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

Javascript代碼:

JavaScript Code

self.init = function(){       

    self.dt = 0;   

        self.oldTime = Date.now();   

        self.canvas = document.createElement('canvas');                   

        self.canvasContainer = $('#canvas-container'); var canvasContainerDisabled = document.getElementById('canvas-container');   

        self.canvas.onselectstart = function() { return false;   

        };   

        self.canvas.width = self.cw = 600;   

        self.canvas.height = self.ch = 400;       

        self.particles = [];       

        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 = 'round';   

        self.ctx.lineJoin = 'round';   

        self.lineWidth = 1;   

        self.bindEvents();               

        self.canvasLoop();   

        self.canvas.onselectstart = function() { return false;   

        };   

    };  

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

JavaScript Code

var Particle = function(x, y, hue){ this.x = x; this.y = y; this.coordLast = [   

            {x: x, y: y},   

            {x: x, y: y},   

            {x: x, y: y}   

        ]; 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;   

    };   

    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){                       

            self.particles.splice(index, 1);       

        }               

    };   

    Particle.prototype.draw = function(){ var coordRand = (rand(1,3)-1);   

        self.ctx.beginPath();                                   

        self.ctx.moveTo(Math.round(this.coordLast[coordRand].x), Math.round(this.coordLast[coordRand].y));   

        self.ctx.lineTo(Math.round(this.x), Math.round(this.y));   

        self.ctx.closePath();                   

        self.ctx.strokeStyle = 'hsla('+this.hue+', 100%, '+this.brightness+'%, '+this.alpha+')';   

        self.ctx.stroke(); if(self.flickerDensity > 0){ var inverseDensity = 50 - self.flickerDensity; if(rand(0, inverseDensity) === inverseDensity){   

                self.ctx.beginPath();   

                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;   

                self.ctx.fillStyle = 'hsla('+this.hue+', 100%, '+this.brightness+'%, '+randAlpha+')';   

                self.ctx.fill();   

            }       

        }   

    };  

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

JavaScript Code

var Firework = function(startX, startY, targetX, targetY){ this.x = startX; this.y = startY; this.startX = startX; this.startY = startY; this.hitX = false; this.hitY = false; this.coordLast = [   

            {x: startX, y: startY},   

            {x: startX, y: startY},   

            {x: startX, y: startY}   

        ]; 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;   

    };   

    Firework.prototype.update = function(index){   

        self.ctx.lineWidth = this.lineWidth;   

        vx = Math.cos(this.angle) * this.speed,   

        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;   

            } else { this.targetRadius = 1 * self.dt;       

            }   

        } if(this.startX >= this.targetX){ if(this.x + vx <= this.targetX){ this.x = this.targetX; this.hitX = true;   

            } else { this.x += vx * self.dt;   

            }   

        } else { if(this.x + vx >= this.targetX){ this.x = this.targetX; this.hitX = true;   

            } else { this.x += vx * self.dt;   

            }   

        } if(this.startY >= this.targetY){ if(this.y + vy <= this.targetY){ this.y = this.targetY; this.hitY = true;   

            } else { this.y += vy * self.dt;   

            }   

        } else { if(this.y + vy >= this.targetY){ this.y = this.targetY; this.hitY = true;   

            } else { this.y += vy * self.dt;   

            }   

        } if(this.hitX && this.hitY){ var randExplosion = rand(0, 9);   

            self.createParticles(this.targetX, this.targetY, this.hue);   

            self.fireworks.splice(index, 1);                       

        }   

    };   

    Firework.prototype.draw = function(){   

        self.ctx.lineWidth = this.lineWidth; var coordRand = (rand(1,3)-1);                       

        self.ctx.beginPath();                               

        self.ctx.moveTo(Math.round(this.coordLast[coordRand].x), Math.round(this.coordLast[coordRand].y));   

        self.ctx.lineTo(Math.round(this.x), Math.round(this.y));   

        self.ctx.closePath();   

        self.ctx.strokeStyle = 'hsla('+this.hue+', 100%, '+this.brightness+'%, '+this.alpha+')';   

        self.ctx.stroke(); if(self.showTarget){   

            self.ctx.save();   

            self.ctx.beginPath();   

            self.ctx.arc(Math.round(this.targetX), Math.round(this.targetY), this.targetRadius, 0, Math.PI*2, false)   

            self.ctx.closePath();   

            self.ctx.lineWidth = 1;   

            self.ctx.stroke();   

            self.ctx.restore();   

        } if(self.showShockwave){   

            self.ctx.save();   

            self.ctx.translate(Math.round(this.x), Math.round(this.y));   

            self.ctx.rotate(this.shockwaveAngle);   

            self.ctx.beginPath();   

            self.ctx.arc(0, 0, 1*(this.speed/5), 0, Math.PI, true);   

            self.ctx.strokeStyle = 'hsla('+this.hue+', 100%, '+this.brightness+'%, '+rand(25, 60)/100+')';   

            self.ctx.lineWidth = this.lineWidth;   

            self.ctx.stroke();   

            self.ctx.restore();   

        }                                    

    };  

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

這款HTML5 Canvas煙花效果的核心代碼就是這樣,謝謝閱讀,希望能幫到大家

更多信息請查看網頁制作
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點

版權所有:易賢網

亚洲免费不卡_在线视频精品_国产尤物精品_久久久久网址_久久精品91_欧美va天堂在线_狠狠入ady亚洲精品_亚洲午夜精品福利_国产精品草草_午夜精品久久99蜜桃的功能介绍
激情亚洲成人| 国产日韩欧美在线播放不卡| 99精品国产高清一区二区| 亚洲激情社区| 亚洲一区二区动漫| 欧美精品二区| 99精品热6080yy久久| 国产精品一级| 欧美fxxxxxx另类| 在线播放日韩| 久久青青草综合| 尤物精品在线| 久久riav二区三区| 伊人成年综合电影网| 亚洲一区三区视频在线观看| 欧美午夜精品理论片a级大开眼界| 亚洲国产欧美不卡在线观看| 久久婷婷久久| 9色精品在线| 欧美成人蜜桃| 亚洲一区在线免费| 亚洲高清在线播放| 你懂的国产精品| 国产精品手机在线| 在线观看一区| 欧美视频二区| 久久最新视频| 久久本道综合色狠狠五月| 亚洲福利久久| 红桃视频国产一区| 欧美精品国产一区| 久久久久欧美| 久久本道综合色狠狠五月| 国产欧美一级| 日韩视频不卡| 日韩一区二区久久| 日韩网站在线| 亚洲日本久久| 99国内精品| 9色精品在线| 一区久久精品| 在线观看日韩av电影| 国产精品jizz在线观看美国| 欧美在线资源| 欧美精品不卡| 国产一区二区中文字幕免费看| 欧美国产专区| 国产精品二区二区三区| 国产精品vip| 国产精品地址| 亚洲高清视频一区| 在线亚洲国产精品网站| 国产精品久久亚洲7777| 亚洲一区高清| 久久综合一区二区三区| 欧美日韩国产不卡在线看| 亚洲欧美亚洲| 黄色亚洲免费| 一区二区精品| 亚洲综合好骚| 午夜日韩激情| 亚洲天堂偷拍| 日韩午夜免费| 久久香蕉精品| 亚洲欧美一区二区原创| 韩国自拍一区| 99爱精品视频| 久久久久久穴| 一区国产精品| 美女诱惑一区| 一区免费在线| 香蕉精品999视频一区二区 | 欧美在线亚洲| 欧美日韩中文| 在线视频精品一区| 久久一综合视频| 一区精品久久| 欧美综合77777色婷婷| 国产精品久久7| 在线视频精品| 欧美日韩一区二区视频在线| 亚洲黄色毛片| 欧美成人首页| 国产三级精品在线不卡| 欧美视频1区| 免费看亚洲片| 亚洲高清资源综合久久精品| 久久久久天天天天| 亚洲欧洲精品一区二区三区波多野1战4| 国产精品久久国产三级国电话系列 | 国产一区白浆| 欧美日韩免费高清| 羞羞视频在线观看欧美| 亚洲精品社区| 国产综合欧美| 欧美在线日韩精品| 欧美亚洲一区| 一本色道久久综合亚洲精品高清 | 欧美综合二区| av成人黄色| 极品av少妇一区二区| 噜噜噜在线观看免费视频日韩| 国内精品亚洲| 欧美日本韩国在线| 欧美成人一区二免费视频软件| 国产伦精品一区二区三区视频孕妇 | 国产精品一卡| 亚洲高清在线播放| 国产精品v欧美精品∨日韩| 久久精品综合一区| 欧美一级久久| 免费欧美在线| 国产精品久久久久9999高清| 91久久黄色| 在线精品观看| 亚洲国产精品一区二区第一页| 欧美日韩系列| 国产精品av一区二区| 午夜精品国产| 国产在线欧美| 亚洲国产免费看| 亚洲日本国产| 一区二区精品在线| 国产区日韩欧美| 国产精品伊人日日| 宅男噜噜噜66一区二区| 一区二区av| 国产麻豆日韩| 老司机精品视频网站| 午夜精品视频在线观看一区二区| 久久综合中文色婷婷| 久久三级视频| 欧美视频在线观看| 亚洲国产网站| av不卡免费看| 销魂美女一区二区三区视频在线| 国产精品日韩欧美一区二区| 免费亚洲婷婷| 亚洲欧美伊人| 日韩视频精品| 裸体一区二区| 亚洲手机在线| 亚洲欧美久久| 欧美理论在线| 99国产精品| 美女精品在线观看| 精品9999| 亚洲影视在线| 狠狠色狠狠色综合日日tαg| 国产欧美二区| 欧美日韩国产一区精品一区| 99精品99久久久久久宅男| 蜜桃视频一区| 在线精品在线| 久久午夜精品| 一本色道久久综合亚洲精品高清| 久久久久久9| 亚洲精品欧美精品| 久热国产精品| 国产精品五区| 亚洲黄色影片| 欧美日韩日本国产亚洲在线| 99国产精品自拍| 欧美福利一区二区三区| 日韩一级精品| 激情婷婷欧美| 欧美精品在线一区| 蜜桃av综合| 国产伦精品一区二区三区照片91 | 亚洲午夜激情在线| 久久久久综合| 国产欧美一区二区三区国产幕精品| 狂野欧美一区| 亚洲在线黄色| 国产一区二区三区高清| 黄色成人精品网站| 欧美精品aa| 久久伊人亚洲| 久久九九电影| 久久精品在线| 鲁大师影院一区二区三区| 夜夜嗨网站十八久久| 伊甸园精品99久久久久久| 欧美激情亚洲| 欧美一区免费视频| 久久久久成人精品免费播放动漫| 国产日韩欧美一区| 亚洲国产一区二区精品专区| 黄色亚洲在线| 在线播放一区| 亚洲国产婷婷| 一本久道综合久久精品| 日韩视频二区| 国产亚洲综合精品| 亚洲欧美国产精品桃花| 国产美女精品| 美女被久久久| 欧美精品播放| 精品成人久久| 亚洲毛片网站| 亚洲综合日韩| 久久性天堂网| 欧美日韩一区二区国产| 国产精品av久久久久久麻豆网| 欧美久久视频| 亚洲国产婷婷| 国产精品一区二区在线观看 | 国产欧美在线| 国产精品亚洲不卡a| 亚洲一区亚洲| 老牛国产精品一区的观看方式 | 999在线观看精品免费不卡网站| 亚洲一级一区| 国产亚洲一区二区三区在线播放| 国产精品一区视频网站| 麻豆av福利av久久av| 欧美日韩一区二区三区四区在线观看| 国产精品sm| 国产亚洲综合精品| 午夜欧美精品| 一区二区精品国产| 老牛嫩草一区二区三区日本| 黄色成人av网站| 国产农村妇女毛片精品久久莱园子| 每日更新成人在线视频| 国产一区日韩一区| 亚洲一区高清| 精品1区2区| 久久精品二区三区| 亚洲裸体俱乐部裸体舞表演av| 亚洲综合丁香| 亚洲午夜精品久久| 麻豆久久精品| 亚洲精品黄色| 欧美三区在线| 母乳一区在线观看| 亚洲精品国产日韩| 欧美日本三区| 亚洲欧美视频一区二区三区| 国内揄拍国内精品久久| 欧美亚洲网站| 亚洲精品中文字幕在线| 欧美在线日韩精品| 午夜一区不卡| 亚洲久久成人| 亚洲性感美女99在线| 久久一本综合频道| 亚洲一区尤物| 99国产精品99久久久久久粉嫩| 欧美区一区二| 久久美女性网| 麻豆精品传媒视频| 亚洲伊人观看| 欧美日韩四区| 亚洲自拍另类| 久久亚洲图片| 国产欧美精品| 一区视频在线看| 久久在线91| 欧美亚洲免费| 国产日韩欧美一区二区| 亚洲高清二区| 一区视频在线| 黄色亚洲在线| 伊甸园精品99久久久久久| 国产精品www.| 亚洲性人人天天夜夜摸| 韩国亚洲精品| 激情久久一区| 极品日韩av| 亚洲欧洲精品一区| 99国产精品久久久久久久| 亚洲特色特黄| 亚洲欧洲另类| 国产精品日本| 一本久道久久久| 亚洲黄色免费| aa国产精品| 亚洲免费不卡| 亚洲综合不卡| 久久精品1区| 欧美高清不卡| 激情欧美丁香| 亚洲精品系列| 亚洲免费影院| 欧美精品大片| 亚洲黄色成人久久久| 一区二区三区精品国产| 久久av最新网址| 欧美日韩中文| 亚洲国内在线| 麻豆精品91| 国产伊人精品| 国产日韩欧美综合精品| 久久亚洲二区| 国产一区二区三区自拍| 日韩午夜激情| 狼狼综合久久久久综合网| 亚洲手机在线| 亚洲欧美日韩国产| 狠狠爱www人成狠狠爱综合网| 日韩视频久久| 欧美不卡在线| 亚洲精品影院| 欧美在线91| 国产日韩亚洲欧美精品| 欧美精品九九| 亚洲一区二区三区精品在线观看 | 亚洲一区视频| 欧美视频在线观看| 亚洲综合电影一区二区三区| 国产精品啊啊啊| 亚洲欧美日韩一区在线观看| 黑人中文字幕一区二区三区| 蘑菇福利视频一区播放| 影音国产精品| 欧美日本不卡| 美女精品国产| 国产亚洲在线观看| 亚洲国产精品久久久久婷婷老年| 久久成人免费| 国产欧美三级| 亚洲国产电影| 国产精品a级| 狂野欧美一区| 欧美亚洲在线| 一本一本久久| 亚洲三级影院| 在线成人欧美| 亚洲午夜电影| 国产综合色一区二区三区| 久久综合九色99| 噜噜噜91成人网| 亚洲一区成人| 亚洲一区二区精品在线| 一区二区不卡在线视频 午夜欧美不卡'| 欧美激情91| 欧美大片专区| 欧美激情第8页| 欧美黄色aaaa| 欧美1区视频| 午夜天堂精品久久久久| 你懂的亚洲视频| 老司机精品久久| 欧美一区二区三区在线播放 | 国产亚洲永久域名| 亚洲国产网站| 日韩一级欧洲| 99精品欧美| 国产一区二区三区久久| 亚洲一区二区在线看| 欧美专区18| 欧美成人69av| 国产一区自拍视频| 亚洲国产婷婷| 一区二区精品国产| 国产亚洲精品v| 亚洲综合精品四区| 久久一区中文字幕| 欧美午夜在线| 亚洲国产免费看| 国产婷婷精品| 欧美1区3d| 亚洲午夜极品| 国产一区二区黄色| 久久一二三区| 在线国产精品一区| 国产精品外国| 欧美日韩国产高清视频| 亚洲国产欧美日韩| 国产伦精品一区二区三区视频孕妇| 麻豆av一区二区三区| 国产精品99一区二区| 一本色道久久综合亚洲精品不 | 欧美日韩四区| 亚洲欧洲日本国产| 性xx色xx综合久久久xx| 久久视频一区| 最新国产乱人伦偷精品免费网站| 国产伦精品一区二区三区高清版| 久久午夜激情| 日韩视频一区| 欧美日本精品| 国产乱人伦精品一区二区| 欧美久久一级| 国产精品腿扒开做爽爽爽挤奶网站| 你懂的国产精品| 99在线精品视频在线观看| 欧美一区二区三区四区在线观看地址 | 欧美日韩视频在线一区二区观看视频| 黄色精品一区| 久久精品中文| 国产亚洲欧美另类一区二区三区| 欧美日韩喷水| 久久精品日韩欧美| 99成人在线| 亚洲无线视频| 欧美精品一区二区视频| 噜噜噜躁狠狠躁狠狠精品视频| 在线播放不卡|