JS打造“九宫格抽奖”_js实现九宫格抽奖

boyanx3个月前技术教程13

在如今的营销活动中,抽奖功能已经成为提升用户活跃度的标配。尤其是“九宫格抽奖”这种形式,因其视觉冲击力强、交互简单、适配性好,被广泛应用于电商、社交、内容平台等各类场景。本文将带你从零开始,使用 原生 JavaScript 实现一个可配置、可扩展、动画流畅的九宫格抽奖组件,支持运营人员通过 JSON 配置奖品信息,前端无需上线即可更新抽奖内容。

一、总体思路

1. 数据结构:奖品配置 JSON 化

为了支持运营实时配置奖品,我们将奖品信息抽象为 JSON 格式:

优点:前端只负责展示和动画,中奖逻辑由后端控制,避免暴露算法,提升安全性。

2.核心思路

我们将整个抽奖流程抽象为两个核心步骤:

  • 绘制奖品视图:无论使用 flex 、 grid 还是 absolute ,只要按顺序渲染奖品 DOM,顺序即代表“跑道”顺序。
  • 动画高亮奖品:通过setInterval控制高亮项的切换,只操作索引,不依赖具体坐标或行列。

这种设计的好处是:

  • 布局可随意更换(九宫格、圆环、横向跑道);
  • 动画逻辑不变,复用性极高;
  • 支持动态增减奖品数量,只需更新 JSON 和 CSS。

二、html骨架


三、js核心动画

技术亮点:

  • 索引循环: ++index % prizeList.length 保证无限循环;
  • 时间递减: random -= 200 模拟减速刹车效果;
  • 动画与结果分离:动画结束后调用 openDialog() 显示结果,逻辑清晰。

四、业务层

为了防止刷奖和前端篡改,我们将“中奖逻辑”放在后端:
流程如下:

  1. 前端点击“抽奖”按钮;
  2. 请求后端接口,后端根据权重随机计算出中奖奖品;
  3. 后端返回中奖奖品的 id 和对应索引 stopIndex ;
  4. 前端根据 stopIndex 播放动画,最终高亮到对应奖品;
  5. 动画结束后弹出结果提示。

优点:

  • 前端不暴露中奖逻辑,安全性高;
  • 动画与业务解耦,可复用性强;
  • 支持运营实时调整奖品和中奖概率,无需前端上线。

后续优化

  1. 动画性能优化:使用 Web Animations API 或 CSS Animation 替代 setInterval ;
  2. 防抖节流:防止用户快速点击触发多次抽奖;
  3. 状态管理:引入轻量状态机(如 xstate)管理抽奖流程;
  4. 音效与震动:增强用户互动体验。



标签: js弹窗

相关文章

Jcef 例子4_JCEF中js与java交互、js与java相互调用

调用jcef核心代码CefMessageRouter msgRouter = CefMessageRouter.create(new CefMessageRouter.CefMessageRouter...

JavaScript 事件循环机制详解_js事件循环和任务队列

记录、分享IT相关知识和见闻!想要了解更多软件相关知识的朋友!记得右上角添加【关注】,支持一下!JavaScript 是单线程语言,意味着同一时间只能执行一个任务。为了处理异步操作(如定时器、网络请求...

react router页面跳转二次确认弹窗及样式、业务逻辑自定义

我们在编辑页面时如果需要跳走通常会需要给用户提示,react router本身已经给了我们这样的功能,我们先看看怎么使用。初见二次确认弹窗// App.jsx const App = () {...

电脑老是弹出广告怎么解决_电脑老是弹出广告怎么弄掉

 最近在使用电脑的时候,遇到了一种让人抓狂的现象:电脑开机启动后,会直接弹出广告,把广告关闭,本以为会万事大吉,没想到每过一段时间广告都会再次弹出。我们不可能一直忍受这样的广告不断的弹出,这会严重影响...

用HTML内置的popover属性做一个提示窗

如何用Popover魔法在HTML中创建用户友好的提示最近我在阅读一篇关于如何构建"让用户感觉毫不费力"的Web界面的文章,但像tooltip这样的分层UI元素可能成为编码噩梦。我热爱...

极致舒适的Vue弹窗使用方案_vue页面弹窗太多如何处理

一个Hook让你体验极致舒适的Dialog使用方式!Dialog地狱为啥是地狱?因为凡是有Dialog出现的页面,其代码绝对优雅不起来!因为一旦你在也个组件中引入Dialog,就最少需要额外维护一个v...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。