当前位置:首页 > JavaScript

js实现轮盘

2026-04-05 17:32:10JavaScript

js实现轮盘抽奖功能

轮盘抽奖是一种常见的互动效果,可以通过CSS动画和JavaScript实现。以下是完整的实现方案:

基本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);
}

.slice {
  position: absolute;
  width: 50%;
  height: 50%;
  transform-origin: 100% 100%;
  left: 0;
  top: 0;
  text-align: center;
}

#spin-btn {
  display: block;
  margin: 20px auto;
  padding: 10px 20px;
  background: #ff5252;
  color: white;
  border: none;
  border-radius: 5px;
  cursor: pointer;
}

JavaScript实现逻辑

const prizes = ['一等奖', '二等奖', '三等奖', '四等奖', '五等奖', '六等奖'];
const colors = ['#FF5252', '#FF4081', '#E040FB', '#7C4DFF', '#536DFE', '#448AFF'];
const wheel = document.querySelector('.wheel');
const spinBtn = document.getElementById('spin-btn');

// 创建轮盘扇形
function createWheel() {
  const sliceAngle = 360 / prizes.length;

  prizes.forEach((prize, index) => {
    const slice = document.createElement('div');
    slice.className = 'slice';
    slice.style.backgroundColor = colors[index];
    slice.style.transform = `rotate(${sliceAngle * index}deg) skewY(${90 - sliceAngle}deg)`;

    const label = document.createElement('div');
    label.textContent = prize;
    label.style.transform = `skewY(${sliceAngle - 90}deg) rotate(${sliceAngle / 2}deg)`;
    label.style.position = 'absolute';
    label.style.right = '20px';
    label.style.top = '30px';

    slice.appendChild(label);
    wheel.appendChild(slice);
  });
}

// 旋转轮盘
function spinWheel() {
  spinBtn.disabled = true;
  const randomAngle = 360 * 5 + Math.floor(Math.random() * 360);
  wheel.style.transform = `rotate(${-randomAngle}deg)`;

  setTimeout(() => {
    const sliceAngle = 360 / prizes.length;
    const normalizedAngle = randomAngle % 360;
    const winningIndex = Math.floor((360 - normalizedAngle) / sliceAngle);
    alert(`恭喜获得: ${prizes[winningIndex]}`);
    spinBtn.disabled = false;
  }, 4000);
}

createWheel();
spinBtn.addEventListener('click', spinWheel);

功能优化建议

增加旋转音效可以提升用户体验:

function playSpinSound() {
  const audio = new Audio('spin-sound.mp3');
  audio.play();
}

添加指针元素可以更清晰地指示获奖结果:

js实现轮盘

<div class="pointer"></div>
.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 #333;
  z-index: 10;
}

注意事项

旋转时间不宜过短,建议保持在3-5秒之间以获得最佳视觉效果。随机角度计算需要考虑完整旋转圈数加上随机角度,确保每次旋转效果自然。获奖结果计算需要对旋转角度进行标准化处理,并映射到对应的奖品区间。

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

相关文章

js 实现vue模板

js 实现vue模板

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

js实现防洪

js实现防洪

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

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的J…

js实现搜索

js实现搜索

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

js图片上传实现

js图片上传实现

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API实现基础图片上传功能。HTML部分需要设置accept="image/…

js实现按钮点击

js实现按钮点击

实现按钮点击的JavaScript方法 HTML按钮元素 在HTML中创建按钮元素,为其添加id或class以便JavaScript选择: <button id="myButton">点…