问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

用html5+js 做一个转盘抽奖怎么做,求源码!

发布网友 发布时间:2022-04-29 11:32

我来回答

2个回答

懂视网 时间:2022-05-12 04:39

本篇文章给大家带来的内容是关于HTML5 canvas实现中奖转盘的实例代码,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

最近在学canvas做动画,于是就写个转盘练下手。
上个简陋的成果图(中间那个是转的指针,外面的圈是图片,懒得写了哈哈哈)

1565300737-5b682bdbd48ac_articlex.png

代码很简单,都注释了,直接上代码吧,嘤嘤嘤

html

<body>
 <canvas id="canvas">您的浏览器不支持canvas</canvas>
 <img src="./zp.jpg" alt="" id="img">
</body>

css

<style>
 #canvas{
 position: absolute;
 left: 230px;
 top: 230px;
 }
 #img{
 width: 600px;
 height: 600px;
 }
 </style>

js

 var canvas = document.getElementById('canvas');
 var context = canvas.getContext('2d');
 //设定画布和宽
 canvas.width=140;
 canvas.height=140;
 var then = Date.now();
 var now;//利用时间差来控制转盘最小转动时间
 var first_deg=0;//用来记录转动的角度
 var rotate_deg=0;//每次转动的角度,用来实现变速运动
 var end_deg =85;//中奖角度
 var speedUp = true;//判断是否在加速阶段
 var f;

 // 因为canvas的rotate函数是根据左上角坐标(0,0)来旋转的,所以移动画布
 context.translate(70,70);
 function draw(){
 context.clearRect(-70, -70, 70, 70);
 context.beginPath();
 context.arc(0, 0, 50, Math.PI / 180 * 0, Math.PI / 180 * 360, true);
 context.moveTo(-50,0);
 context.lineTo(50,0);
 context.lineTo(0,-70);
 context.rotate(rotate_deg*Math.PI/180);
 context.closePath();
 context.fillStyle='red';
 context.fill(); 
 }
// 将运动分为3段,加速,匀速,减速
 function loop(){

 //循环调用,产生动画效果
 f = window.requestAnimationFrame(loop);
 now = Date.now();

 //开始加速转动,转到速度为20就不加速了,至于为什么是20,看起来舒服而已
 if(rotate_deg<=20&&speedUp){
 rotate_deg +=1;
 };

 //2s后开始减速(即最小转动时间),减速是为了视觉上的美观
 if(now - then > 2000){

 //如果下面设置的是固定角度,那这里的最小速度建议为1,因为每次转动角度过大,一圈很可能错过中奖的角度,导致转很多圈。
 if(rotate_deg>=2){
 speedUp = false;
 rotate_deg -=1;
 }
 //设置中奖区间为+-5度(设置固定角度会让动画有点难看)
 if(first_deg%360>=end_deg-5&&first_deg%360<=end_deg+5){
 window.cancelAnimationFrame(f);//停止循环
 //中奖操作
 }
 };
 first_deg += rotate_deg;//记录转过的角度
 draw();//绘制图形
 }
 loop();

最后

现在这个转盘比较大的问题就是,如果中奖区间比较小,那减速后转动的时间就长一些,最低速度转很久才停下。当区间大的时候一下子就停下了,减速效果不明显,视觉上看起来很奇怪。

相关文章推荐:

html5 canvas用来绘制弧形的代码实现

HTML5实现魔方游戏的代码

HTML5结合互联网+ 实现的3D隧道(附代码)

热心网友 时间:2022-05-12 01:47

5分给你个程序。。。
自己参考改吧

<input type="button" value="开始旋转" onclick="spin();" style="float: left;" />
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />

<canvas id="wheelcanvas" width="500" height="500"></canvas>
<script type="application/javascript">
var colors = ["#B8D430", "#3AB745", "#029990", "#3501CB",
"#2E2C75", "#673A7E", "#CC0071", "#F80120",
"#F35B20", "#FB9A00", "#FFCC00", "#FEF200"];
var restaraunts = ["北京", "上海", "天津", "南京",
"杭州", "深圳", "武汉", "济南",
"重庆", "大连", "合肥", "郑洲"];

var startAngle = 0;
var arc = Math.PI / 6;
var spinTimeout = null;

var spinArcStart = 10;
var spinTime = 0;
var spinTimeTotal = 0;

var ctx;

function draw() {
drawRouletteWheel();
}

function drawRouletteWheel() {
var canvas = document.getElementById("wheelcanvas");
if (canvas.getContext) {
var outsideRadius = 200;
var textRadius = 160;
var insideRadius = 125;

ctx = canvas.getContext("2d");
ctx.clearRect(0,0,500,500);

ctx.strokeStyle = "black";
ctx.lineWidth = 2;

ctx.font = 'bold 12px sans-serif';

for(var i = 0; i < 12; i++) {
var angle = startAngle + i * arc;
ctx.fillStyle = colors[i];

ctx.beginPath();
ctx.arc(250, 250, outsideRadius, angle, angle + arc, false);
ctx.arc(250, 250, insideRadius, angle + arc, angle, true);
ctx.stroke();
ctx.fill();

ctx.save();
ctx.shadowOffsetX = -1;
ctx.shadowOffsetY = -1;
ctx.shadowBlur = 0;
ctx.shadowColor = "rgb(220,220,220)";
ctx.fillStyle = "black";
ctx.translate(250 + Math.cos(angle + arc / 2) * textRadius, 250 + Math.sin(angle + arc / 2) * textRadius);
ctx.rotate(angle + arc / 2 + Math.PI / 2);
var text = restaraunts[i];
ctx.fillText(text, -ctx.measureText(text).width / 2, 0);
ctx.restore();
}

//Arrow
ctx.fillStyle = "black";
ctx.beginPath();
ctx.moveTo(250 - 4, 250 - (outsideRadius + 5));
ctx.lineTo(250 + 4, 250 - (outsideRadius + 5));
ctx.lineTo(250 + 4, 250 - (outsideRadius - 5));
ctx.lineTo(250 + 9, 250 - (outsideRadius - 5));
ctx.lineTo(250 + 0, 250 - (outsideRadius - 13));
ctx.lineTo(250 - 9, 250 - (outsideRadius - 5));
ctx.lineTo(250 - 4, 250 - (outsideRadius - 5));
ctx.lineTo(250 - 4, 250 - (outsideRadius + 5));
ctx.fill();
}
}

function spin() {
spinAngleStart = Math.random() * 10 + 10;
spinTime = 0;
spinTimeTotal = Math.random() * 3 + 4 * 1000;
rotateWheel();
}

function rotateWheel() {
spinTime += 30;
if(spinTime >= spinTimeTotal) {
stopRotateWheel();
return;
}
var spinAngle = spinAngleStart - easeOut(spinTime, 0, spinAngleStart, spinTimeTotal);
startAngle += (spinAngle * Math.PI / 180);
drawRouletteWheel();
spinTimeout = setTimeout('rotateWheel()', 30);
}

function stopRotateWheel() {
clearTimeout(spinTimeout);
var degrees = startAngle * 180 / Math.PI + 90;
var arcd = arc * 180 / Math.PI;
var index = Math.floor((360 - degrees % 360) / arcd);
ctx.save();
ctx.font = 'bold 30px sans-serif';
var text = restaraunts[index]
ctx.fillText(text, 250 - ctx.measureText(text).width / 2, 250 + 10);
ctx.restore();
}

function easeOut(t, b, c, d) {
var ts = (t/=d)*t;
var tc = ts*t;
return b+c*(tc + -3*ts + 3*t);
}

draw();
</script>
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
情侣文案英文高级浪漫87句 Love to the people don't wave.什么意思 gladtomeetyou怎么 gladtomeetyou.怎么回答 2016生肖猴运程 武汉买房88平方满50万落户政策 非武汉市户口在武汉市购买70平方总价50万的商品房,可以转户口吗... 我想在武汉买一套50万左右的新房子,谁能告诉我现在武昌,关山,江夏,有... 支付宝怎么开通步数授权? 总价50万能在武汉买一套两室一天的二手房吗? js转盘抽奖求解释里面部分代码的原理 js随机抽奖一二三等奖不重复的抽奖逻辑怎么设置 求帮忙写一个js的代码,模拟一下简单的抽奖。显示页面是假的滚动效果... 你喝过最好喝的酸奶是什么? 一个人宅在家不知道吃什么怎么办? 在sciencedirect如何导出外文文献格式 Php 验证码解决方案。目前我是在服务器端GD库生成验证码图片输出到客户端,同时设置session 怎么用手机学习? 陈麻婆豆腐的所授荣誉 四川小吃&quot;陈麻婆豆腐&quot;的来历?谢谢了,大神帮忙啊 麻婆豆腐怎么做才有家的味道呢? 苹果速速贷苹果怎么下载? 现金借款app可靠吗 恒易速贷微信公众号 恒易速贷可以相信吗 安易速贷靠谱吗?让审批出额度之后让缴纳600元的包装费用,是骗人的吗! 有谁在易速贷上面借过款靠谱吗 苹果X没有显示ICLOUD 联想笔记本电脑如何进去bios界面vt? 华为手机怎么拍摄慢动作照片 求一个ASP+JS/flash的转盘抽奖源代码 如何用js随机产生四个随机字母 js实现数字滚动,就和摇奖一样,数字滚动中,按一下停止按钮,数字就可以停 ... js写抽奖转盘怎么设置中奖几率 大佬们,js如何在0到100内取1个数字,要求每次不同 就是点一下按钮出一... js数组随机抽取显示,怎么控制指定元素显示的概率 如何运用PHP GD库生成验证码 亦余心之所善兮出自哪一部作品翻译 “亦余心之所善兮,虽九死其犹未悔”出自哪里 心之所善兮,虽九死其犹未悔”出自哪里 亦余心之所善兮,虽九死其犹未悔——出自哪里? “亦余心之所善兮,虽九死其犹未悔”出自四大名著里的哪一部,或是谁写的 “亦余心之所善兮,虽九死其犹未悔”这句话和——(什么诗人)的——(哪句诗)表达的意思一样? 应收账款净值怎么计算 会计上资产负债表应收账款的净值公式是甚么 什么是应收帐款净额?怎样计算? 应收账款净额怎么算? 应收帐款净额怎么算 资产负债表中的净值要怎么算? 应收账款净额怎么计算?