js+canvas實現(xiàn)轉(zhuǎn)盤效果(兩個版本)
更新時間:2020年09月13日 15:35:05 作者:暗鎖讀客
這篇文章主要為大家詳細介紹了兩個版本的js+canvas實現(xiàn)轉(zhuǎn)盤效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了js+canvas實現(xiàn)轉(zhuǎn)盤效果的具體代碼,供大家參考,具體內(nèi)容如下
用到了canvas的繪制,旋轉(zhuǎn),重繪操作,定時器,文本,平移,線條,圓,清理畫布等等;
版本一
不可以點擊,刷新旋轉(zhuǎn)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>轉(zhuǎn)盤抽獎</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();
// 保存環(huán)境,旋轉(zhuǎn)畫布
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();
// 環(huán)境釋放與環(huán)境保存成對
}
}, 50);
</script>
</html>
版本二
加了點擊事件
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>轉(zhuǎn)盤抽獎</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();
// 保存環(huán)境,旋轉(zhuǎn)畫布
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();
// 環(huán)境釋放與環(huán)境保存成對
}
</script>
</html>
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- js抽獎轉(zhuǎn)盤實現(xiàn)方法分析
- Vue.js實現(xiàn)大轉(zhuǎn)盤抽獎總結(jié)及實現(xiàn)思路
- JS實現(xiàn)簡單的抽獎轉(zhuǎn)盤效果示例
- jquery.rotate.js實現(xiàn)可選抽獎次數(shù)和中獎內(nèi)容的轉(zhuǎn)盤抽獎代碼
- 利用Javascript實現(xiàn)簡單的轉(zhuǎn)盤抽獎
- js HTML5 Canvas繪制轉(zhuǎn)盤抽獎
- javascript+HTML5 Canvas繪制轉(zhuǎn)盤抽獎
- 基于javascript實現(xiàn)九宮格大轉(zhuǎn)盤效果
- js實現(xiàn)大轉(zhuǎn)盤抽獎游戲?qū)嵗?/a>
- JS+Canvas繪制抽獎轉(zhuǎn)盤
相關(guān)文章
js獲取數(shù)組最后一位元素的五種方法及執(zhí)行效率對比
js獲取數(shù)組最后一位元素的五種方法代碼示例,使用console.time和console.timeEnd測量javascript腳本程序執(zhí)行效率對比2023-08-08
js實現(xiàn)網(wǎng)頁自動刷新可制作節(jié)日倒計時效果
這篇文章主要介紹了通過js實現(xiàn)的網(wǎng)頁自動刷新,利用此功能可制作節(jié)日倒計時效果,需要的朋友可以參考下2014-05-05
JavaScript實現(xiàn)簡單的四則運算計算器完整實例
這篇文章主要介紹了JavaScript實現(xiàn)簡單的四則運算計算器,結(jié)合完整實例形式分析了javascript基于表單相應實現(xiàn)加減乘除數(shù)學運算的操作技巧,需要的朋友可以參考下2017-04-04

