最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS打造九宮格抽獎的思路及實現(xiàn)代碼

 更新時間:2025年11月25日 10:33:54   作者:前端小巷子  
九宮格抽獎是一種常見的前端交互功能,通常用于網(wǎng)頁或移動應(yīng)用中的抽獎活動,下面這篇文章主要介紹了JS打造九宮格抽獎思路及實現(xiàn)的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

前言

在如今的營銷活動中,抽獎功能已經(jīng)成為提升用戶活躍度的標配。尤其是“九宮格抽獎”這種形式,因其視覺沖擊力強、交互簡單、適配性好,被廣泛應(yīng)用于電商、社交、內(nèi)容平臺等各類場景。本文將帶你從零開始,使用 原生 JavaScript 實現(xiàn)一個可配置、可擴展、動畫流暢的九宮格抽獎組件,支持運營人員通過 JSON 配置獎品信息,前端無需上線即可更新抽獎內(nèi)容。

一、總體思路

1. 數(shù)據(jù)結(jié)構(gòu):獎品配置 JSON 化

為了支持運營實時配置獎品,我們將獎品信息抽象為 JSON 格式:

[
  {"id":1,"name":"iPhone","img":"http://cdn/1.png"},
  {"id":2,"name":"現(xiàn)金50元","img":"http://cdn/2.png"},
  {"id":3,"name":"HUAWEI","img":"http://cdn/3.png"},
  {"id":4,"name":"現(xiàn)金10元","img":"http://cdn/4.png"},
  {"id":5,"name":"謝謝參與","img":"http://cdn/5.png"},
  {"id":6,"name":"手機優(yōu)惠券","img":"http://cdn/6.png"},
  {"id":7,"name":"電腦優(yōu)惠券","img":"http://cdn/7.png"},
  {"id":8,"name":"U盤","img":"http://cdn/8.png"}
]

優(yōu)點:前端只負責展示和動畫,中獎邏輯由后端控制,避免暴露算法,提升安全性。

2.核心思路

我們將整個抽獎流程抽象為兩個核心步驟:

  • 繪制獎品視圖:無論使用 flex 、 grid 還是 absolute ,只要按順序渲染獎品 DOM,順序即代表“跑道”順序。
  • 動畫高亮獎品:通過setInterval控制高亮項的切換,只操作索引,不依賴具體坐標或行列。

這種設(shè)計的好處是:

  • 布局可隨意更換(九宮格、圓環(huán)、橫向跑道);
  • 動畫邏輯不變,復用性極高;
  • 支持動態(tài)增減獎品數(shù)量,只需更新 JSON 和 CSS。

二、html骨架

<div class="main">
        <div class="content-container">
            <div class="prize-list">
                <img src="./img/prize_1.png" alt="">
                <span>IphoneX</span>
            </div>
            <div class="prize-list">
                <img src="./img/prize_2.png" alt="">
                <span>現(xiàn)金50元</span>
            </div>
            <div class="prize-list">
                <img src="./img/prize_3.png" alt="">
                <span>HUAWEI</span>
            </div>
            <div class="prize-list">
                <img src="./img/prize_4.png" alt="">
                <span>現(xiàn)金10元</span>
            </div>
            <div class="prize-list">
                <img src="./img/prize_5.png" alt="">
                <span>謝謝參與</span>
            </div>
            <div class="prize-list">
                <img src="./img/prize_6.png" alt="">
                <span>手機優(yōu)惠券</span>
            </div>
            <div class="prize-list">
                <img src="./img/prize_7.png" alt="">
                <span>電腦優(yōu)惠券</span>
            </div>
            <div class="prize-list">
                <img src="./img/prize_8.png" alt="">
                <span>U盤</span>
            </div>
            <!-- 中心內(nèi)容部分 -->
            <div class="handler-container">
                <div class="inner-container">
                    <img class="handler-left" src="./img/center_1.png" alt="">
                    <div class="handler-container-middle">
                        還可以抽獎 <span class="prize-number">0</span> 次
                    </div>
                    <div class="handler-container-btn"></div>
                </div>
            </div>
        </div>

        <div class="dialog-container">
            <div class="dialog-main">
                <div class="head">
                    <span class="title">溫馨提示</span>
                    <span class="close">&times;</span>
                </div>
                <div class="content">
                    每次抽獎將消耗 8000 積分
                </div>
                <div class="dialog-main-footer">
                    <div class="button">再來一次</div>
                </div>
            </div>
        </div>
    </div>

三、js核心動畫

  var runGame = function () {
    var random = Math.floor(Math.random() * 6000 + 3000)
    timer = setInterval(function () {
      random -= 200
      if (random < 200) {
        clearInterval(timer)
        timer = null
        openDialog()
        return
      }
      currentIndex = ++index % prizeList.length
      prizeList.forEach(function (node) {
        node.classList.remove('active')
      })
      prizeList[currentIndex].classList.add('active')
    }, 50)
  }

技術(shù)亮點:

  • 索引循環(huán): ++index % prizeList.length 保證無限循環(huán);
  • 時間遞減: random -= 200 模擬減速剎車效果;
  • 動畫與結(jié)果分離:動畫結(jié)束后調(diào)用 openDialog() 顯示結(jié)果,邏輯清晰。

四、業(yè)務(wù)層

為了防止刷獎和前端篡改,我們將“中獎邏輯”放在后端:
流程如下:

  1. 前端點擊“抽獎”按鈕;
  2. 請求后端接口,后端根據(jù)權(quán)重隨機計算出中獎獎品;
  3. 后端返回中獎獎品的 id 和對應(yīng)索引 stopIndex ;
  4. 前端根據(jù) stopIndex 播放動畫,最終高亮到對應(yīng)獎品;
  5. 動畫結(jié)束后彈出結(jié)果提示。

? 優(yōu)點:

  • 前端不暴露中獎邏輯,安全性高;
  • 動畫與業(yè)務(wù)解耦,可復用性強;
  • 支持運營實時調(diào)整獎品和中獎概率,無需前端上線。

后續(xù)優(yōu)化建議

  1. 動畫性能優(yōu)化:使用 Web Animations API 或 CSS Animation 替代 setInterval ;

  2. 防抖節(jié)流:防止用戶快速點擊觸發(fā)多次抽獎;

  3. 狀態(tài)管理:引入輕量狀態(tài)機(如 xstate)管理抽獎流程;

  4. 音效與震動:增強用戶互動體驗。
    化建議

  5. 動畫性能優(yōu)化:使用 Web Animations API 或 CSS Animation 替代 setInterval ;

  6. 防抖節(jié)流:防止用戶快速點擊觸發(fā)多次抽獎;

  7. 狀態(tài)管理:引入輕量狀態(tài)機(如 xstate)管理抽獎流程;

  8. 音效與震動:增強用戶互動體驗。

總結(jié) 

到此這篇關(guān)于JS打造九宮格抽獎的思路及實現(xiàn)的文章就介紹到這了,更多相關(guān)JS九宮格抽獎內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • js獲取光標位置和設(shè)置文本框光標位置示例代碼

    js獲取光標位置和設(shè)置文本框光標位置示例代碼

    本實例描述了如何用Javascript來控制和獲取文本框/文本域的鼠標光標位置,以下代碼兼容IE和Chrome,F(xiàn)irefox,大家參考使用吧
    2014-01-01
  • 基于JavaScript代碼實現(xiàn)pc與手機之間的跳轉(zhuǎn)

    基于JavaScript代碼實現(xiàn)pc與手機之間的跳轉(zhuǎn)

    本文通過一段代碼實例給大家介紹pc跳轉(zhuǎn)手機代碼,手機跳轉(zhuǎn)pc網(wǎng)站代碼的相關(guān)知識,對js跳轉(zhuǎn)代碼相關(guān)知識感興趣的朋友一起通過本篇文章學習吧
    2015-12-12
  • JS判斷對象屬性是否存在的五種方案分享

    JS判斷對象屬性是否存在的五種方案分享

    編寫JS的過程中,我們經(jīng)常用到對象,也會用到對象中的屬性,下面這篇文章主要給大家介紹了關(guān)于JS判斷對象屬性是否存在的五種方案,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-01-01
  • JavaScript常用事件介紹

    JavaScript常用事件介紹

    今天小編就為大家分享一篇關(guān)于JavaScript常用事件介紹,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • 用javascript實現(xiàn)給出的盒子的序列是否可連為一矩型

    用javascript實現(xiàn)給出的盒子的序列是否可連為一矩型

    用javascript實現(xiàn)給出的盒子的序列是否可連為一矩型...
    2007-08-08
  • 動態(tài)添加js事件實現(xiàn)代碼

    動態(tài)添加js事件實現(xiàn)代碼

    動態(tài)添加js事件,主要是不用具體指定位置的事件,這種動態(tài)添加事件的方法比較方便,并可以擴展等。
    2009-03-03
  • ibm官方資料把應(yīng)用程序從 Internet Explorer 遷移到 Mozilla

    ibm官方資料把應(yīng)用程序從 Internet Explorer 遷移到 Mozilla

    使特定于 Internet Explorer 的 Web 應(yīng)用程序在 Mozilla 上運行時,您遇到過麻煩嗎?本文討論了將應(yīng)用程序遷移到基于開源 Mozilla 瀏覽器上時的常見問題。首先討論跨瀏覽器開發(fā)的基本技術(shù),然后介紹克服 Mozilla 和 Internet Explorer 之間差異的策略。
    2008-04-04
  • 淺析TypeScript 命名空間

    淺析TypeScript 命名空間

    命名空間一個最明確的目的就是解決重名問題。這篇文章主要介紹了TypeScript 命名空間的相關(guān)知識,本文通過實例詳解給大家介紹的非常詳細,需要的朋友可以參考下
    2020-03-03
  • Javascript中實現(xiàn)String.startsWith和endsWith方法

    Javascript中實現(xiàn)String.startsWith和endsWith方法

    這篇文章主要介紹了Javascript中實現(xiàn)String.startsWith和endsWith方法,這兩個很好用的方法在JS中沒有,本文就自己編碼實現(xiàn)了這兩個方法,需要的朋友可以參考下
    2015-06-06
  • JavaScript中字符串的常用方法總結(jié)

    JavaScript中字符串的常用方法總結(jié)

    這篇文章主要為大家總結(jié)了一些JavaScript中字符串的常用方法,文中的示例代碼講解詳細,對我們學習JavaScript有一定的幫助,需要的可以參考一下
    2022-12-12

最新評論

石门县| 中方县| 安福县| 政和县| 桂林市| 中宁县| 乌拉特前旗| 辰溪县| 长泰县| 博野县| 筠连县| 涟源市| 漠河县| 泸定县| 霞浦县| 元阳县| 东至县| 绥中县| 英德市| 浮山县| 阿图什市| 璧山县| 和林格尔县| 神农架林区| 柳林县| 罗田县| 富川| 湘乡市| 基隆市| 巩义市| 鄂温| 北票市| 商丘市| 东方市| 崇明县| 安丘市| 民权县| 潍坊市| 淳安县| 漳浦县| 浑源县|