本文實例為大家分享了js+canvas實現轉盤效果的具體代碼,供大家參考,具體內容如下
用到了canvas的繪制,旋轉,重繪操作,定時器,文本,平移,線條,圓,清理畫布等等;
版本一
不可以點擊,刷新旋轉
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
<!DOCTYPE html> < html > < head > < meta charset = "UTF-8" > < title >轉盤抽獎</ title > < style type = "text/css" > #myCanvas { background: #FAEBD7; } </ style > </ head > < body > < canvas id = "myCanvas" width = "500" height = "500" ></ canvas > </ body > < script type = "text/javascript" > var myCanvas = document.getElementById("myCanvas"); var cxt = myCanvas.getContext("2d"); // 平移畫布 cxt.translate(250, 250); // 圓心坐標 var oX = 0; var oY = 0; // 大圓半徑 var oR = 150; // 小圓半徑 var oR1 = 50; // 弧度 var oH = Math.PI / 180; // 定時器 var timer; // 角度 var angle = 0; // 文本 var textArr = ["JavaScript", "jQuery", "Vue", "ajax", "rect", "angular", "HTML", "css"]; // 顏色 var colorArr = []; // 隨機生成顏色 for (var i = 0; i < textArr.length ; i++) { var c = "rgb(" + parseInt(Math.random() * 255) + "," + parseInt(Math.random() * 255) + "," + parseInt(Math.random() * 255) + ")" colorArr.push(c); } //起始速度 var seep = Math .random() * 100 + 100; timer = setInterval (function() { if (seep < 0.3) { clearInterval(timer); var index = Math .floor(angle / 45); console.log(index); cxt.font = "12px Arial" ; cxt.textAlign = "center" ; cxt.textBaseline = "middle" cxt.fillStyle = "black" ; var txt = textArr [textArr.length - index-1]; // console.log(cxt.measureText(txt).width); cxt.fillText(txt, 0, 0); } else { //重繪 // 清除畫布 cxt.clearRect(-250, -250, 500, 500); // 處理角度 if (angle >= 360) { angle = 0; } // 處理速度 seep *= 0.95; // 減小速度 angle += seep; // 畫短線 cxt.beginPath(); cxt.strokeStyle = "red"; cxt.lineWidth = 2; cxt.moveTo(150, 0); cxt.lineTo(180, 0); cxt.stroke(); // 保存環境,旋轉畫布 cxt.strokeStyle = "chartreuse"; cxt.save(); cxt.rotate(angle * oH); // 畫扇形 for (var i = 0; i < 8 ; i++) { cxt.fillStyle = colorArr [i]; cxt.beginPath(); cxt.moveTo(0, 0); cxt.arc(0, 0, 150, i * 45 * oH, (i + 1) * 45 * oH); cxt.closePath(); cxt.fill(); cxt.stroke(); } // 畫中心圓 cxt.fillStyle = "#FFF" ; cxt.beginPath(); cxt.arc(oX, oY, oR1, 0, 2 * Math.PI); cxt.fill(); // 添加文字 for (var i = 0 ; i < textArr.length; i++) { cxt.save(); cxt.rotate((i * 45 + 25) * oH); cxt.fillStyle = "#fff" ; cxt.font = "16px 微軟雅黑" ; cxt.fillText(textArr[i], 70, 0); cxt.restore(); } cxt.restore(); // 環境釋放與環境保存成對 } }, 50); </script> </ html > |
版本二
加了點擊事件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
<!DOCTYPE html> < html > < head > < meta charset = "UTF-8" > < title >轉盤抽獎</ title > < style type = "text/css" > #myCanvas { background: #FAEBD7; } </ style > </ head > < body > < canvas id = "myCanvas" width = "500" height = "500" ></ canvas > </ body > < script type = "text/javascript" > var myCanvas = document.getElementById("myCanvas"); var cxt = myCanvas.getContext("2d"); // 平移畫布 cxt.translate(250, 250); // 圓心坐標 var oX = 0; var oY = 0; // 大圓半徑 var oR = 150; // 小圓半徑 var oR1 = 50; // 弧度 var oH = Math.PI / 180; // 定時器 var timer; // 角度 var angle = 0; // 文本 var textArr = ["JavaScript", "jQuery", "Vue", "ajax", "rect", "angular", "HTML", "css"]; // 顏色 var colorArr = []; // 隨機生成顏色 for (var i = 0; i < textArr.length ; i++) { var c = "rgb(" + parseInt(Math.random() * 255) + "," + parseInt(Math.random() * 255) + "," + parseInt(Math.random() * 255) + ")" colorArr.push(c); } //起始速度 var seep = Math .random() * 100 + 100; drawLine(); myCanvas.onclick = function (event) { var mX = event .clientX - myCanvas.offsetLeft; var mY = event .clientX - myCanvas.offsetTop; if (cxt.isPointInPath(mX, mY)) { var j = 50 ; var times = null ; if (times == null) { times = setInterval (function() { if (seep < 0.3) { clearInterval(timer); var index = Math .floor(angle / 45); console.log(index); cxt.font = "12px Arial" ; cxt.textAlign = "center" ; cxt.textBaseline = "middle" cxt.fillStyle = "black" ; var txt = textArr [textArr.length - index - 1]; cxt.fillText(txt, 0, 0); } else { drawLine(); } }, 50); } } else { alert("no") } } function drawLine() { //重繪 // 清除畫布 cxt.clearRect(-250, -250, 500, 500); // 處理角度 if (angle >= 360) { angle = 0; } // 處理速度 seep *= 0.95; // 減小速度 angle += seep; // 畫短線 cxt.beginPath(); cxt.strokeStyle = "red"; cxt.lineWidth = 2; cxt.moveTo(150, 0); cxt.lineTo(180, 0); cxt.stroke(); // 保存環境,旋轉畫布 cxt.strokeStyle = "chartreuse"; cxt.save(); cxt.rotate(angle * oH); // 畫扇形 for (var i = 0; i < 8 ; i++) { cxt.fillStyle = colorArr [i]; cxt.beginPath(); cxt.moveTo(0, 0); cxt.arc(0, 0, 150, i * 45 * oH, (i + 1) * 45 * oH); cxt.closePath(); cxt.fill(); cxt.stroke(); } // 畫中心圓 cxt.fillStyle = "#FFF" ; cxt.beginPath(); cxt.arc(oX, oY, oR1, 0, 2 * Math.PI); cxt.fill(); // 添加文字 for (var i = 0 ; i < textArr.length; i++) { cxt.save(); cxt.rotate((i * 45 + 25) * oH); cxt.fillStyle = "#fff" ; cxt.font = "16px 微軟雅黑" ; cxt.fillText(textArr[i], 70, 0); cxt.restore(); } cxt.restore(); // 環境釋放與環境保存成對 } </script> </ html > |
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/m0_46690660/article/details/108475487