js+canvas实现转盘效果(两个版本)


Posted in Javascript onSeptember 13, 2020

本文实例为大家分享了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>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript setTimeout和setInterval 的区别
Dec 08 Javascript
JS 毫秒转时间示例代码
Sep 22 Javascript
javascript实现des解密加密全过程
Apr 03 Javascript
jquery实现Slide Out Navigation滑出式菜单效果代码
Sep 07 Javascript
javascript常用函数(1)
Nov 04 Javascript
基于jQuery Tipso插件实现消息提示框特效
Mar 16 Javascript
基于React.js实现原生js拖拽效果引发的思考
Mar 30 Javascript
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
Oct 31 Javascript
基于vue-cli创建的项目的目录结构及说明介绍
Nov 23 Javascript
node.js博客项目开发手记
Mar 16 Javascript
基于JS实现html中placeholder属性提示文字效果示例
Apr 19 Javascript
基于vue实现一个禅道主页拖拽效果
May 27 Javascript
js实现3D粒子酷炫动态旋转特效
Sep 13 #Javascript
原生JS实现九宫格抽奖
Sep 13 #Javascript
jQuery实现带进度条的轮播图
Sep 13 #jQuery
js+canvas实现画板功能
Sep 13 #Javascript
jQuery实现鼠标拖拽登录框移动效果
Sep 13 #jQuery
jQuery实现简单全选框
Sep 13 #jQuery
jQuery+ajax实现用户登录验证
Sep 13 #jQuery
You might like
漫荒推荐:画风超赞的国风漫画推荐 超长假期不无聊
2020/03/08 国漫
php 文件上传代码(限制jpg文件)
2010/01/05 PHP
Mac系统下使用brew搭建PHP(LNMP/LAMP)开发环境
2015/03/03 PHP
详解PHP实现异步调用的4种方法
2016/03/14 PHP
php 数组随机取值的简单实例
2016/05/23 PHP
PHP基于回溯算法解决n皇后问题的方法示例
2017/11/07 PHP
在JavaScript中遭遇级联表达式陷阱
2007/03/08 Javascript
传递参数的标准方法(jQuery.ajax)
2008/11/19 Javascript
javascript 写类方式之二
2009/07/05 Javascript
仿猪八戒网左下角的文字滚动效果
2011/10/28 Javascript
JavaScript判断访问的来源是手机还是电脑,用的哪种浏览器
2013/12/12 Javascript
js格式化时间和js格式化时间戳示例
2014/02/10 Javascript
Javascript 读取操作Sql中的Xml字段
2014/10/09 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
2015/05/14 Javascript
基于angular中的重要指令详解($eval,$parse和$compile)
2016/10/21 Javascript
JavaScript对象_动力节点Java学院整理
2017/06/23 Javascript
利用JS实现scroll自定义滚动效果详解
2017/10/17 Javascript
JS实现的倒计时恢复按钮点击功能【可用于协议阅读倒计时】
2018/04/19 Javascript
Vue引入jquery实现平滑滚动到指定位置
2018/05/09 jQuery
微信小程序支付PHP代码
2018/08/23 Javascript
在vue中根据光标的显示与消失实现下拉列表
2019/09/29 Javascript
Vue中import from的来源及省略后缀与加载文件夹问题
2020/02/09 Javascript
Python Paramiko模块的使用实际案例
2018/02/01 Python
Python重新加载模块的实现方法
2018/10/16 Python
浅析python表达式4+0.5值的数据类型
2020/02/26 Python
Python IDE环境之 新版Pycharm安装详细教程
2020/03/05 Python
Django数据库操作之save与update的使用
2020/04/01 Python
Python尾递归优化实现代码及原理详解
2020/10/09 Python
python操作toml文件的示例代码
2020/11/27 Python
POP文化和音乐灵感的时尚:Hot Topic
2019/06/19 全球购物
Kickers鞋英国官网:男士、女士和儿童鞋
2021/03/08 全球购物
Java模拟试题
2014/11/10 面试题
广告业务员岗位职责
2015/02/13 职场文书
2015年敬老院工作总结
2015/05/18 职场文书
2015年高校保卫处工作总结
2015/07/23 职场文书
React如何创建组件
2021/06/27 Javascript