jQuery 实现九宫格大转盘抽奖
前言前端九宫格抽奖是活动页面非常常见的需求很多新人写抽奖会遇到重复点击、动画变速、随机中奖、定时器控制这几个难点。本文基于 jQuery 原生实现九宫格抽奖实现点击按钮开始滚动、先加速后减速、随机指定中奖格子、滚动到目标奖品停止、防止重复多次点击抽奖。说明本次示例一共 8 个奖品格子 抽奖按钮不是 9 个奖品代码逻辑可以轻松改成 9 格奖品。效果预览页面一个大容器包裹 8 个奖品 div 和抽奖按钮点击【开始抽奖】红色高亮依次在奖品格子循环跑动先越来越快跑满 2 圈之后开始减速最终停在随机选中的奖品上弹出中奖提示。抽奖过程中按钮不可重复点击抽奖结束后恢复点击。完整代码!DOCTYPE html html langzh-CN head meta charsetUTF-8 titlejQuery九宫格抽奖/title script srchttps://cdn.jsdelivr.net/npm/jquery3.7.1/dist/jquery.min.js/script style .box { width: 360px; display: flex; flex-wrap: wrap; gap: 10px; } .prize { width: 100px; height: 100px; background: rgb(71, 71, 118); color: #fff; display: flex; align-items: center; justify-content: center; font-size:16px; border-radius: 6px; } .button { width: 100px; height:100px; margin-top:10px; background: #f56c6c; color:#fff; border:none; border-radius:6px; font-size:16px; cursor: pointer; } /style /head body !-- 九宫格样式 一个大div 里面放九个小格子 class的多类名命名方法 class类名1 类名2 类名3 -- div classbox div classdiv2 prize短裙/div div classdiv3 prize口红/div div classdiv4 prize草莓/div div classdiv5 prize西瓜/div div classdiv6 prize奶茶/div div classdiv7 prize美甲/div div classdiv8 prize谢谢惠顾/div div classdiv9 prize小米手机/div button classbutton开始抽奖/button /div script $(document).ready(function() { let prizes $(.prize); // 使用jQuery获取所有奖品元素 并赋给prizes变量 let but $(.button); // 获取按钮元素 let i 0; //奖品的索引 let total; //定义转的圈数 let inter; //定时器标识 let time 1000; //定时器时间间隔 let randoms; //定义生成随机中奖商品的下标 // but.click(click_rotate); // 点击抽奖事件绑定 采用click方式 绑定事件当按钮被点击时执行 click_rotate 函数 $(.button).on(click, click_rotate); //on绑定触发 //点击抽奖的事件函数 function click_rotate(){ total 0; time 1000; i 0; prizes.eq(i).css(background-color, red); //利用eq(index) 筛选出索引为i的商品 保持颜色为红色 randoms Math.floor(Math.random() * prizes.length); //生成随机中奖物品的随机数 // console.log(randoms); inter setInterval(rotates, time); console.log(inter); but.off(click); //移除点击事件防止重复触发 采用off方式解绑click事件 采用的是变量 $(.button).off(click); //采用的是元素名 对应事件 } // 旋转效果的函数 function rotates(){ //处理奖品高亮移动逻辑 if(i prizes.length - 1){ i; prizes.eq(i).css(background-color, red); prizes.eq(i-1).css(background-color, rgb(71, 71, 118)); } else { i 0; prizes.eq(i).css(background-color, red); prizes.eq(prizes.length - 1).css(background-color, rgb(71, 71, 118)); total; } // 控制旋转速度 if(total 2){ time - 100; if(time 100){ time 100; } } else if(total 2){ time 100; if(time 1000){ time 1000; } } //判断是否中奖 if(total 2 i randoms){ clearInterval(inter); setTimeout(function(){ alert(您本次的中奖结果是 prizes.eq(i).html()); //字符串拼接 .html() prizes.eq(i).css(background-color, rgb(71, 71, 118)); but.click(click_rotate); //重新绑定点击事件 }, 50); } else { clearInterval(inter); inter setInterval(rotates, time); //setInterval执行完一次函数 会返回一个定时器ID 赋值给inter 用于清除定时器 } } }); /script /body /html核心思路讲解1、DOM 结构说明外层.box容器内部 8 个奖品格子统一加prize公共类方便 jQuery 批量获取。多类名写法classdiv2 prizediv2是单独标识prize是奖品公共类最后放抽奖 button 按钮点击触发抽奖。2、变量说明表格变量作用prizes所有奖品 DOM 集合i当前高亮奖品索引total已经转动的圈数inter定时器 id用来清除定时器time定时器间隔数值越小速度越快randoms随机中奖奖品下标3、事件绑定on /off使用.on(click,fn)绑定点击事件抽奖开始时调用.off(click)解绑按钮点击防止用户疯狂多次点击创建多个定时器动画错乱。抽奖结束后重新绑定事件允许下一次抽奖。对比$().click()是简写方式.on()是 jQuery 推荐的事件绑定方式支持事件委托。4、滚动高亮逻辑 rotates ()索引 i 自增当前格子变红上一格恢复原有背景色当索引走到最后一个奖品重置 i0圈数total1实现循环转圈变速逻辑前 2 圈加速time 不断减小最小限制 100ms防止过快超过 2 圈之后减速time 不断变大最大限制 1000ms模拟真实抽奖惯性效果。5、随机中奖判定Math.floor(Math.random() * prizes.length)生成 0 ~ 奖品总数 - 1 的整数下标提前确定中奖位置。 当圈数大于 2 圈并且当前索引等于提前生成的随机下标→ 停止定时器弹出中奖弹窗。关键点先确定中奖结果再开始动画。业务抽奖项目里正式环境这个随机结果应该后端返回前端只负责播放动画防止前端篡改中奖奖品。代码存在的小问题 优化建议频繁销毁重建定时器当前代码每次执行 rotates 都clearInterval再重新setInterval频繁创建定时器容易出现动画抖动。 ✅优化不动态修改定时器改用setTimeout递归每次修改延时时间。弹窗弹出时机 setTimeout 延时 50ms 只是微小延迟生产环境可以增加一点停顿用户体验更好。奖品布局 现在是 flex 自动排列如果要做成传统环形九宫格抽奖四周 8 格 中间按钮需要单独定位每个格子位置当前是简易横向换行九宫格。生产环境必改 前端随机仅适合本地演示正式项目中奖结果由后端接口返回前端不能用 JS 本地随机用户打开控制台可以修改随机逻辑作弊。总结这个案例非常适合前端入门学习定时器、jQueryDOM 操作、事件解绑、动画变速逻辑。 核心要点记住抽奖开始禁用按钮防止多次点击提前确定中奖位置动画跑到目标停止利用定时器间隔 time 实现加速减速定时器用完一定要 clearInterval避免内存泄漏

相关新闻

微博运营策略师:基于 agency-agents 构建热搜、超话与舆情公关的全域运营智能体

微博运营策略师:基于 agency-agents 构建热搜、超话与舆情公关的全域运营智能体

人工智能AI 技能提示工程 【免费下载链接】agency-agents-zh 🎭 277 个即插即用的 AI 专家角色 — 支持 Claude Code/Cursor/Copilot 等 20 种工具,覆盖工程/设计/营销/金融等 20 个部门。含 64 个中国市场原创智能体(小红书/抖音/微信/飞书/…

2026/10/5 6:53:27 阅读更多 →
4个月从被裁到上岸!后端程序员转Agent开发全攻略(收藏版)

4个月从被裁到上岸!后端程序员转Agent开发全攻略(收藏版)

本文分享了作者从被裁后4个月成功转型Agent开发的经验。核心内容是:不要追求一次性掌握所有AI技术,而是利用原有工程经验,重点学习Python基础、LLM调用、Tool Calling、RAG和Agent框架,并完成一个完整项目。作者强调,A…

2026/10/5 6:53:27 阅读更多 →
图数据库系列 · 第 03 篇——核心原理:遍历、模式与图算法

图数据库系列 · 第 03 篇——核心原理:遍历、模式与图算法

无索引邻接 Cypher 匹配 GDS 算法 目 录 一、导读 二、图数据模型与分类 2.1 属性图 vs RDF 图 2.2 原生图存储 vs 非原生 2.3 图数据库 vs 图计算引擎 三、无索引邻接:图遍历的原理 3.1 邻接表组织 3.2 遍历复杂度 3.3 与关系库 JOIN 对比 四、Cypher 模式匹配原…

2026/10/5 6:53:27 阅读更多 →

最新新闻

SpringBoot迁移宝兰德BES 9.5.5信创改造避坑实战指南

SpringBoot迁移宝兰德BES 9.5.5信创改造避坑实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 7:30:44 阅读更多 →
STM32+树莓派+ROS2:扫地机器人全栈嵌入式工程实践

STM32+树莓派+ROS2:扫地机器人全栈嵌入式工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 7:30:44 阅读更多 →
使用 Node.js 读取文本文件并转换为行数组:同步与异步方案全解(30 seconds of code 实战指南)

使用 Node.js 读取文本文件并转换为行数组:同步与异步方案全解(30 seconds of code 实战指南)

教程文档 【免费下载链接】30-seconds-of-code Coding articles to level up your development skills 项目地址: https://gitcode.com/gh_mirrors/30/30-seconds-of-code 点击查看 免费下载 文本文件的读取与解析是服务端编程中出现频率最高的任务之一。本指南以 …

2026/10/5 7:30:44 阅读更多 →
电子信息本科四年规划:嵌入式与芯片方向倒推式学习路线

电子信息本科四年规划:嵌入式与芯片方向倒推式学习路线

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 7:30:44 阅读更多 →
毕业论文怎么降AI?2026年必备教程:5款免费工具盘点与3招人工修改技巧

毕业论文怎么降AI?2026年必备教程:5款免费工具盘点与3招人工修改技巧

学弟学妹们,对着满页飘红的查重报告,看着居高不下的AIGC检测率,是不是瞬间心态失衡?明明熬了好几个通宵敲完的内容,被判定为AI生成,这份委屈实在难平。别着急,降AIGC率远没有想象中复杂&#xf…

2026/10/5 7:30:44 阅读更多 →
SpringBoot+Vue3订单管理系统全栈开发实战解析

SpringBoot+Vue3订单管理系统全栈开发实战解析

洗衣店订单管理系统,听名字是个不起眼的小业务系统,但真把它做扎实了,SpringBootVue3MyBatisMySQL这条前后端分离主链路里的弯弯绕绕基本都能摸一遍。我做这个项目不是为了交差,而是想完整体验一次从需求梳理、数据库设计、后端接…

2026/10/5 7:29:44 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 5:06:42 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →