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操纵Cookie实现购物车程序
Nov 23 Javascript
通用JS事件写法实现代码
Jan 07 Javascript
JS对话框_JS模态对话框showModalDialog用法总结
Jan 11 Javascript
JavaScript严格模式禁用With语句的原因
Oct 20 Javascript
javascript实现了照片拖拽点击置顶的照片墙代码
Apr 03 Javascript
jQuery插件扩展操作入门示例
Jan 16 Javascript
Vue2.0实现购物车功能
Jun 05 Javascript
jQuery鼠标移动图片上实现放大效果
Jun 25 jQuery
angular2 ng build部署后base文件路径问题详细解答
Jul 15 Javascript
解决在vue+webpack开发中出现两个或多个菜单公用一个组件问题
Nov 28 Javascript
Vue.js实现数据响应的方法
Aug 13 Javascript
JavaScript实现PC端四格密码输入框功能
Feb 19 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
php模块memcache和memcached区别分析
2011/06/14 PHP
PHP对象转换为数组函数(递归方法)
2012/02/04 PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
2017/01/12 PHP
JS之小练习代码
2008/10/12 Javascript
JS操作JSON要领详细总结
2013/08/25 Javascript
jquery 实现返回顶部功能
2014/11/17 Javascript
后台获取ZTREE选中节点的方法
2015/02/12 Javascript
jQuery实现图片文字淡入淡出效果
2015/12/21 Javascript
分享几种比较简单实用的JavaScript tabel切换
2015/12/31 Javascript
原生JS实现左右箭头选择日期实例代码
2017/03/14 Javascript
JS实现中文汉字按拼音排序的方法
2017/10/09 Javascript
VUE+Element UI实现简单的表格行内编辑效果的示例的代码
2018/10/31 Javascript
jQuery事件blur()方法的使用实例讲解
2019/03/30 jQuery
javascript 易错知识点实例小结
2020/04/25 Javascript
js和jquery判断数据类型的4种方法总结
2020/08/28 jQuery
ant-design-vue中的select选择器,对输入值的进行筛选操作
2020/10/24 Javascript
基于Cesium绘制抛物弧线
2020/11/18 Javascript
[06:11]2014DOTA2国际邀请赛 专访团结一心的VG战队
2014/07/21 DOTA
深入Python函数编程的一些特性
2015/04/13 Python
python使用wmi模块获取windows下硬盘信息的方法
2015/05/15 Python
Python使用Redis实现作业调度系统(超简单)
2016/03/22 Python
浅谈Python基础之I/O模型
2017/05/11 Python
浅谈django model的get和filter方法的区别(必看篇)
2017/05/23 Python
SVM基本概念及Python实现代码
2017/12/27 Python
推荐10款最受Python开发者欢迎的Python IDE
2018/09/16 Python
CSS3制作精致的照片墙特效
2016/06/07 HTML / CSS
巴西网上药店:Drogaria Araujo
2021/01/06 全球购物
新学期红领巾广播稿
2014/01/14 职场文书
导游个人求职信
2014/04/25 职场文书
旅游活动总结
2014/08/27 职场文书
新闻发布会活动策划方案
2014/09/15 职场文书
反四风个人对照检查材料
2014/09/26 职场文书
幼儿园见习报告
2014/10/30 职场文书
党员个人年度总结
2015/02/14 职场文书
HR在给员工开具离职证明时,需要注意哪些问题?
2019/07/03 职场文书
什么是动态刷新率DRR? Windows11动态刷新率功能介绍
2021/11/21 数码科技