如何用JS Canvas实现转盘效果,并改编为长尾?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1370个文字,预计阅读时间需要6分钟。
本文以实例分享如何使用JavaScript和Canvas实现转盘效果的具体代码,供大家参考。内容主要包括:
1. 使用Canvas进行绘制、旋转、重绘操作;
2.定时器实现动态效果;
3.文本、移动、线条、圆形等图形元素的应用;
4.清理画布等操作。
具体代码如下:
javascript
// 初始化Canvasvar canvas=document.getElementById('canvas');var ctx=canvas.getContext('2d');// 设置Canvas大小canvas.width=400;canvas.height=400;
// 转盘数据var data=[ { text: '选项1', color: 'red' }, { text: '选项2', color: 'green' }, { text: '选项3', color: 'blue' }, { text: '选项4', color: 'yellow' }];
// 绘制转盘function drawWheel() { var startAngle=0; var endAngle=0; var totalAngle=0;
for (var i=0; i // 绘制文字 ctx.font='20px Arial'; ctx.fillStyle='black'; ctx.fillText(data[i].text, 200 - ctx.measureText(data[i].text).width / 2, 200 + 10); startAngle=endAngle; totalAngle +=endAngle - startAngle; }} // 旋转转盘function rotateWheel() { ctx.clearRect(0, 0, canvas.width, canvas.height); drawWheel(); ctx.save(); ctx.translate(200, 200); ctx.rotate((Math.PI / 180) * 3); ctx.restore();} // 设置定时器setInterval(rotateWheel, 100); 以上代码实现了转盘效果的绘制和旋转。你可以根据需要修改`data`数组中的数据,以及调整Canvas大小和颜色等。希望这个例子能帮助你理解如何使用JavaScript和Canvas实现转盘效果。 本文实例为大家分享了js+canvas实现转盘效果的具体代码,供大家参考,具体内容如下 用到了canvas的绘制,旋转,重绘操作,定时器,文本,平移,线条,圆,清理画布等等; 版本一 不可以点击,刷新旋转
<!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>
版本二 加了点击事件
<!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>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。
本文共计1370个文字,预计阅读时间需要6分钟。
本文以实例分享如何使用JavaScript和Canvas实现转盘效果的具体代码,供大家参考。内容主要包括:
1. 使用Canvas进行绘制、旋转、重绘操作;
2.定时器实现动态效果;
3.文本、移动、线条、圆形等图形元素的应用;
4.清理画布等操作。
具体代码如下:
javascript
// 初始化Canvasvar canvas=document.getElementById('canvas');var ctx=canvas.getContext('2d');// 设置Canvas大小canvas.width=400;canvas.height=400;
// 转盘数据var data=[ { text: '选项1', color: 'red' }, { text: '选项2', color: 'green' }, { text: '选项3', color: 'blue' }, { text: '选项4', color: 'yellow' }];
// 绘制转盘function drawWheel() { var startAngle=0; var endAngle=0; var totalAngle=0;
for (var i=0; i // 绘制文字 ctx.font='20px Arial'; ctx.fillStyle='black'; ctx.fillText(data[i].text, 200 - ctx.measureText(data[i].text).width / 2, 200 + 10); startAngle=endAngle; totalAngle +=endAngle - startAngle; }} // 旋转转盘function rotateWheel() { ctx.clearRect(0, 0, canvas.width, canvas.height); drawWheel(); ctx.save(); ctx.translate(200, 200); ctx.rotate((Math.PI / 180) * 3); ctx.restore();} // 设置定时器setInterval(rotateWheel, 100); 以上代码实现了转盘效果的绘制和旋转。你可以根据需要修改`data`数组中的数据,以及调整Canvas大小和颜色等。希望这个例子能帮助你理解如何使用JavaScript和Canvas实现转盘效果。 本文实例为大家分享了js+canvas实现转盘效果的具体代码,供大家参考,具体内容如下 用到了canvas的绘制,旋转,重绘操作,定时器,文本,平移,线条,圆,清理画布等等; 版本一 不可以点击,刷新旋转
<!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>
版本二 加了点击事件
<!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>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。

