当前位置:首页 > JavaScript

js实现转盘抽奖

2026-03-01 02:12:43JavaScript

实现转盘抽奖的基本思路

转盘抽奖的核心是通过旋转动画随机停止在某个奖品区域。需要定义奖品区域角度、旋转动画逻辑以及停止后的回调处理。

HTML结构

创建转盘容器和抽奖按钮的HTML结构:

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

CSS样式

使用CSS绘制转盘和定义动画:

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

.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 .section {
  position: absolute;
  width: 50%;
  height: 50%;
  transform-origin: 100% 100%;
}

#spin-btn {
  margin-top: 20px;
  padding: 10px 20px;
}

JavaScript逻辑

实现转盘旋转和随机停止逻辑:

const prizes = [
  { text: "奖品1", color: "#FF6384", angle: 45 },
  { text: "奖品2", color: "#36A2EB", angle: 90 },
  { text: "奖品3", color: "#FFCE56", angle: 135 },
  { text: "奖品4", color: "#4BC0C0", angle: 180 },
  { text: "奖品5", color: "#9966FF", angle: 225 },
  { text: "奖品6", color: "#FF9F40", angle: 270 },
  { text: "奖品7", color: "#8AC24A", angle: 315 },
  { text: "奖品8", color: "#F06292", angle: 360 }
];

const wheel = document.querySelector('.wheel');
const spinBtn = document.getElementById('spin-btn');

// 创建转盘扇形
function createWheelSections() {
  prizes.forEach((prize, index) => {
    const section = document.createElement('div');
    section.className = 'section';
    section.style.backgroundColor = prize.color;
    section.style.transform = `rotate(${index * 45}deg)`;

    const text = document.createElement('div');
    text.textContent = prize.text;
    text.style.position = 'absolute';
    text.style.transform = 'rotate(22.5deg) translate(30px)';
    text.style.transformOrigin = '0 0';

    section.appendChild(text);
    wheel.appendChild(section);
  });
}

// 旋转转盘
function spinWheel() {
  spinBtn.disabled = true;
  const randomSpin = 3600 + Math.floor(Math.random() * 360); // 随机旋转角度
  wheel.style.transform = `rotate(${randomSpin}deg)`;

  setTimeout(() => {
    spinBtn.disabled = false;
    const actualDeg = randomSpin % 360;
    const winnerIndex = Math.floor(actualDeg / 45);
    alert(`恭喜获得: ${prizes[winnerIndex].text}`);
  }, 4000);
}

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

进阶优化

添加缓动动画效果:

wheel.style.transition = 'transform 4s cubic-bezier(0.17, 0.67, 0.12, 0.99)';

增加指针元素:

<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;
}

注意事项

  • 奖品区域角度需要均分360度
  • 旋转动画结束后需要计算实际停止位置
  • 多次快速点击需要防抖处理
  • 移动端需要考虑触摸事件兼容

js实现转盘抽奖

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

相关文章

js实现选项卡

js实现选项卡

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

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

jquery.js

jquery.js

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

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScri…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…