当前位置:首页 > JavaScript

js实现抽奖效果

2026-03-01 04:40:46JavaScript

实现抽奖效果的基本思路

使用JavaScript实现抽奖效果通常涉及随机选择奖项、动画效果以及结果展示。以下是一个完整的实现方案。

核心代码实现

// 奖项配置
const prizes = [
  { name: '一等奖', color: '#f00' },
  { name: '二等奖', color: '#0f0' },
  { name: '三等奖', color: '#00f' },
  { name: '四等奖', color: '#ff0' },
  { name: '五等奖', color: '#f0f' },
  { name: '谢谢参与', color: '#0ff' }
];

// DOM元素
const wheel = document.getElementById('wheel');
const startBtn = document.getElementById('start');
const result = document.getElementById('result');

// 创建转盘
function createWheel() {
  const sectorAngle = 360 / prizes.length;
  prizes.forEach((prize, index) => {
    const sector = document.createElement('div');
    sector.className = 'sector';
    sector.style.transform = `rotate(${sectorAngle * index}deg)`;
    sector.style.backgroundColor = prize.color;
    sector.innerHTML = `<span>${prize.name}</span>`;
    wheel.appendChild(sector);
  });
}

// 抽奖函数
function startLottery() {
  startBtn.disabled = true;
  const duration = 3000; // 动画持续时间
  const spins = 5; // 旋转圈数
  const targetIndex = Math.floor(Math.random() * prizes.length);
  const targetAngle = 360 * spins + (360 / prizes.length) * targetIndex;

  wheel.style.transition = `transform ${duration}ms cubic-bezier(0.17, 0.89, 0.32, 1.27)`;
  wheel.style.transform = `rotate(${targetAngle}deg)`;

  setTimeout(() => {
    result.textContent = `恭喜获得: ${prizes[targetIndex].name}`;
    startBtn.disabled = false;
    wheel.style.transition = 'none';
    wheel.style.transform = `rotate(${targetAngle % 360}deg)`;
  }, duration);
}

// 初始化
createWheel();
startBtn.addEventListener('click', startLottery);

配套CSS样式

#wheel {
  width: 300px;
  height: 300px;
  border-radius: 50%;
  position: relative;
  overflow: hidden;
  transition: transform 0s;
}

.sector {
  position: absolute;
  width: 50%;
  height: 50%;
  transform-origin: 100% 100%;
  left: 0;
  top: 0;
  display: flex;
  align-items: center;
  justify-content: center;
}

.sector span {
  transform: rotate(45deg);
  display: inline-block;
  color: white;
  font-weight: bold;
}

#start {
  margin-top: 20px;
  padding: 10px 20px;
  cursor: pointer;
}

实现要点

转盘动画使用CSS transform实现平滑旋转效果,通过cubic-bezier函数使动画有缓动效果更自然。随机选择目标奖项后计算对应的旋转角度,确保指针最终停在正确位置。

旋转结束后重置transition属性,避免下次旋转时出现异常。通过setTimeout在动画结束后显示结果并重置按钮状态。

扩展功能建议

增加音效增强体验,抽奖过程中播放旋转音效,结束时播放获奖音效。添加中奖概率控制,不同奖项设置不同中奖几率。实现多次抽奖功能,记录历史中奖结果。

js实现抽奖效果

注意事项

确保转盘初始位置与奖项对应关系正确,调试时可以先固定目标奖项测试定位准确性。移动端需要考虑触摸事件支持,添加touchstart等事件处理。性能优化方面,避免频繁DOM操作,使用requestAnimationFrame优化动画。

标签: 效果js
分享给朋友:

相关文章

js实现

js实现

实现 JavaScript 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let co…

js防抖和节流实现

js防抖和节流实现

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

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…

js实现tab选项卡切换

js实现tab选项卡切换

实现Tab选项卡切换的JavaScript方法 使用纯JavaScript实现Tab切换功能,可以通过监听点击事件动态切换内容显示状态。以下是两种常见实现方式: 基础DOM操作实现 // 获取所有…

js实现驼峰

js实现驼峰

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

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…