热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

canvas烟花特效锦集分享!

canvas可以实现不同动画效果,本文主要记录几种不同节日烟花效果实现。 实现一htmlcssbody{background:#

canvas可以实现不同动画效果,本文主要记录几种不同节日烟花效果实现。

canvas烟花特效锦集 

实现一

canvas烟花特效锦集

html

  

css

  body {      background: #000;      margin: 0;  }    canvas {      cursor: crosshair;      display: block;  }  

js

  // when animating on canvas, it is best to use requestAnimationFrame instead of setTimeout or setInterval  // not supported in all browsers though and sometimes needs a prefix, so we need a shim  window.requestAnimFrame = (function () {      return window.requestAnimationFrame ||          window.webkitRequestAnimationFrame ||          window.mozRequestAnimationFrame ||          function (callback) {              window.setTimeout(callback, 1000 / 60);          };  })();    // now we will setup our basic variables for the demo  var canvas = document.getElementById('canvas'),      ctx = canvas.getContext('2d'),      // full screen dimensions      cw = window.innerWidth,      ch = window.innerHeight,      // firework collection      fireworks = [],      // particle collection      particles = [],      // starting hue      hue = 120,      // when launching fireworks with a click, too many get launched at once without a limiter, one launch per 5 loop ticks      limiterTotal = 5,      limiterTick = 0,      // this will time the auto launches of fireworks, one launch per 80 loop ticks      timerTotal = 80,      timerTick = 0,      mousedown = false,      // mouse x coordinate,      mx,      // mouse y coordinate      my;    // set canvas dimensions  canvas.width = cw;  canvas.height = ch;    // now we are going to setup our function placeholders for the entire demo    // get a random number within a range  function random(min, max) {      return Math.random() * (max - min) + min;  }    // calculate the distance between two points  function calculateDistance(p1x, p1y, p2x, p2y) {      var xDistance = p1x - p2x,          yDistance = p1y - p2y;      return Math.sqrt(Math.pow(xDistance, 2) + Math.pow(yDistance, 2));  }    // create firework  function Firework(sx, sy, tx, ty) {      // actual coordinates      this.x = sx;      this.y = sy;      // starting coordinates      this.sx = sx;      this.sy = sy;      // target coordinates      this.tx = tx;      this.ty = ty;      // distance from starting point to target      this.distanceToTarget = calculateDistance(sx, sy, tx, ty);      this.distanceTraveled = 0;      // track the past coordinates of each firework to create a trail effect, increase the coordinate count to create more prominent trails      this.coordinates = [];      this.coordinateCount = 3;      // populate initial coordinate collection with the current coordinates      while (this.coordinateCount--) {          this.coordinates.push([this.x, this.y]);      }      this.angle = Math.atan2(ty - sy, tx - sx);      this.speed = 2;      this.acceleration = 1.05;      this.brightness = random(50, 70);      // circle target indicator radius      this.targetRadius = 1;  }    // update firework  Firework.prototype.update = function (index) {      // remove last item in coordinates array      this.coordinates.pop();      // add current coordinates to the start of the array      this.coordinates.unshift([this.x, this.y]);        // cycle the circle target indicator radius      if (this.targetRadius <8) {          this.targetRadius += 0.3;      } else {          this.targetRadius = 1;      }        // speed up the firework      this.speed *= this.acceleration;        // get the current velocities based on angle and speed      var vx = Math.cos(this.angle) * this.speed,          vy = Math.sin(this.angle) * this.speed;      // how far will the firework have traveled with velocities applied?      this.distanceTraveled = calculateDistance(this.sx, this.sy, this.x + vx, this.y + vy);        // if the distance traveled, including velocities, is greater than the initial distance to the target, then the target has been reached      if (this.distanceTraveled >= this.distanceToTarget) {          createParticles(this.tx, this.ty);          // remove the firework, use the index passed into the update function to determine which to remove          fireworks.splice(index, 1);      } else {          // target not reached, keep traveling          this.x += vx;          this.y += vy;      }  }    // draw firework  Firework.prototype.draw = function () {      ctx.beginPath();      // move to the last tracked coordinate in the set, then draw a line to the current x and y      ctx.moveTo(this.coordinates[this.coordinates.length - 1][0], this.coordinates[this.coordinates.length - 1][          1      ]);      ctx.lineTo(this.x, this.y);      ctx.strokeStyle = 'hsl(' + hue + ', 100%, ' + this.brightness + '%)';      ctx.stroke();        ctx.beginPath();      // draw the target for this firework with a pulsing circle      ctx.arc(this.tx, this.ty, this.targetRadius, 0, Math.PI * 2);      ctx.stroke();  }    // create particle  function Particle(x, y) {      this.x = x;      this.y = y;      // track the past coordinates of each particle to create a trail effect, increase the coordinate count to create more prominent trails      this.coordinates = [];      this.coordinateCount = 5;      while (this.coordinateCount--) {          this.coordinates.push([this.x, this.y]);      }      // set a random angle in all possible directions, in radians      this.angle = random(0, Math.PI * 2);      this.speed = random(1, 10);      // friction will slow the particle down      this.friction = 0.95;      // gravity will be applied and pull the particle down      this.gravity = 1;      // set the hue to a random number +-20 of the overall hue variable      this.hue = random(hue - 20, hue + 20);      this.brightness = random(50, 80);      this.alpha = 1;      // set how fast the particle fades out      this.decay = random(0.015, 0.03);  }    // update particle  Particle.prototype.update = function (index) {      // remove last item in coordinates array      this.coordinates.pop();      // add current coordinates to the start of the array      this.coordinates.unshift([this.x, this.y]);      // slow down the particle      this.speed *= this.friction;      // apply velocity      this.x += Math.cos(this.angle) * this.speed;      this.y += Math.sin(this.angle) * this.speed + this.gravity;      // fade out the particle      this.alpha -= this.decay;        // remove the particle once the alpha is low enough, based on the passed in index      if (this.alpha <= this.decay) {          particles.splice(index, 1);      }  }         // draw particle  Particle.prototype.draw = function () {        ctx.beginPath();      // move to the last tracked coordinates in the set, then draw a line to the current x and y      ctx.moveTo(this.coordinates[this.coordinates.length - 1][0], this.coordinates[this.coordinates.length - 1][          1      ]);      ctx.lineTo(this.x, this.y);      ctx.strokeStyle = 'hsla(' + this.hue + ', 100%, ' + this.brightness + '%, ' + this.alpha + ')';      ctx.stroke();    }    // create particle group/explosion  function createParticles(x, y) {      // increase the particle count for a bigger explosion, beware of the canvas performance hit with the increased particles though      var particleCount = 30;      while (particleCount--) {          particles.push(new Particle(x, y));      }  }    // main demo loop  function loop() {      // this function will run endlessly with requestAnimationFrame      requestAnimFrame(loop);        // increase the hue to get different colored fireworks over time      hue += 0.5;        // normally, clearRect() would be used to clear the canvas      // we want to create a trailing effect though      // setting the composite operation to destination-out will allow us to clear the canvas at a specific opacity, rather than wiping it entirely      ctx.globalCompositeOperation = 'destination-out';      // decrease the alpha property to create more prominent trails      ctx.fillStyle = 'rgba(0, 0, 0, 0.5)';      ctx.fillRect(0, 0, cw, ch);      // change the composite operation back to our main mode      // lighter creates bright highlight points as the fireworks and particles overlap each other      ctx.globalCompositeOperation = 'lighter';        var text = "HAPPY NEW YEAR !";      ctx.fOnt= "50px sans-serif";      var textData = ctx.measureText(text);      ctx.fillStyle = "rgba(" + parseInt(random(0, 255)) + "," + parseInt(random(0, 255)) + "," + parseInt(random(0,          255)) + ",0.3)";      ctx.fillText(text, cw / 2 - textData.width / 2, ch / 2);        // loop over each firework, draw it, update it      var i = fireworks.length;      while (i--) {          fireworks[i].draw();          fireworks[i].update(i);      }        // loop over each particle, draw it, update it      var i = particles.length;      while (i--) {          particles[i].draw();          particles[i].update(i);      }        // launch fireworks automatically to random coordinates, when the mouse isn't down      if (timerTick >= timerTotal) {          if (!mousedown) {              // start the firework at the bottom middle of the screen, then set the random target coordinates, the random y coordinates will be set within the range of the top half of the screen                for (var h = 0; h <50; h++) {                  fireworks.push(new Firework(cw / 2, ch / 2, random(0, cw), random(0, ch)));              }                timerTick = 0;          }      } else {          timerTick++;      }        // limit the rate at which fireworks get launched when mouse is down      if (limiterTick >= limiterTotal) {          if (mousedown) {              // start the firework at the bottom middle of the screen, then set the current mouse coordinates as the target              fireworks.push(new Firework(cw / 2, ch / 2, mx, my));              limiterTick = 0;          }      } else {          limiterTick++;      }  }    // mouse event bindings  // update the mouse coordinates on mousemove  canvas.addEventListener('mousemove', function (e) {      mx = e.pageX - canvas.offsetLeft;      my = e.pageY - canvas.offsetTop;  });    // toggle mousedown state and prevent canvas from being selected  canvas.addEventListener('mousedown', function (e) {      e.preventDefault();      mousedown = true;  });    canvas.addEventListener('mouseup', function (e) {      e.preventDefault();      mousedown = false;  });    // once the window loads, we are ready for some fireworks!  window.Onload= loop;    

实现二

canvas烟花特效锦集

html

    2018

  • 1
  • 2
  • 3
  • 4

推荐阅读
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • 在编写业务代码时,常常会遇到复杂的业务逻辑导致代码冗长混乱的情况。为了解决这个问题,可以利用中间件模式来简化代码逻辑。中间件模式可以帮助我们更好地设计架构和代码,提高代码质量。本文介绍了中间件模式的基本概念和用法。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
author-avatar
mobiledu2502891413
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有