当前位置:首页 > JavaScript

js实现抽奖

2026-04-03 19:28:13JavaScript

JavaScript 实现抽奖功能

实现抽奖功能的核心在于随机选择中奖者或奖品,并展示动画效果增强用户体验。以下是几种常见实现方式:

基础随机抽奖

使用 Math.random() 生成随机数选择中奖项:

js实现抽奖

const prizes = ['一等奖', '二等奖', '三等奖', '谢谢参与'];
function drawLottery() {
  const index = Math.floor(Math.random() * prizes.length);
  return prizes[index];
}
console.log(drawLottery());

带概率控制的抽奖

为不同奖项设置不同中奖概率:

js实现抽奖

const prizePool = [
  { name: 'iPhone', prob: 0.01 },
  { name: '红包', prob: 0.2 },
  { name: '谢谢参与', prob: 0.79 }
];

function weightedDraw() {
  const random = Math.random();
  let cumulativeProb = 0;
  for (const prize of prizePool) {
    cumulativeProb += prize.prob;
    if (random <= cumulativeProb) return prize.name;
  }
}

转盘动画效果

结合 CSS 实现视觉动画:

<div id="wheel"></div>
<button onclick="spinWheel()">开始抽奖</button>

<style>
  #wheel {
    width: 300px;
    height: 300px;
    border-radius: 50%;
    background: conic-gradient(
      red 0% 10%,
      green 10% 35%,
      blue 35% 100%
    );
    transition: transform 3s cubic-bezier(0.17, 0.85, 0.43, 0.96);
  }
</style>

<script>
  function spinWheel() {
    const wheel = document.getElementById('wheel');
    const rotations = 5 + Math.floor(Math.random() * 5);
    const degree = 360 * rotations + Math.floor(Math.random() * 360);
    wheel.style.transform = `rotate(${degree}deg)`;

    setTimeout(() => {
      const actualPrize = calculatePrize(degree % 360);
      alert(`恭喜获得: ${actualPrize}`);
    }, 3000);
  }

  function calculatePrize(deg) {
    if (deg < 36) return '一等奖';
    if (deg < 126) return '二等奖';
    return '三等奖';
  }
</script>

九宫格抽奖

实现常见的跳格动画效果:

let currentIndex = 0;
const blocks = document.querySelectorAll('.block');

function startJump() {
  clearInterval(window.jumpInterval);
  const targetIndex = Math.floor(Math.random() * 8);

  window.jumpInterval = setInterval(() => {
    blocks.forEach(b => b.classList.remove('active'));
    currentIndex = (currentIndex + 1) % 8;
    blocks[currentIndex].classList.add('active');

    if (currentIndex === targetIndex) {
      clearInterval(window.jumpInterval);
      setTimeout(() => alert(`中奖: ${blocks[targetIndex].textContent}`), 500);
    }
  }, 100);
}

注意事项

  1. 概率设置需确保总和为 1
  2. 动画持续时间应与实际抽奖计算同步
  3. 移动端需考虑触摸事件支持
  4. 高频率抽奖建议使用 requestAnimationFrame 替代 setInterval

实际项目中可根据需求组合这些方法,加入开始/停止按钮、奖品计数等完整功能。

标签: js
分享给朋友:

相关文章

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…

js实现tab选项卡切换

js实现tab选项卡切换

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

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…

js怎么实现异步

js怎么实现异步

异步实现方法 JavaScript中实现异步操作主要通过以下几种方式: Promise Promise是ES6引入的异步解决方案,用于处理异步操作的成功或失败状态。 const promise =…