这是一个很酷的HTML5 Canvas动画,它将模拟的是我们现实生活中烟花绽放的动画特效,效果非常逼真,但是毕竟是电脑模拟,带女朋友看就算了,效果还是差了点,呵呵。这个HTML5 Canvas动画有一点比较出色,就是其性能,Chrome上基本没有卡的感觉,就算你放出很多烟花也一样。

你可以在这里看在线演示

下面我们来简单分析一下实现这款HTML5烟花特效的过程及代码,主要由HTML代码、CSS代码以及Javascript代码组成,当然javascript代码是最重要的。

HTML代码:

<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代码:

#canvas-container {
background: #000 url(bg.jpg);
height: 400px;
left: 50%;
margin: -200px 0 0 -300px;
position: absolute;
top: 50%;
width: 600px;
z-index:;
} canvas {
cursor: crosshair;
display: block;
position: relative;
z-index:;
} canvas:active {
cursor: crosshair;
} #skyline {
background: url(skyline.png) repeat-x 50% 0;
bottom:;
height: 135px;
left:;
position: absolute;
width: 100%;
z-index:;
} #mountains1 {
background: url(mountains1.png) repeat-x 40% 0;
bottom:;
height: 200px;
left:;
position: absolute;
width: 100%;
z-index:;
} #mountains2 {
background: url(mountains2.png) repeat-x 30% 0;
bottom:;
height: 250px;
left:;
position: absolute;
width: 100%;
z-index:;
} #gui {
right:;
position: fixed;
top:;
z-index:;
}

CSS代码没什么特别,主要也就定义一下背景色和边框之类的。

接下来是最重要的Javascript代码。

Javascript代码:

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对象的外观以及动画属性作了初始化。

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方法中可以看出,创建几个随机点,烟花颗粒即可在这个范围的随机点中散落。

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烟花效果的核心代码就是这样,全部的代码还请各位下载源代码研究。源代码下载>>

HTML5 Canvas 超炫酷烟花绽放动画教程的更多相关文章

  1. 手把手带你做一个超炫酷loading成功动画view Android自定义view

    写在前面: 本篇可能是手把手自定义view系列最后一篇了,实际上我也是一周前才开始真正接触自定义view,通过这一周的练习,基本上已经熟练自定义view,能够应对一般的view需要,那么就以本篇来结尾 ...

  2. 程序猿必备的10款超炫酷HTML5 Canvas插件

    1.超炫酷HTML5 Canvas 3D旋转地球动画 这是一款基于HTML5 Canvas的3D地球模拟动画,动画以太空作为背景,地球在太空中旋转,同时我们也可以拖拽鼠标来从不同的角度观察地球.另外我 ...

  3. 8个超炫酷仿HTML5动画源码

    1.jQuery万年历插件 带农历老皇历功能 这是一款基于jQuery的日历插件,这款日历插件和之前分享的日历控件有很大差异,它是一本万年历,包含了农历已经老皇历的功能,是一个挑好日子的工具.同时日历 ...

  4. HTML5 Canvas 超逼真烟花绽放动画

    各位前端朋友们,大家好!五一假期即将结束,在开启加班模式之前,我要给大家分享一个超酷超逼真的HTML5 Canvas烟花模拟动画.这次升级版的烟花动画有以下几个特点: 烟花绽放时,将展现不同的色彩,不 ...

  5. html5跟随鼠标炫酷网站引导页动画特效

    html5跟随鼠标炫酷网站引导页动画特效一款非常不错的引导页,文字效果渐变,鼠标跟随出绚丽的条纹.html5炫酷网站引导页,鼠标跟随出特效. 体验效果:http://hovertree.com/tex ...

  6. HTML5夜空烟花绽放动画效果

    模板描述:HTML5夜空烟花绽放动画效果基于HTML5 canvas制作,模拟夜空烟花绽放动画效果,烟花会在夜空打出贺词,有新年快乐.合家幸福.万事如意.心想事成.财源广进等,文字可以自定义,做成各种 ...

  7. 8个超炫酷的纯CSS3动画及源码分享

    在现代网页中,我们已经越来越习惯使用大量的CSS3元素,而现在的浏览器也基本都支持CSS3,所以很多时候我们不妨思考一下是否可以用纯CSS3制作一些有趣或者实用的网页.本文要分享8个超炫酷的纯CSS3 ...

  8. 超炫酷的jQuery/HTML5应用效果及源码

    jQuery非常强大,我们之前也用jQuery分享过很多实用的插件.HTML5可以让网页变得更加绚丽多彩,将HTML5和jQuery结合使用那将发挥更棒的效果. 今天向大家收集了一些关于HTML5和j ...

  9. 为网格布局图片打造的超炫 CSS 加载动画

    今天,我想与大家分享一些专门为网格布局的图像制作的很酷的 CSS 加载动画效果.您可以把这些效果用在你的作品集,博客或任何你想要的网页中.设置很简单.我们使用了下面这些工具库来实现这个效果: Norm ...

随机推荐

  1. Python3判断shell下进程是否存在&&启动&&邮件通知

    判断进程是否存在 def isRunning(process_name): try: process = len(os.popen('ps aux | grep "' + process_n ...

  2. fzu2158

    http://acm.fzu.edu.cn/problem.php?pid=2158 在密室逃脱游戏中,大家被困在一个密室中,为了逃出密室,需要找到正确的数字密码,于是大家分头行动,分别找到了密码的子 ...

  3. spring中xml配置方式和注解annoation方式(包括@autowired和@resource)的区别

    xml文件中配置itemSqlParameterSourceProvider是可以的: <bean id="billDbWriter" class="com.aa. ...

  4. SnowNLP:•中文分词•词性标准•提取文本摘要,•提取文本关键词,•转换成拼音•繁体转简体的 处理中文文本的Python3 类库

    SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和Te ...

  5. 我的zsh简单设置

    bash用久了,有些地方开始觉得不爽,于是想看看有没有更好的选择.原来在网上瞎逛时,已经很多次看到有人推荐zsh了,加上zsh高度兼容bash,于是就来折腾这个. 不过试验了一下oh-my-zsh,感 ...

  6. 封装篇——图片模块(Glide)

    如今市面上差点儿全部的app都用到了图片,图片模块的开发是app开发中不可缺少的一块工作, 开源的力量是强大的.好多优秀的第三方项目能够任君使用,帮助我们提高效率.而且不须要反复造轮子,这边我採用的是 ...

  7. 【Unity】角色沿路线移动/朝着目标移动

    先在场景中放置一连串物体作为角色移动路线的关键点,可以把关键点的触发器Trigger拉得大一些方便角色接触到(如酷跑/赛车类项目可以把关键点的触发器做成拦截整个道路的墙面形状).让角色从开始位置朝着第 ...

  8. STM32cube库配置双ADC的同步规则采样

    http://www.stmcu.org/module/forum/forum.php?mod=viewthread&tid=605203&extra=page%3D&page ...

  9. ubuntu linux下建立stm32开发环境: GCC安装以及工程Makefile建立

    http://blog.csdn.net/embbnux/article/details/17616809

  10. 中国移动DNS IP地址大全(32个省)

    中国移动DNS IP地址,包括广东移动DNS,上海移动DNS,北京移动DNS,陕西移动DNS,江苏移动,山东移动DNS等共全国32个移动省份的DNS IP地址. DNS 用户数 国家 省份 地区 运营 ...