当前位置:首页 > JavaScript

js实现九宫格抽奖

2026-04-04 08:44:57JavaScript

实现九宫格抽奖的核心思路

九宫格抽奖的核心在于动态控制奖品高亮顺序,最终停在目标奖品位置。以下是具体实现步骤:

HTML 结构设计

采用 ulli 构建九宫格布局,每个格子包含奖品信息:

<div class="lottery-container">
  <ul class="lottery-grid">
    <li data-index="0">奖品1</li>
    <li data-index="1">奖品2</li>
    <li data-index="2">奖品3</li>
    <li data-index="8">奖品4</li>
    <li class="start-btn">开始</li>
    <li data-index="4">奖品5</li>
    <li data-index="7">奖品6</li>
    <li data-index="6">奖品7</li>
    <li data-index="5">奖品8</li>
  </ul>
</div>

CSS 样式设置

使用 Flex 布局实现九宫格,定义高亮状态样式:

.lottery-grid {
  display: flex;
  flex-wrap: wrap;
  width: 300px;
  list-style: none;
  padding: 0;
}

.lottery-grid li {
  width: 100px;
  height: 100px;
  border: 1px solid #ccc;
  display: flex;
  justify-content: center;
  align-items: center;
  cursor: pointer;
}

.lottery-grid li.active {
  background-color: #ffeb3b;
  box-shadow: 0 0 10px gold;
}

.start-btn {
  background-color: #4CAF50;
  color: white;
}

JavaScript 核心逻辑

初始化变量

定义格子索引的遍历顺序(顺时针方向)和动画参数:

const gridOrder = [0, 1, 2, 5, 8, 7, 6, 3]; // 九宫格高亮顺序
let currentIndex = 0;
let speed = 100; // 初始速度
let timer = null;
let cycles = 0; // 旋转圈数
const totalCycles = 3; // 总旋转圈数
const targetPrize = 4; // 假设抽中奖品5

高亮切换函数

控制格子高亮状态的切换:

function highlightNext() {
  document.querySelector('.active')?.classList.remove('active');
  const currentCell = document.querySelector(`[data-index="${gridOrder[currentIndex]}"]`);
  currentCell.classList.add('active');

  currentIndex = (currentIndex + 1) % gridOrder.length;
  if (currentIndex === 0) cycles++;
}

开始抽奖函数

实现加速-减速动画效果:

function startLottery() {
  if (timer) return;

  timer = setInterval(() => {
    highlightNext();

    if (cycles >= totalCycles && gridOrder[currentIndex] === targetPrize) {
      clearInterval(timer);
      timer = null;
      cycles = 0;
      alert(`恭喜获得: ${document.querySelector(`[data-index="${targetPrize}"]`).textContent}`);
    } else {
      speed = cycles >= totalCycles ? 
        Math.min(speed + 20, 200) : // 减速阶段
        Math.max(speed - 5, 50);    // 加速阶段
      clearInterval(timer);
      timer = setInterval(arguments.callee, speed);
    }
  }, speed);
}

document.querySelector('.start-btn').addEventListener('click', startLottery);

完整代码示例

整合所有部分的可运行代码:

js实现九宫格抽奖

<!DOCTYPE html>
<html>
<head>
  <style>
    .lottery-grid { /* 前述CSS样式 */ }
  </style>
</head>
<body>
  <!-- 前述HTML结构 -->

  <script>
    // 前述JavaScript逻辑
  </script>
</body>
</html>

关键优化点

  1. 动画平滑度:通过动态调整 setInterval 的间隔时间实现加速减速效果
  2. 性能考虑:使用 classList 替代直接操作 className
  3. 可配置性totalCyclestargetPrize 可改为从后端接口动态获取
  4. 防重复点击:通过 timer 变量防止抽奖过程中重复触发

扩展功能建议

  1. 接口集成:将 targetPrize 改为从后端接口获取真实抽奖结果
  2. 多奖品支持:扩展为 3x3 以上的格子布局
  3. 音效增强:添加背景音乐和中奖音效
  4. 移动端适配:通过 CSS Media Query 适配不同屏幕尺寸

通过上述实现,可构建一个具有视觉动态效果的九宫格抽奖系统。实际应用中需根据具体需求调整动画参数和奖品配置。

标签: 九宫格js
分享给朋友:

相关文章

js实现倒计时

js实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callbac…

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Par…

js实现拷贝

js实现拷贝

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

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…