首页 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=”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-容器{ 背景#000 url(bg.jpg); 高度400px; :50%; 边距: -200px 0 0 -300px位置绝对; 顶部:50%; 宽度600px; z 索引:2;   
  2. } 画布 { 光标十字线显示阻止职位相对; z 索引:3;   
  3. } 画布:活动 { 光标十字线;   
  4. #skyline { 背景网址 (skyline.png) 重复-x 50% 0; 底部底部:0; 高度135px; :0; 位置绝对; 宽度:100%; z 索引:1;       
  5. #mountains1 { 背景网址 (mountains1.png) 重复-x 40% 0; 底部底部:0; 高度200px; :0; 位置绝对; 宽度:100%; z 索引:1;       
  6. #mountains2 { 背景网址 (mountains2.png) 重复-x 30% 0; 底部底部:0; 高度250px; :0; 位置绝对; 宽度:100%; z 索引:1;       
  7. #gui { : 0; 位置固定; 顶部:0; z 索引:3;   
  8. }  

  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');   
  6.         self.canvas.onselectstart = 函数() { 返回 false;   
  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 = 函数() { 返回 false;   
  42.         };   
  43.   
  44.     };  

  这段JS代码主要是往canvas容器中构造一个Canvas对象,并且对这个canvas对象的外观以及动画属性作了初始化。

JavaScript Code复制内容到剪贴板
  1. var 粒子 = 函数(x, y, 色调){ 这个.x = x; 这个.y = y; 这个.coordLast = [   
  2.             {x: x, y: y},   
  3.             {x: x, y: y},   
  4.             {x: x, y: y}   
  5.         ]; 这个.angle = rand(0, 360); 这个.speed = rand(((self.partSpeed - self.partSpeedVariance) 这个.friction = 1 - self.partFriction/100; 这个.gravity = self.partGravity/2; 这个.hue = rand(hue-self.hueVariance, hue self.hueVariance); 这个.brightness = rand(50, 80); 这个.alpha = rand(40,100)/100; 这个.decay = rand(10, 50)/1000; 这个.wind = (rand(0, self.partWind) - (self.partWind/2))/25; 这个.lineWidth = self.lineWidth;   
  6.     };   
  7.   
  8.     Particle.prototype.update = 函数(索引){ 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; 这个.coordLast[0].y = 这个.y; 这个.x = vx * self.dt; 这个.y = vy * self.dt; 这个.angle  = 这个.wind; 这个.alpha -= 这个.decay; if(!hitTest(0,0,self.cw,self.ch,这个.x-这个.radius,这个.y-这个.radius,这个.radius*2, 这个.radius*2) ||  这个.alpha 
  9.             self.articles.splice(index, 1);       
  10.         }               
  11.     };   
  12.   
  13.     Particle.prototype.draw = 函数(){ var coordRand = (rand(1,3) -1);   
  14.         self.ctx.beginPath();                                   
  15.         self.ctx.moveTo(Math.round(这个.coordLast[coordRand].x), Math.round(这个.coordLast[coordRand].y));   
  16.         self.ctx.lineTo(Math.round(这个.x), Math.round(这个 .y));   
  17.         self.ctx.closePath();                   
  18.         self.ctx.tripStyle = 'hsla(' 这个.hue ' , 100%, '这个.亮度 '%, '这个.alpha ')';   
  19.         self.ctx.中风(); if(self.flickerDensity > 0){ var inverseDensity = 50 - self.flickerDensity; if(rand(0, inverseDensity) === inverseDensity){   
  20.                 self.ctx.beginPath();   
  21.                 self.ctx.arc(Math.round(这个.x), Math.round(这个 .y), rand(这个.lineWidth,这个.lineWidth 3)/2, 0, Math.PI*2, false)  self.ctx.closePath(); var randAlpha = rand(50,100)/100;   
  22.                 self.ctx.fillStyle = 'hsla(' 这个.hue ' , 100%, '这个.亮度 '%, ' randAlpha ' )';   
  23.                 self.ctx.fill();   
  24.             }       
  25.         }   
  26.     };  

某个JS代码的功能是实现烟花爆炸后的小颗粒的均匀性,从draw方法中可以看出,创建几个随机点,烟花颗粒就可以在这个范围的随机点中散落。

JavaScript 代码 将内容复制到剪切板
  1. var Firework = 函数(startX, startY, targetX, targetY){ 这个.x = startX; 这个.y = startY; 这个.startX = startX; 这个.startY = startY; 这个.hitX = false这个.hitY = 这个.coordLast = [   
  2.             {x: startX, y: startY},   
  3.             {x: startX, y: startY},   
  4.             {x: startX, y: startY}   
  5.         ]; 这个.targetX = targetX; 这个.targetY = targetY; 这个.speed = self.fworkSpeed; 这个.angle = Math.atan2(targetY - startY, targetX - startX); 这个.shockwaveAngle = Math.atan2(targetY - startY, targetX - startX) (90*(Math.PI/180)); 这个.acceleration = self.fworkAccel/100; 这个.hue = self.currentHue; 这个.brightness = rand(50, 80); 这个.alpha = rand(50,100)/100; 这个.lineWidth = self.lineWidth; 这个.targetRadius = 1;   
  6.     };   
  7.   
  8.     Firework.prototype.update = 函数(索引){   
  9.         self.ctx.lineWidth = 这个.lineWidth;   
  10.   
  11.         vx = Math.cos(这个.angle) * 这个.speed,   
  12.         vy = Math.sin(这个.angle) * 这个.speed; 这个.速度*= 1   这个.加速度; 这个.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; 这个.coordLast[0].y = 这个.y; if(self.showTarget){ if(这个.targetRadius (这个
  13. .targetRadius 8){ 
  14. 这个.targetRadius = .25 * self.dt;                } 其他 { 这个.targetRadius = 1 * self.dt;       
  15.             }   
  16.         } if(这个.startX >= 这个.targetX){ if(这个.x   vx 这个.targetX){ 这个.x = 这个.targetX; 这个.hitX = true;   
  17.             } 其他 { 这个.x  = vx * self.dt;   
  18.             }   
  19.         } 否则 { 如果(这个.x vx >= 这个.targetX){ 这个.x = 这个 .targetX; 这个.hitX = true;   
  20.             } 其他 { 这个.x  = vx * self.dt;   
  21.             }   
  22.         } 如果(这个.startY >= 这个.targetY){ if(这个.y   vy 这个.targetY){ 这个.y = 这个.targetY; 这个.hitY = true;   
  23.             } 其他 { 这个.y  = vy * self.dt;   
  24.             }   
  25.         } 否则 { 如果(这个.y vy >= 这个.targetY){ 这个.y = 这个 .targetY; 这个.hitY = true;   
  26.             } 其他 { 这个.y  = vy * self.dt;   
  27.             }   
  28.         } 如果(这个.hitX && 这个.hiTY){  var randExplosion = rand(0, 9);   
  29.             self.createParticles(这个.targetX, 这个.targetY, 这个.色调);   
  30.             self.fireworks.splice(index, 1);                       
  31.         }   
  32.     };   
  33.   
  34.     Firework.prototype.draw = 函数(){   
  35.         self.ctx.lineWidth = 这个.lineWidth; var coordRand = (rand(1,3)-1);                       
  36.         self.ctx.beginPath();                               
  37.         self.ctx.moveTo(Math.round(这个.coordLast[coordRand].x), Math.round(这个.coordLast[coordRand].y));   
  38.         self.ctx.lineTo(Math.round(这个.x), Math.round(这个 .y));   
  39.         self.ctx.closePath();   
  40.         self.ctx.tripStyle = 'hsla(' 这个.hue ' , 100%, '这个.亮度 '%, '这个.alpha ')';   
  41.         self.ctx.中风(); if(self.showTarget){   
  42.             self.ctx.save();   
  43.             self.ctx.beginPath();   
  44.             self.ctx.arc(Math.round(这个.targetX), Math.round(这个 .targetY), 这个.targetRadius, 0, Math.PI*2, false)   
  45.             self.ctx.closePath();   
  46.             self.ctx.lineWidth = 1;   
  47.             self.ctx.中风();   
  48.             self.ctx.restore();   
  49.         } if(self.showShockwave){   
  50.             self.ctx.save();   
  51.             self.ctx.translate(Math.round(这个.x), Math.round(这个 .y));   
  52.             self.ctx.rotate(这个.shockwaveAngle);   
  53.             self.ctx.beginPath();   
  54.             self.ctx.arc(0, 0, 1*(这个.speed/5), 0, Math.PI, 正确);   
  55.             self.ctx.strokeStyle = 'hsla(' 这个.hue ' , 100%, ' 这个.亮度 '%, ' 兰特(25, 60)/100 ')';   
  56.             self.ctx.lineWidth = 这个.lineWidth;   
  57.             self.ctx.中风();   
  58.             self.ctx.restore();   
  59.         }                                    
  60.     };  

某个JS代码是创建烟花实例的,我们也可以从draw方法中看出,当我们鼠标点击中部的某个点时,烟花发射的目的地就在那个点上。

这个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负载以及基于可见性变化管理分析。

如何使用HTML5 Websockets API进行客户端和服务器之间的双向通信? 如何使用HTML5 Websockets API进行客户端和服务器之间的双向通信? Mar 12, 2025 pm 03:20 PM

本文解释了HTML5 Websockets API,用于实时双向客户服务器通信。 它详细详细介绍了客户端(JavaScript)和服务器端(Python/Flask)的实现,以应对可伸缩性,状态管理,一个挑战

h5项目怎么运行 h5项目怎么运行 Apr 06, 2025 pm 12:21 PM

运行 H5 项目需要以下步骤:安装 Web 服务器、Node.js、开发工具等必要工具。搭建开发环境,创建项目文件夹、初始化项目、编写代码。启动开发服务器,使用命令行运行命令。在浏览器中预览项目,输入开发服务器 URL。发布项目,优化代码、部署项目、设置 Web 服务器配置。

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

本文介绍了如何使用HTML5通知API显示桌面通知,重点关注许可要求,自定义和浏览器支持。

如何使用共享工人在HTML5中共享背景处理? 如何使用共享工人在HTML5中共享背景处理? Mar 18, 2025 pm 02:06 PM

本文解释了如何使用HTML5中的共享工人进行共享背景处理,详细的设置,福利,沟通效率和调试技术。

See all articles