首頁 > web前端 > H5教程 > HTML5 Canvas實現煙火綻放特效_html5教學技巧

HTML5 Canvas實現煙火綻放特效_html5教學技巧

WBOY
發布: 2016-05-16 15:45:41
原創
2984 人瀏覽過

本文為大家帶來了一款,免費又安全環保的HTML5 Canvas實現的放煙火特效。

效果如下:

程式碼如下:

XML/HTML Code複製內容到剪貼簿
  1. HTML>  
  2. html>  
  3.   >  
  4.     標題>Canvas 🎜>標題>    
  5.  字符集=字符集>         -UA-相容" 內容="IE=edge"> 🎜>      
  6. 名稱="視口"  內容=「寬度=設備寬度,高度=設備高度,初始比例=1.0,最大比例=1.0 ,user-scalable =no">       樣式
  7.  
  8. 類型>     html,body{高度:100%;邊距:0;填色:0}      ul,li{text-indent:0;text-decoration:none;margin:0;padding:0}      img{border:0}   
  9.   正文{背景顏色:#000;顏色:#999;字體:100%/18px helvetica、 arial、 sans-serif}   
  10.   畫布{遊標:十字準線;顯示:塊;左:0;位置:絕對;頂部:0;z-index:20}   
  11.   #header img{width:100%; 高度:20%;}   
  12.   #bg img{寬度:100%; 高度:80%;}   
  13.   #header,#bg{position:fixed;left:0;right:0;z-index:10}   
  14.   #header{top:0}   
  15.   #bg{position:fixed;z-index:1;bottom:0}   
  16.   音訊{position:fixed;display:none;bottom:0;left:0;right:0;width:100%;z-index:5}  
  17.  樣式>  
  18.   >  
  19.   身體>  
  20.  div id=id=id
  21. =
  22. 🎜>>     img id id = 🎜>
  23.  
  24. src="http://img.ivsky.com/img/tupian/pre/201508/02/yuzhou_xingkong jpg">  
  25.  div>    腳本 src=
  26. src
  27. = /cdn.bootcss.com/jquery/2.2.0/jquery.min.js">腳本 >
  28. 腳本 >
  29. >
  30. 腳本 > >腳本 > >腳本 >
  31.     
  32. 腳本>
  33.   
  34.   $(function(){       var 煙火 = 函數
  35. (){       var 
  36. 自我 = 
  37. 這個;   這個;        //產生煙火隨機數   
  38.     var rand = 函數(rMi,       //按位取反練習         return ~~((Math.random()*(rMa-rMi 1)) rMi);        },hitTest = 函數(x1, h2){         返回! (x1   w1 
  39.  
  40. x2 || x2  🎜>x1 ||  y1   h1    y1);        };   
  41.     //請求動畫影格   
  42.     window.requestAnimFrame=函數(){  >
  43.      返回 window.requestAnimationFrame   
  44.       ||window.webkitRequestAnimationFrame   
  45.       ||window.mozRequestAnimationFrame   
  46.       ||window.oRequestAnimationFrame   
  47.       ||window.msRequestAnimationFrame   
  48.       ||函數(回呼){   
  49.        window.setTimeout(callback,1000/60);   
  50.       }   
  51.     }();   
  52.     self.init = 函數(){>函數
  53. (){       self.canvas = 文件..
  54.      //canvas 全螢幕   
  55.      
  56. selfself.canvas.width = self      self
  57. self.canvas.height
  58.  = ).innerHeight();           self.articles = [];    
  59.      
  60. self.partCount = 150
  61.      self.fireworks = [];          self
  62. self.mx = self.cw/2;        self
  63. self.my = self.ch/2;    = self.ch/2;         
  64. self.currentHue = 30;      
  65. self.partSpeed = 5; 🎜>;      self.partSpeedVariance
  66.  = 10      self.partWind
  67.  = 50;      self.partFriction = 
  68. 5;      self.partGravity = 1
  69. ;      self.hueMin = 0;
  70.      self.hueMax = 360;      
  71. self.fworkSpeed = 4;      self.fworkAccel
  72.  = 10;      self.hueVariance = 
  73. 30;      self.flickerDensity = 25
  74.      self.showShockwave = true
  75. ;
  76.      self.showTarget = false     self.clearAlpha = 25;   
  77.      $(document.body).append(self.canvas);   
  78.      selfself.ctx = self.canvas.getContext('2d');   
  79.      self.ctx.lineCap = '圓形';   
  80.      self.ctx.lineJoin = '圓形';   
  81.      self.lineWidth = 1;   
  82.      self.bindEvents();      
  83.      self.canvasLoop();   
  84.      self.canvas.onselectstart = 函數
  85.       回傳 false;   
  86.      };   
  87.     };     
  88.     // 建立包裝藥   
  89.     
  90. self.createParticles = 函數(x,p      var 
  91. 倒數
  92.  = self.partCount;         while(倒數--){   
  93.       var 
  94. newParticle
  95.  = {           x: x,   
  96.        y: y,   
  97.        coordLast: [   
  98.         {x: x, y: y},   
  99.         {x: x, y: y},   
  100.         {x: x, y: y}   
  101.        ],   
  102.         角度:rand(0, 360),   
  103.        速度: rand(((self.partSpeed - self.partSpeedVariance) 
  104.        摩擦力:1 - self.partFriction/100,  
  105.        重力:self.partGravity/2,  
  106.        色調:rand(hue-self.hueVariance, 色調 self.hueVariance),   
  107.        亮度:rand(50, 80),   
  108.        alpha:蘭特(40,100)/100,  
  109.        衰變:rand(10, 50)/1000,   
  110.        風:(rand(0, self.partWind) - (self.partWind/2))/25,   
  111.        lineWidth: self.lineWidth   
  112.       };       
  113.       self.articles.push(newParticle);   
  114.      }   
  115.     };   
  116.     // 更新彈藥   
  117.     self.updateParticles = 函數(
  118.      var 
  119. i = self.self.
  120.      while(i--){   
  121.       var 
  122. p = self      var 弧度
  123.  = p.       var vx = 
  124. 數學
  125.       var vy = 數學

  126.       p.速 *= p.摩擦力;   
  127.       p.coordLast[2].x = p<.>
  128.       p.coordLast[2].y
  129.  = p       p.coordLast[1].x = 
  130. p<.>
  131.       p.coordLast[1].y = p<.>
  132.       p.coordLast[0]
  133. .x = p       p.coordLast[0]
  134. .y = p       p.x  = vx;   
  135.       p.y = vy;          p.y  = p.gravity;          p.angle = p.wind;       
  136.       p.alpha -p      if(!hitTest(0,0,self.cw,self.ch,p.x-p.radius, p.y-p.radius, p.radius*2, p.radius*2) .alpha 
  137.  
  138. .05){        
  139.        self.articles.splice(i, 1);    
  140.       }   
  141.      };        };   
  142.     // 均勻劑量   
  143.     self.drawParticles = 函數(
  144.      var 
  145. i = self.self
  146. .   
  147.      while(i--){   
  148.       var p = self
  149. .articles          
  150.       var coordRand
  151.  = (rand(1,3)-1);   
  152.       self.ctx.beginPath();           
  153.       self.ctx.moveTo(Math.round(p.coordLast[coordRand].x), Math.round(p.coordLast[coordRand].y));   
  154.       self.ctx.lineTo(Math.round(p.x), Math.round(p.y));   
  155.       self.ctx.closePath();       
  156.       self.ctx.strokeStyle = 'hsla('
  157.       self.ctx.中風();       
  158.       if(self.flickerDensity > 0){   
  159.        var inverseDensity = 50 = 
  160.        if(rand(0, inverseDensity) === inverseDensity){   
  161.         self.ctx.beginPath();   
  162.         self.ctx.arc(Math.round(p.x), Math.round(p.y), rand(p.lineWidth,p.lineWidth 3)/2, 0,205)
  163.         self.ctx.closePath();   
  164.         var randrandAlpha = rand(50,1000)/1000;   
  165.         self.ctx.fillStyle = ? .亮度'%,'randAlpha')';   
  166.         self.ctx.fill();   
  167.        }    
  168.       }   
  169.      };   
  170.     };   
  171.     // 創建煙火       
  172.     self.createFireworks = 函數      var 
  173. newFirework = {          x: startX,  
  174.       y:開始Y,  
  175.       startX: startX,  
  176.       startY: startY,  
  177.       hitX:假,  
  178.       hitY:假,  
  179.       coordLast: [   
  180.        {x: startX, y: startY},   
  181.        {x: startX, y: startY},   
  182.        {x: startX, y: startY}   
  183.       ],  
  184.       targetX: targetX,  
  185.       targetY: targetY,   
  186.       速度:self.fworkSpeed,  
  187.       角度:Math.atan2(targetY - startY, targetX - startX),   
  188.       shockwaveAngle: Math.atan2(targetY - startY, targetX - startX) (90*(Math.PI/180)),   
  189.       加速度:self.fworkAccel/100,  
  190.       色調:self.currentHue,  
  191.       亮度:rand(50, 80),   
  192.       alpha:蘭特(50,100)/100,  
  193.       lineWidth: self.lineWidth   
  194.      };      
  195.      self.fireworks.push(newFirework);   
  196.     };   
  197.     //更新煙火   
  198.     self.updateFireworks = 函數(
  199.      var 
  200. i = self .   
  201.      while(i--){   
  202.       var 
  203. f = self.          
  204. self.ctx.lineWidth = f.lineWidth;          
  205. vx = 數學       vy
  206.  = 
  207. .sin(.>.sin(f..angle);          f.speed *= 1   f.acceleration;       
  208.       f.coordLast[2]
  209. .x = ff
  210.       f.coordLast[2].y = f   
  211.       f.coordLast[1].x = f
  212. f
  213.          f.coordLast[1].y = 
  214. f
  215.          f.coordLast[0].x = 
  216. f
  217.       f.coordLast[0].y = f
  218.       if(f.startX >
  219. = f.targetX){   
  220. = f.targetX){   = f.targetX){   
  221.        if(f.x   vx 
  222. = f.targetX){  = f.targetX){  = f.targetX){  
  223. = f.targetX){  
  224.         ff.x = f.targetX;   
  225.         
  226. f.hitX
  227.  = 
  228. true
  229. ;   
  230.        } 其他 {   
  231.         f.x  = vx;           }   
  232.       } 其他 {           if(f.x   vx >
  233. = f.targetX){  
  234. = f.targetX){  = f.targetX){  = f.targetX){           
  235. f
  236. f.x
  237. = f.targetX;   
  238.         
  239. f.hitX = true;        } 其他 {            f.x  = vx;           }  
  240.       }   
  241.       if(f.startY >= f.targetY){   
  242. = f.targetY){   
  243. = f.targetY){           if(f.y   vy 
  244. = f.targetY){          ff.y = f.targetY;   
  245.         f.hitY = true
  246.        } 其他 {   
  247.         f.y  = vy;   
  248.        }   
  249.       } 其他 {   
  250.        if(f.y   vy >= f.targetY){ >
  251.         
  252. ff.y = f.targetY;   
  253.         
  254. f.hitY = true;   
  255.        } 其他 {   
  256.         f.y  = vy;   
  257.        }   
  258.       }       
  259.       if(f.hitX && f.hitY){   
  260.        self.createParticles(f.targetX, f.targetY, f.hue);   
  261.        self.fireworks.splice(i, 1);   
  262.       }   
  263.      };   
  264.     };   
  265.     // 均勻煙火   
  266.     self.drawFireworks = 函數(){  
  267.      var 
  268. i = self .   
  269.      
  270. self.ctx.globalCompositeOperation = '更輕' = '更輕';   
  271.      while(i--){   
  272.       var f = self.     
  273.       self.ctx.lineWidth = f.lineWidth;   
  274.       var coordRand = (rand(1,3)-1);        
  275.       self.ctx.beginPath();          
  276.       self.ctx.moveTo(Math.round(f.coordLast[coordRand].x), Math.round(f.coordLast[coordRand].y));   
  277.       self.ctx.lineTo(Math.round(f.x), Math.round(f.y));   
  278.       self.ctx.closePath();   
  279.       self.ctx.strokeStyle = 'hsla(' = 
  280.       self.ctx.中風();    
  281.       if(self.showTarget){   
  282.        self.ctx.save();   
  283.        self.ctx.beginPath();   
  284.        self.ctx.arc(Math.round(f.targetX), Math.round(f.targetY), rand
  285.        self.ctx.closePath();   
  286.        self.ctx.lineWidth = 1;   
  287.        self.ctx.中風();   
  288.        self.ctx.restore();   
  289.       }  
  290.       if(self.showShockwave){   
  291.        self.ctx.save();   
  292.        self.ctx.translate(Math.round(f.x), Math.round(f.y));   
  293.        self.ctx.rotate(f.shockwaveAngle);   
  294.        self.ctx.beginPath();   
  295.        self.ctx.arc(0, 0, 1*(f.speed/5), 0, Math.PI, true);   
  296.        self.ctx.strokeStyle = 'hsla(' = 'hsla('
  297.  = 
  298. 'hsla('        
  299. self.ctx.lineWidth
  300.  = f.lineWidth;   
  301.        self.ctx.中風();   
  302.        self.ctx.restore();   
  303.       }   
  304.      };   
  305.     };   
  306.     // 綁定事件        self.bindEvents = 
  307. 函數
  308. ()
  309.      $(window).on('resize', function(){      
  310.       clearTimeout(self.timeout);          self.timeout = 
  311. setTimeout
  312. setTimeout        selfself.canvas.width
  313.  =o        selfself.canvas.height  self ).innerHeight();   
  314.        self.ctx.lineCap = '圓形' = 
  315. '圓形'
  316. ;           self.ctx.lineJoin = 
  317. '圓形'
  318.  = '圓形'
  319. ;          }, 100);         });   
  320.      $(self.canvas).on('mousedown', function(e){   
  321.       self.mx = e.pageX - self.canvas.offsetLeft;   
  322.       self.my = e.pageY - self.canvas.offsetTop;   
  323.       self.currentHue = rand(self.hu>rand
  324. (self.hu   
  325.       self.createFireworks(self.cw/2, self.ch, self.mx, self.my);    
  326.       $(self.canvas).on('mousemove.fireworks', function(e){           self.mx
  327.  = e.pageX - self.canvas.offsetLeft;           self.my
  328.  = e.pageY - self.canvas.offsetTop;           self.currentHue = rand
  329. rand
  330.        self.createFireworks(self.cw/2, self.ch, self.mx, self.my);            
  331.       });       
  332.      });   
  333.      $(self.canvas).on('mouseup', function(e){   
  334.       $(self.canvas).off('mousemove.fireworks');            
  335.      });        };        self.clear
  336.  = 函數(){🎜>函數
  337. (){  >
  338.      self.articles = [];   
  339.      
  340. self.fireworks
  341.  = [];   
  342.      self.ctx.clearRect(0, 0, self.cw, self.ch);        };        
  343. self.canvasLoop
  344.  = 
  345. 函數
  346. ()      requestAnimFrame(self.canvasLoop, self.canvas);            
  347. self.ctx.globalCompositeOperation
  348.  = 'destination-out      
  349. self.ctx.fillStyle = 
  350. 'rgba(0,0,0,00,0,0,000 100 ')';   
  351.      self.ctx.fillRect(0,0,self.cw,self.ch);   
  352.      self.updateFireworks();   
  353.      self.updateParticles();   
  354.      self.drawFireworks();      
  355.      self.drawParticles();   
  356.     };        self.init();         }  
  357.    var fworks = new
  358.    $('#info-toggle').on('click', function(e){   
  359.     $('#info-inner').stop(false, true).slideToggle(100);   
  360.     e.preventDefault();   
  361.    });    
  362.   });   
  363.  
  364. 腳本>  
  365.  
  366. 畫布 寬度=寬度= 🎜> 身高="449">> >
  367.      身體>
  368.    html>
  

不是被HTML5強大的效果驚呆了,一飽眼福了吧。
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板