JS实现简易转盘抽奖

实现思路
使用HTML+CSS构建转盘界面,通过JavaScript控制旋转动画和抽奖逻辑。核心是随机生成旋转角度,结合CSS过渡效果实现平滑停止。
HTML结构
<div class="wheel-container">
<div class="wheel"></div>
<button class="spin-btn">开始抽奖</button>
<div class="pointer"></div>
</div>
CSS样式
.wheel-container {
position: relative;
width: 300px;
height: 300px;
margin: 0 auto;
}
.wheel {
width: 100%;
height: 100%;
border-radius: 50%;
background: conic-gradient(
red 0deg 60deg,
blue 60deg 120deg,
green 120deg 180deg,
yellow 180deg 240deg,
purple 240deg 300deg,
orange 300deg 360deg
);
transition: transform 4s cubic-bezier(0.17, 0.67, 0.21, 0.99);
}
.pointer {
position: absolute;
top: -20px;
left: 50%;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 15px solid transparent;
border-right: 15px solid transparent;
border-top: 30px solid black;
}
.spin-btn {
display: block;
margin: 20px auto;
padding: 10px 20px;
background: #4CAF50;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
}
JavaScript逻辑
const wheel = document.querySelector('.wheel');
const spinBtn = document.querySelector('.spin-btn');
let isSpinning = false;
spinBtn.addEventListener('click', () => {
if (isSpinning) return;
isSpinning = true;
const segments = 6; // 转盘分段数
const minSpin = 3; // 最小旋转圈数
const maxSpin = 8; // 最大旋转圈数
// 随机生成旋转角度(完整圈数+随机停止位置)
const spinDegrees = Math.floor(Math.random() * (maxSpin - minSpin + 1) + minSpin) * 360;
const finalAngle = spinDegrees + (360 - (spinDegrees % 360) / segments * segments);
wheel.style.transform = `rotate(${-finalAngle}deg)`;
setTimeout(() => {
isSpinning = false;
const winningSegment = Math.floor((finalAngle % 360) / (360 / segments));
alert(`恭喜获得: ${['一等奖', '二等奖', '三等奖', '四等奖', '五等奖', '六等奖'][winningSegment]}`);
}, 4000);
});
功能扩展建议
- 奖品数据可配置化,改为从数组动态生成转盘
- 添加音效增强体验感
- 实现后端接口对接真实抽奖数据
- 增加抽奖次数限制功能
- 使用Canvas绘制更复杂的转盘样式
注意事项
- 旋转动画使用CSS transition实现,确保性能优化
- 最终停止位置计算需考虑转盘分段数
- 防抖处理避免重复点击
- 角度计算时注意顺时针/逆时针方向
- 移动端需添加触摸事件支持







