转盘代码,自己搞了一个
<html lang="zh-CN"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <style> </style> <script> var zhuanpanR = 200;//转盘半径 var info = [11,22,33,44,55,66,77,88] var color = ['#78a355','#FF9966','#66CCCC','#99CCFF','#009999','#99CCFF','#99CCCC','#FFCCCC'] var radio = 0.95;//旋转速度衰减系数,影响旋转时间 var splitNum = info.length; var t = null; var ms = 30;//每次定时转动的角度,如30度 var fixed_ms = 30;//每次定时转动的角度,如30度 var total = 720;//总转度数 window.onload = function(){ var canvas = document.getElementById("myCanvas"); var ctx = canvas.getContext("2d"); ctx.translate(zhuanpanR, zhuanpanR);//设置画布中心,旋转时是按中心点为基础来旋转的,默认(0,0) var initDu = 360/splitNum/2; ctx.rotate(initDu*Math.PI/180);//旋转角度,先转半个分割扇形,让竖向中心分割线能平分小扇形 initZhuanpan(8,0); } /** * @param splitNum 拆分扇形份数 * */ function initZhuanpan(splitNum, du){ var canvas = document.getElementById("myCanvas"); var ctx = canvas.getContext("2d"); ctx.rotate(du*Math.PI/180);//旋转角度 ctx.fillStyle="#FF0000"; //画圆和分割线 var step = Math.PI * 2 / splitNum;//一个圆弧对应的弧度 for (var i = 0; i < splitNum; i++) { ctx.save(); ctx.beginPath(); ctx.moveTo(0, 0); ctx.arc(0, 0, 200, i*step,(i+1)*step); ctx.closePath(); ctx.fillStyle = color[i];//getRandomColor(); ctx.fill(); ctx.restore(); } //画文字 for ( var i = 0; i < splitNum; i++) { ctx.save();//调用save()时,将记录当前的绘图状态,并压入一个堆栈中 ctx.beginPath(); ctx.fillStyle="#000"; ctx.font="15px 微软雅黑"; ctx.textAlign="center"; ctx.textBaseline="middle"; ctx.rotate(i*step+step/2); ctx.fillText(info[i],100,0) ctx.restore(); //调用restore()方法时,就会把上一次记录的绘图状态从堆栈中弹出。(出栈的次数不能多于入栈的次数,故程序中restore()调用次数不应多余save()) } } //随机颜色,暂不用 function getRandomColor() { var r = parseInt(Math.random() * 256); var g = parseInt(Math.random() * 256); var b = parseInt(Math.random() * 256); return 'rgb(' + r + ',' + g + ',' + b + ')'; } function start() { //避免快速重复点击 if(t){ return false; } var canvas = document.getElementById("myCanvas"); var ctx = canvas.getContext("2d"); //已转动的角度 var angle = 0; t = setInterval(function(){ angle +=ms; // console.log("angle="+angle); //还有600度的时候开始按0.95衰减,转动角度最低按每30ms转2度 if(total-angle <=600){ ms *= radio; if(ms<=2){ ms = 2; } if(total-angle <=1){ clearInterval(t); var departDu = 360/splitNum; var pos = Math.ceil((total) / departDu); var a = Math.ceil(pos % splitNum); var newA = a + 5;//计算12点方向所属区域文本扇形序号 var res = info[newA]; document.getElementById("result").innerHTML = res; ms=30;//恢复初始值值 t = null; } } ctx.save(); initZhuanpan(splitNum,angle); ctx.restore(); },30); } </script> </head> <body style=""> <div style="margin:100px auto;width:400px;"> 结果:<div id="result">22222</div> <canvas id="myCanvas" width="400" height="400" style="border:1px solid #999999;align:center"></canvas> <button id="btn" style="margin-top:20px;" onclick="start()">抽奖</button> </div> </body> </html>