JavaScript實現HTML5煙花特效


煙花效果如下(請使用支持HTML5的瀏覽器查看):
點擊這里查看效果:http://keleyi.com/keleyi/phtml/html5/14.htm 

源代碼如下:

 1 <style>canvas{background-color:#000000;;z-index:9999;}</style>
 2 <canvas id="canvas-keleyi-com"></canvas>
 3 <script>
 4 var c = document.getElementById('canvas-ke'+'leyi-com');
 5 if (!c.getContext) alert('請使用支持HTML5的瀏覽器,例如Chrome,IE9以上。');
 6 else(function(c, cvs) {
 7 //隨着窗口調整畫布大小
 8 var W, H;
 9 var up = 0; 
10 //(onresize = function() {
11 //     c.width = W = window.innerWidth;
12 //     c.height = H = window.innerHeight;
13 //    })();
14 c.width=W=616;
15 c.height=H=400;
16 //生成一個煙花
17 function createPT(x, y, r, g, b) {
18 return {
19 r: r,g: g,b: b,
20 x: x,y: y,
21 //軌跡序列
22 pl: [],
23 dx: rnd(20) - 10,
24 dy: rnd(10) - 7,
25 life: 30 + rnd(30),
26 //移動函數,修改加速度和坐標
27 move: function() {
28 this.dx *= .98;
29 this.dy *= .98;
30 this.dy += .22;
31 this.x += this.dx;
32 this.y += this.dy;
33 this.pl.push([this.x, this.y]);
34 //保持軌跡長度
35 if (this.pl.length > 10) this.pl.shift();
36 this.life--;
37 }
38 };
39 }
40 //總煙火數組
41 var B = [];
42 //在x,y位置創建一個煙火
43 function createBoom(x, y) {
44 var q = [],
45 r = rnd(255) | 0,
46 g = rnd(255) | 0,
47 b = rnd(255) | 0;
48 for (var i = 0; i < rnd(16) + 15; i++) q.push(createPT(x, y, r, g, b));
49 B.push(q);
50 }
51 setInterval(function() {
52 cvs.clearRect(0, 0, W, H);
53 //依次繪制煙火
54 for (var n = 0; n < B.length; n++) {
55 var q = B[n];
56 for (var i = 0; i < q.length; i++) {
57 var pt = q[i];
58 pt.move();
59 dq(pt.pl, pt.life / 30, pt.r, pt.g, pt.b);
60 //超過生存周期就消失 柯 樂 義
61 if (pt.life <= 0) q.splice(i, 1);
62 }
63 //當一個煙火包含的煙花個數為零,則消滅這個煙火
64 if (!B[n].length) B.splice(n, 1);
65 }
66 //每隔一段時間添加一個新煙火
67 if (new Date - up < 2000 + rnd(2000)) return;
68 up = new Date;
69 createBoom(rnd(W / 2) + W / 4, rnd(50) + 50);
70 },20);
71 function rnd(n) {
72 return (n || 1) * Math.random();
73 }
74 function dq(ar, z, r, g, b) {
75 cvs.save();
76 //繪制軌跡。思路是每次都繪制一條透明的軌跡,疊加起來形成一條漸變的樣子
77 for (var i = 0; i < ar.length; i++) {
78 cvs.strokeStyle = 'rgba(' + r + ',' + g + ',' + b + ',' + Math.abs(.2 * z) + ')';
79 cvs.lineWidth = Math.min(i + 1, 4)*2;
80 cvs.beginPath();
81 cvs.moveTo(ar[i][0], ar[i][1]);
82 for (var j = i + 1; j < ar.length; j++) cvs.lineTo(ar[j][0], ar[j][1]);
83 cvs.stroke();
84 }
85 cvs.restore();
86 }
87 })(c, c.getContext('2d'));</script>

原文:http://keleyi.com/a/bjac/3pipmkmg.htm

觸須:http://keleyi.com/a/bjac/k3pi4ehx.htm

web前端:http://www.cnblogs.com/jihua/p/webfront.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM