当前位置:首页 > 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函数控制缓动曲线使转动更自然。

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

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

进阶优化方向

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

js实现大转盘

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

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

相关文章

js 实现vue模板

js 实现vue模板

实现 Vue 模板的 JavaScript 方法 通过原生 JavaScript 可以实现类似 Vue 的模板渲染功能,主要包括数据绑定、指令处理和模板解析。以下是核心实现思路: 数据绑定与…

jquery.js

jquery.js

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互等操作。以下是关于 jQuery.js 的核心信息和使用方法: 获…

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(func,…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…

js实现吸色

js实现吸色

使用Canvas实现吸色功能 通过Canvas的getImageData方法获取像素颜色数据。创建一个Canvas元素,将目标图像绘制到Canvas上,通过鼠标事件获取坐标对应的颜色值。 const…