当前位置:首页 > JavaScript

js实现大转盘

2026-04-04 03:41:05JavaScript

实现大转盘的基本思路

大转盘是一种常见的抽奖交互形式,核心是通过旋转动画随机停止在某个奖品区域。JavaScript实现需结合CSS动画和随机数生成逻辑。

HTML结构设计

<div class="wheel">
  <div class="wheel-items">
    <div class="item" data-angle="0">奖品1</div>
    <div class="item" data-angle="60">奖品2</div>
    <div class="item" data-angle="120">奖品3</div>
    <div class="item" data-angle="180">奖品4</div>
    <div class="item" data-angle="240">奖品5</div>
    <div class="item" data-angle="300">奖品6</div>
  </div>
  <div class="pointer"></div>
</div>
<button id="spin">开始抽奖</button>

CSS样式设置

.wheel {
  position: relative;
  width: 300px;
  height: 300px;
  border-radius: 50%;
  overflow: hidden;
}

.wheel-items {
  width: 100%;
  height: 100%;
  position: relative;
  transition: transform 4s cubic-bezier(0.17, 0.67, 0.12, 0.99);
}

.item {
  position: absolute;
  width: 50%;
  height: 50%;
  left: 50%;
  top: 0;
  transform-origin: 0 100%;
  text-align: center;
  padding-top: 20px;
  box-sizing: border-box;
}

.pointer {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 20px;
  height: 20px;
  background: red;
  border-radius: 50%;
  z-index: 10;
}

JavaScript核心逻辑

const wheel = document.querySelector('.wheel-items');
const spinBtn = document.getElementById('spin');
const items = document.querySelectorAll('.item');

// 奖品角度配置
const prizes = [
  { angle: 0, name: '奖品1' },
  { angle: 60, name: '奖品2' },
  { angle: 120, name: '奖品3' },
  { angle: 180, name: '奖品4' },
  { angle: 240, name: '奖品5' },
  { angle: 300, name: '奖品6' }
];

spinBtn.addEventListener('click', () => {
  // 禁用按钮防止重复点击
  spinBtn.disabled = true;

  // 随机选择奖品索引
  const prizeIndex = Math.floor(Math.random() * prizes.length);
  const selectedPrize = prizes[prizeIndex];

  // 计算旋转角度(多转几圈后停在目标位置)
  const currentRotation = getCurrentRotation();
  const targetRotation = 360 * 5 + selectedPrize.angle;

  // 设置旋转动画
  wheel.style.transform = `rotate(${-targetRotation}deg)`;

  // 动画结束后处理
  wheel.addEventListener('transitionend', () => {
    alert(`恭喜获得: ${selectedPrize.name}`);
    spinBtn.disabled = false;
  }, { once: true });
});

// 获取当前旋转角度
function getCurrentRotation() {
  const style = window.getComputedStyle(wheel);
  const matrix = style.transform.match(/^matrix\((.+)\)$/);
  if (matrix) {
    const values = matrix[1].split(', ');
    const a = values[0];
    const b = values[1];
    return Math.round(Math.atan2(b, a) * (180/Math.PI));
  }
  return 0;
}

实现要点说明

旋转动画使用CSS的transition属性实现平滑效果,cubic-bezier函数控制缓动曲线使转动更自然。

js实现大转盘

角度计算需要考虑多圈旋转(如360*5)来增强视觉效果,最终停在目标奖品对应的角度。

js实现大转盘

transitionend事件监听确保动画完成后执行回调,注意使用{ once: true }参数避免重复绑定。

进阶优化方向

添加音效增强交互体验,中奖概率可配置化,支持动态奖品数据加载。

响应式设计适配不同屏幕尺寸,性能优化避免动画卡顿,增加开始/停止缓冲动画。

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

相关文章

js实现分页

js实现分页

实现分页的基本思路 分页功能通常需要处理数据分割、页码生成和用户交互。核心逻辑包括计算总页数、根据当前页截取数据、渲染页码按钮等。 前端分页实现(静态数据) 假设已有全部数据,仅需前端分页展示:…

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval 实…

js 实现分页

js 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整数…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

节流js实现

节流js实现

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