1 <!DOCTYPE html>
2 <html>
3 <head>
4 <title>canvas</title>
5 <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.2.1.min.js"></script>
6 <script>
7 CanvasRenderingContext2D.prototype.circle = function (x, y, radius)
8 {
9 this.save();
10
11 this.beginPath();
12 this.arc(x, y, radius, 0, 2 * Math.PI);
13 this.closePath();
14
15 this.restore();
16
17 return this;
18 }
19 </script>
20 <script>
21 $(function()
22 {
23 // 存储wave的数组
24 var waveArray = [];
25
26 // 获取Canvas Context
27 var myCanvas = document.getElementById("myCanvas");
28 var canvasContext = myCanvas.getContext("2d");
29
30 // wave批量绘制函数
31 var waveBatchPaintFunc = function()
32 {
33 // waveArray数组为空,则不处理
34 if (waveArray.length == 0) return;
35
36 // 清空canvas绘图区
37 canvasContext.clearRect(0, 0, myCanvas.width, myCanvas.height);
38
39 // 遍历waveArray数组(从后往前遍历,便于删除wave)
40 for (var i = waveArray.length - 1; i >= 0; i--)
41 {
42 var waveItem = waveArray[i];
43
44 // 根据速度增加wave绘制半径
45 waveItem.radiusCurrent += waveItem.speed;
46
47 // 判断是否超过最大半径
48 if (waveItem.radiusCurrent < waveItem.radiusMax)
49 {
50 // 每个wave定制颜色
51 canvasContext.fillStyle = waveItem.color;
52
53 // wave半径越大,其透明度越小
54 canvasContext.globalAlpha = 1 - waveItem.radiusCurrent / waveItem.radiusMax;
55
56 // 绘制wave
57 canvasContext.circle(waveItem.position.x, waveItem.position.y, waveItem.radiusCurrent).fill();
58 }
59 else
60 {
61 // wave超过最大半径,则删除它
62 waveArray.splice(i, 1);
63 }
64 }
65 }
66
67 // 每50ms批量绘制一次
68 setInterval(waveBatchPaintFunc, 50);
69
70 // 鼠标移动事件锁定标志
71 var mouseLock = false;
72
73 // 鼠标移动事件解锁定函数
74 var mouseUnlockFunc = function()
75 {
76 mouseLock = false;
77 }
78
79 // 每100ms只能响应一次鼠标移动事件
80 setInterval(mouseUnlockFunc, 100);
81
82 // 鼠标移动事件绑定
83 $("#myCanvas").on("mousemove", function(e)
84 {
85 if (!mouseLock)
86 {
87 // 每绘制一次则锁定鼠标事情,等待下次解锁
88 mouseLock = true;
89
90 // 准备新wave的初始参数
91 var waveSpeed = 5;
92 var radiusMax = myCanvas.width / 2;
93
94 var speedRand = (Math.random() * 2 + 1) / 3;
95 var radiusRand = Math.random();
96
97 // 鼠标的每次移动都会生成一个wave
98 waveArray.push(
99 {
100 "color" : colorRand(),
101 "radiusCurrent" : 0,
102 "speed" : waveSpeed * speedRand, // 乘以速度系数,使每个wave的速度都不同
103 "radiusMax" : radiusMax * radiusRand, // 乘以半径系数,使每个wave的最大半径都不同
104 "position" : { "x" : e.offsetX, "y" : e.offsetY }
105 }
106 );
107 }
108 });
109
110 // 随机颜色生成函数
111 var colorRand = function()
112 {
113 // 候选颜色
114 var colorCandidate = "ABCDEF";
115
116 var redRand = Math.floor(Math.random() * colorCandidate.length);
117 var greenRand = Math.floor(Math.random() * colorCandidate.length);
118 var blueRand = Math.floor(Math.random() * colorCandidate.length);
119
120 var colorRed = colorCandidate[redRand];
121 var colorGreen = colorCandidate[greenRand];
122 var colorBlue = colorCandidate[blueRand];
123
124 return "#" + colorRed + colorGreen + colorBlue;
125 }
126 });
127 </script>
128 <style>
129 #myCanvas
130 {
131 /* border:1px solid #AAA; */
132 }
133 </style>
134 </head>
135 <body>
136 <canvas id="myCanvas" width="720" height="640">
137 Your browser does not support the canvas element.
138 </canvas>
139 </body>
140 </html>