当前位置:首页 > 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 实现vue模板

js 实现vue模板

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

js实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url, f…

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…

js实现自举

js实现自举

实现 JavaScript 自举的方法 JavaScript 自举(Bootstrap)通常指通过 JavaScript 动态加载自身或依赖的脚本,实现运行时环境的初始化或扩展。以下是几种常见实现方式…