javascript--烟火效果

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width"/>
<title>烟花</title>
<style type="text/css">
  body{
    background-color: black;
    margin: 0;
  }
  #canvas{
    cursor: pointer;
  }
</style>
</head>
<body>
  <canvas id="canvas"></canvas>
  <script type="text/javascript">
    window.requestAnimFrame = (function () {
      return window.requestAnimFrame ||
             window.webkitRequestAnimationFrame ||
             window.mozRequestAnimationFrame ||
             window.oRequestAnimationFrame ||
             window.msRequestAnimationFrame ||
             function(callback){
                window.setTimeout(callback,1000 / 60);
             };
    })();
    Function.prototype.extend = function (oContext, bIsStatic) {
        var oThis = (typeof bIsStatic != ‘undefined‘ && bIsStatic)? this: this.prototype;
        for ( var prop in oContext) {
            oThis[prop] = oContext[prop];
        }
    }
    var opt = {
      canvas : document.getElementById(‘canvas‘),
      ctx: document.getElementById(‘canvas‘).getContext(‘2d‘),
      w: window.innerWidth,
      h: window.innerHeight,
      fireworks: [],//烟花
      grains: [],//粒子
      x: 0,
      y: 0,
      mousedown: false,
      hue: 0,//色调
      totalLimite: 5,
      limite: 0,
      totalTime: 80,
      time: 0
    };
    opt.canvas.width = opt.w;
    opt.canvas.height = opt.h;
    function random(min,max){
      return Math.random()*(max-min)+min;
    }
    function calcuDis(x1,y1,x2,y2){
      return Math.sqrt(Math.pow(x1-x2,2)+Math.sqrt(y1-y2,2));
    }
    function Firework( x1, y1, x2, y2 ) {
      this.x = this.x1 = x1;
      this.y = this.y1 = y1;
      this.x2 = x2;
      this.y2 = y2;
      this.target = calcuDis( x1, y1, x2, y2 );
      this.distance = 0;
      this.position = [];
      for(var i = 2; i >= 0; i--)  {
        this.position.push( [ this.x, this.y ] );
      }
      this.angle = Math.atan2( y2 - y1, x2 - x1 );
      this.speed = 2;
      this.acceleration = 1.05;//加速度
      this.lightness = random( 50, 70 );
      this.targetRadius = 1;
    }
    Firework.extend({
        update: function(index) {
            this.position.pop();
            this.position.unshift( [ this.x, this.y ] );
            if( this.targetRadius < 8 ) {
              this.targetRadius += 0.3;
            } else {
              this.targetRadius = 1;
            }
            this.speed *= this.acceleration;
            var x = Math.cos( this.angle ) * this.speed,
                y = Math.sin( this.angle ) * this.speed;
            this.distance = calcuDis( this.x1, this.y1, this.x + x, this.y + y );
            if( this.distance >= this.target ) {
              for(var i = 50; i >= 0; i--) {
                opt.grains.push( new Grain( this.x2, this.y2 ) );
              }
              opt.fireworks.splice( index, 1 );
            } else {
              this.x += x;
              this.y += y;
            }
        },
        draw: function() {
            opt.ctx.beginPath();
            opt.ctx.moveTo( this.position[ this.position.length - 1][ 0 ], this.position[ this.position.length - 1][ 1 ] );
            opt.ctx.lineTo( this.x, this.y );
            opt.ctx.strokeStyle = ‘hsl(‘ + opt.hue + ‘, 100%, ‘ + this.lightness + ‘%)‘;
            opt.ctx.stroke();
            opt.ctx.closePath();
            opt.ctx.beginPath();
            opt.ctx.arc( this.x2, this.y2, this.targetRadius, 0, Math.PI * 2 );
            opt.ctx.stroke();
            opt.ctx.closePath();
        }
    });
    function Grain( x, y ) {
      this.x = x;
      this.y = y;
      this.position = [];
      for(var i = 4; i >= 0; i--) {
        this.position.push( [ this.x, this.y ] );
      }
      this.angle = random( 0, Math.PI * 2 );
      this.speed = random( 1, 10 );
      this.friction = 0.95;
      this.gravity = 1;
      this.hue = random( opt.hue - 10, opt.hue + 10 );
      this.lightness = random( 50, 80 );
      this.alpha = 1;
      this.decay = random( 0.01, 0.03 );
    }
    Grain.extend({
        update: function(index) {
            this.position.pop();
            this.position.unshift( [ this.x, this.y ] );
            this.speed *= this.friction;
            this.x += Math.cos( this.angle ) * this.speed;
            this.y += Math.sin( this.angle ) * this.speed + this.gravity;
            this.alpha -= this.decay;
            if( this.alpha <= this.decay ) {
              opt.grains.splice( index, 1 );
            }
        },
        draw: function() {
            opt.ctx.beginPath();
            opt.ctx.moveTo( this.position[ this.position.length - 1 ][ 0 ], this.position[ this.position.length - 1 ][ 1 ] );
            opt.ctx.lineTo( this.x, this.y );
            opt.ctx.strokeStyle = ‘hsla(‘ + this.hue + ‘, 100%, ‘ + this.lightness + ‘%, ‘ + this.alpha + ‘)‘;
            opt.ctx.stroke();
            opt.ctx.closePath();
        }
    });
    function loop(){
      opt.ctx.globalCompositeOperation = ‘destination-out‘;
      opt.ctx.fillStyle = ‘rgba(0, 0, 0, 0.5)‘;
      opt.ctx.fillRect( 0, 0, opt.w, opt.h );
      opt.ctx.globalCompositeOperation = ‘lighter‘;
      opt.hue += 0.5;
      var i = opt.fireworks.length;
      while( i-- ) {
        opt.fireworks[ i ].draw();
        opt.fireworks[ i ].update( i );
      }
      i = opt.grains.length;
      while( i-- ) {
        opt.grains[ i ].draw();
        opt.grains[ i ].update( i );
      }
      if( opt.time >= opt.totalTime ) {
        if( !opt.mousedown ) {
          opt.fireworks.push( new Firework( opt.w / 2, opt.h, random( 0, opt.w ), random( 0, opt.h / 2 ) ) );
          opt.time= 0;
        }
      } else {
        opt.time++;
      }
      if( opt.limite >= opt.totalLimite ) {
        if( opt.mousedown ) {
          opt.fireworks.push( new Firework( opt.w / 2, opt.h, opt.x, opt.y ) );
          opt.limite = 0;
        }
      } else {
        opt.limite++;
      }
      requestAnimFrame(loop);
    }
    opt.canvas.onmousemove = function(e){
      opt.x = e.pageX - opt.canvas.offsetLeft;
      opt.y = e.pageY - opt.canvas.offsetTop;
    }
    opt.canvas.onmousedown = function(e){
      opt.mousedown = true;
    }
    opt.canvas.onmouseup = function(e){
      opt.mousedown = false;
    }
    window.onload= function(){
      loop();
    };
  </script>
</body>
</html>

原文地址:http://www.w3cfuns.com/blog-5444049-5404365.html

时间: 2024-10-03 11:29:48

javascript--烟火效果的相关文章

javascript动画效果之缓冲动画(修改版)

在编写多块同时触发运动的时候,发现一个BUG, timer = setInterval(show, 30);本来show是一个自定义函数,当设为timer = setInterval(show(one,two), 30);时,发现show里面的参数one和two无法被导入,所以需要做以下代码改进和优化 原版的html和css代码在这里javascript动画效果之缓冲动画 js代码如下 1 <script> 2 function $(id) { 3 return typeof id === &

Javascript动画效果(四)

Javascript动画效果(四) 前面我们自己写了一个小小的关于js动画的插件,下面我们来使用之前的框架来完成我们想要的动画效果.我们经常在淘宝网中看到,鼠标经过某一图片时,该图片有从上滚出而又从下滚入的效果,那么那种效果是如何实现的呢? 首先我们我们完成该效果的html和css代码,代码如下: html部分代码: <div id="move"> <a href="#"><i><img src="images/1

javascript 拖放效果

最近一直在看javascript的书籍,有些东西在书上看着貌似理解了,但是在真正动手实践时,其实有些细节你根本不了解.所以看起来就算是一个简单的效果,写起来也未必简单,就算写起来简单,写的代码也未必规范.可维护性等等.无奈,一直学习编程以来都是眼高手低,导致什么都写不出来.在自己没有足够的功底写出好的代码出来,学习大牛的代码也是一直高效的方式.以下是一个拖放的效果,参考的代码,重构以下,加以理解学习. 首先来看效果: 拖动div 拖放状态:未开始 [程序说明] 拖动原理:其实就是在拖动块上监听m

Html、CSS、JavaScript 实时效果在线编辑器 - 学习的好工具,算不算?!

关于 二维码 与 NFC 之间的出身贫贱说 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. http://jsfiddle.net/vnkuZ/ 总共四个工作区:左上是 Html 界面组件:左下

Javascript动画效果(一)

Javascript动画效果(一) 前面我们介绍了Javascript的回到顶部效果,今天呢,我们对Javascript动画做进一步的研究.在这篇博文中我们只介绍简单的匀速运动.简单的缓冲运动和简单的多物体运动后面我们还会介绍任意值变化的运动.链式运动.同时运动,同时我们还会简单的封装一个运动框架并且还会将Javascript方法和jquery方法进行比较. 1.简单的匀速运动 下面我们介绍一个demo,鼠标移入,动画向右移动(即隐藏部分显示):鼠标离开,动画向左运动(继续隐藏)整个过程都是匀速

《JavaScript实用效果整理》系列分享专栏

整理一些使用的JavaScript效果,在Web开发中遇到的比较好的动态效果,都收藏在这里,对以后的网站开发增加不少的色彩 <JavaScript实用效果整理>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/201717.html 文章 国外30个使用很酷的JS滑动和滚动效果的网站 速度超快的菜单切换效果 使用Ctrl+Enter提交表单 jQuery Easing 动画效果扩展 超酷的固定菜单页面滚动效果 幸运大转盘-jQuery+PH

javascript照片墙效果

<!doctype html> <html> <head> <meta charset="UTF-8"> <title>锤子-直播照片墙拖拽技术-网站开发-网页特效</title> <style type="text/css"> *{margin:0;padding:0;} body{background:#000000;/*背景填充*/overflow:hidden;} #pers

贪吃蛇,JavaScript,效果,鼠标事件

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>鼠标跟随一串效果</title> <style type="text/css"> div{ width: 30px; height: 30px; background: #008000; position: absolute; left: 10px; top: 10p

WEB前端开发学习----12. JavaScript 选项卡效果

选项卡无处不在,记录一个简单的JS实现方法, 仿网易效果. 当两个边框紧挨时,会变粗, 颜色也会变深,解决办法就是: margin-left:-1px, 按需修改top,left,right,bottom. [html] view plaincopy <!doctype html> <html> <head> <meta charset="utf-8"/> </head> <style type="text/c

【BOOM】一款有趣的Javascript动画效果

实践出真知,有的时候看到一些有趣的现象就想着用自己所学的知识复现一下.    缘起 前几天在 github 上看到同事的一个这样的小项目,在 IOS 上实现了这样一个小动画效果,看上去蛮炫的,效果图: 我就寻思着,在浏览器环境下,用 Javascript 怎么实现呢? 在浓烈的好奇心驱使下,最终利用 Javascript 和 CSS3 完成了模仿上面的效果,通过调用方法,可以将页面上的图片一键爆炸,我给它起了个 boomJS 的名字,贴两张效果图:           实现 我感觉效果还是可以的