当前位置:首页 > JavaScript

js实现转盘抽奖

2026-01-30 11:06:38JavaScript

js实现转盘抽奖

实现思路

使用HTML、CSS和JavaScript创建一个转盘抽奖功能。核心是通过CSS动画实现转盘旋转,JavaScript控制旋转时间和停止位置。

js实现转盘抽奖

HTML结构

<div class="wheel-container">
  <div class="wheel"></div>
  <button id="spin-btn">开始抽奖</button>
</div>

CSS样式

.wheel-container {
  position: relative;
  width: 300px;
  height: 300px;
  margin: 0 auto;
}

.wheel {
  width: 100%;
  height: 100%;
  border-radius: 50%;
  position: relative;
  overflow: hidden;
  transition: transform 4s cubic-bezier(0.17, 0.67, 0.12, 0.99);
  transform: rotate(0deg);
}

/* 添加奖品扇形区域 */
.wheel::before {
  content: '';
  position: absolute;
  width: 50%;
  height: 50%;
  background: conic-gradient(
    #ff0000 0deg 60deg,
    #00ff00 60deg 120deg,
    #0000ff 120deg 180deg,
    #ffff00 180deg 240deg,
    #ff00ff 240deg 300deg,
    #00ffff 300deg 360deg
  );
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  margin: auto;
  border-radius: 50%;
}

#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.getElementById('spin-btn');
let canSpin = true;

// 奖品配置
const prizes = ['一等奖', '二等奖', '三等奖', '四等奖', '五等奖', '六等奖'];
const prizeAngles = [30, 90, 150, 210, 270, 330]; // 每个奖品的中心角度

spinBtn.addEventListener('click', () => {
  if (!canSpin) return;

  canSpin = false;
  const randomIndex = Math.floor(Math.random() * prizes.length);
  const targetAngle = 360 * 5 + prizeAngles[randomIndex]; // 旋转5圈后停在目标位置

  wheel.style.transform = `rotate(${-targetAngle}deg)`;

  setTimeout(() => {
    alert(`恭喜获得: ${prizes[randomIndex]}`);
    canSpin = true;
  }, 4000);
});

实现说明

  1. 使用CSS的conic-gradient创建彩色扇形转盘
  2. 通过transform和transition实现平滑旋转动画
  3. 计算随机停止位置时添加多圈旋转效果
  4. 使用标志位防止重复点击
  5. 旋转结束后显示中奖信息

扩展功能

如果需要更精确控制,可以改用requestAnimationFrame实现动画:

let startTime;
let startAngle = 0;
const duration = 4000; // 动画持续时间

function spinWheel(targetAngle) {
  startTime = null;
  startAngle = 0;

  function animate(timestamp) {
    if (!startTime) startTime = timestamp;
    const progress = Math.min((timestamp - startTime) / duration, 1);
    const currentAngle = easeOut(progress) * targetAngle;

    wheel.style.transform = `rotate(${-currentAngle}deg)`;

    if (progress < 1) {
      requestAnimationFrame(animate);
    } else {
      const prizeIndex = Math.floor(((targetAngle % 360) / 360) * prizes.length);
      alert(`恭喜获得: ${prizes[prizeIndex]}`);
      canSpin = true;
    }
  }

  requestAnimationFrame(animate);
}

function easeOut(t) {
  return 1 - Math.pow(1 - t, 3);
}

注意事项

  1. 确保奖品角度与奖品数量匹配
  2. 旋转时间不宜过短或过长
  3. 移动端需要考虑触摸事件
  4. 可以添加音效增强体验

标签: 转盘js
分享给朋友:

相关文章

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…

js实现搜索

js实现搜索

实现搜索功能的方法 在JavaScript中实现搜索功能可以通过多种方式完成,以下是几种常见的实现方法。 使用数组的filter方法 通过数组的filter方法可以筛选出符合条件的数据项。假设有一个…