原生JS實現(xiàn)H5轉(zhuǎn)盤游戲的示例代碼
本文是真實的實戰(zhàn)項目,可以直接拿去用 —— 轉(zhuǎn)盤抽獎
可以自由調(diào)整概率,你也可以成為黑心商家
項目效果是這樣滴:視頻鏈接
1. 基礎(chǔ)的頁面布局(index.html)
這里不做過多解釋了,就是一些頁面布局
大家直接復(fù)制粘貼過去用就行(是不是很貼心~)
1.1 html布局
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <link rel="stylesheet" href="./css/style.css" rel="external nofollow" > <title>九宮格抽獎</title> </head> <body> <div class="container"> <p>H5轉(zhuǎn)盤抽獎(可自由設(shè)置概率)</p> <ul class="lottery"> <li class="item lottery-item-0">華為手機</li> <li class="item lottery-item-1">iPhone 手機</li> <li class="item lottery-item-2">謝謝惠顧</li> <li class="item lottery-item-7">小熊抱枕</li> <li class="item start" οnclick="start(event)" data-able="1">開始</li> <li class="item lottery-item-3">小度音響</li> <li class="item lottery-item-6">電風(fēng)扇</li> <li class="item lottery-item-5">格力冰箱</li> <li class="item lottery-item-4">小米手環(huán)</li> </ul> </div> </body> </html>
1.2 css布局(style.css)
@charset "UTF-8"; html{ height: 100%; font-size: 16px; } body{ font-family:-apple-system-font, "Helvetica Neue", sans-serif; -webkit-font-smoothing: subpixel-antialiased; } body, a, h1, h2, h3, h4, h5, h6, ul, li, dl, dt, article, section, div, p, header, footer, menu, input, img{ margin: 0; padding: 0; } img{ vertical-align: middle; } p, h1, h2, h3, h4, h5, h6,ul{ -webkit-margin-before: 0; -webkit-margin-after: 0; -webkit-padding-start: 0; -moz-margin-before: 0; -moz-margin-after: 0; -moz-padding-start: 0; -moz-padding-end: 0; } /* clear float */ .clearfix:after { content:""; display: block; clear:both; } /* Responsive Layout */ li{ list-style: none; } a{ text-decoration: none; } input{ -webkit-appearance: none; } input:focus{ outline: none; } header{ height: .88rem; border-bottom: 1px solid #ccc; background-color: #fff; } .header-back{ width: .36rem; height: .36rem; float: left; margin-top: .27rem; margin-left: .28rem; } .header-title{ float: left; font-weight: 600; width: 90%; font-size: .36rem; color: #333; text-align: center; line-height: .88rem; } .container{ font-size: 24px; text-align: center; padding-top: 50px; } .lottery{ font-size: .32rem; width: 6rem; height: 6rem; margin: .2rem auto; display: flex; display: -webkit-flex; flex-wrap: wrap; border: 1px solid #000; } .item{ width: 2rem; height: 2rem; line-height: 2rem; color: orangered; font-weight: bold; text-align: center; border: 1px solid orangered; box-sizing: border-box; background-size: 100%; } .active{ background: #ffe6cc; } button:focus{ outline: none; } .lottery-item-0{ background-image: url('../img/huawei.png'); } .lottery-item-1{ background-image: url('../img/iphone.jpg'); } .lottery-item-4{ background-image: url('../img/xiaomi.jpg'); } .lottery-item-7{ background-image: url('../img/xiaoxiong.jpg'); } .lottery-item-3{ background-image: url('../img/xiaodu.jpg'); } .lottery-item-6{ background-image: url('../img/dfs.jpg'); } .lottery-item-5{ background-image: url('../img/bingxiang.jpg'); }
2. 工具函數(shù)(用于調(diào)整概率)
- 此工具函數(shù)傳入一個二維數(shù)組,用于調(diào)整概率
- 默認商品概率相同,調(diào)用的時候 randomNum() 時候不傳參數(shù)即可
- 也可以自由設(shè)置概率
function randomNum(arr){ // 1. 容錯處理 arr = arr || []; // ES6 Map對象: 鍵與值的集合 方便訪問其鍵與值 let m = new Map(arr); // 計算概率 let probability = 0; // console.log(m.values()) for (const i of m.values()) { probability += i; } if(probability > 1){ // 給一個友好的提示 alert("概率總和不能大于1,小學(xué)數(shù)學(xué)是體育老師教的???"); return false; } // 剩下沒有定義的各自能占多少概率。 // size 返回映射中的元素數(shù) let remainProbability = (1 - probability) / (8 - m.size); console.log(remainProbability) // 生成隨機值,跟i對應(yīng)的概率比較, let res = 0, r = Math.random(); for (let i = 0; i < 8; i++) { // 有就取值 沒有就隨機取 m.has(i) ? res += m.get(i) : res += remainProbability; // console.log("res= "+ res); // console.log("r= "+ r); if (res > r) { return i; } } }
3. 傳參及接收值配置
let step = 0, //計數(shù)器 timeInterval = 2, //速度控制器 final, //最終位置 looperFun, // setTimeout的返回值 prizeList = ['華為', 'iPhone X', '謝謝惠顧', '小度音響', '手環(huán)', '格力冰箱', '電風(fēng)扇', '小熊抱枕']; // 開始游戲 function start(e){ if(e.target.dataset.able === "1"){ // 隨機0-7 // 設(shè)置抽獎概率 不傳參的話這幾個商品幾率相等 // let arr = [[0,0],[1,0.5],[2,0],[3,0],[4,0],[5,0],[6,0],[7,0]]; // final = randomNum(arr); final = randomNum(); // 這里不傳參 概率均等 console.log(final); if(final === false){ console.log("出錯了"); return false; } e.target.setAttribute('data-able', 0); looperFun = setTimeout(looper, 100); }else{ console.log("什么垃圾玩意,點不了"); return false; } }
傳參的二維數(shù)組第一個值代表商品id,第二個值為分配的概率
// 設(shè)置抽獎概率 不傳參的話這幾個商品幾率相等 // let arr = [[0,0],[1,0.5],[2,0],[3,0],[4,0],[5,0],[6,0],[7,0]];
4. dom 操作方法及具體邏輯處理
// 獲取元素 function $my(classes){ return document.querySelector(classes); } // 旋轉(zhuǎn)九宮格 function looper(){ // 移除上一個被選中的樣式 $my(".active") && $my(".active").classList.remove("active"); // 轉(zhuǎn)了超過3圈后才能停止。 if (step >= 24 + final) { $my('.lottery-item-' + final).classList.add('active'); step = final; setTimeout(() => { $my('.start').setAttribute('data-able', 1); alert('恭喜你,抽中了' + prizeList[final]); }, 100); clearTimeout(looperFun); return; } //當(dāng)前轉(zhuǎn)圈到的位置。 let index = step % 8; $my('.lottery-item-' + index).classList.add('active'); step++; // 下次變色的時間。 let duration; if (step >= (16 + final)) { //在剩余一圈時候開始減速 timeInterval += 1; } else { if (timeInterval <= 2) { timeInterval = 2; //時間縮短不能太小。 } // 越來越快 timeInterval--; } duration = timeInterval * 50; looperFun = setTimeout(looper, duration); }
5. FAQ(注意事項)
1.手機端和PC端都可以操作
2.商品圖需要自己引入一下
3.注意引入路徑問題
4.js文件可以只寫一個(第三步和第四步放一起就行)
以上就是原生JS實現(xiàn)H5轉(zhuǎn)盤游戲的示例代碼的詳細內(nèi)容,更多關(guān)于JS轉(zhuǎn)盤游戲的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Javascript中匿名函數(shù)的調(diào)用與寫法實例詳解(多種)
js中定義函數(shù)的方式有很多種,函數(shù)直接量就是其中一種,下面通過本文給大家介紹匿名函數(shù)是如何調(diào)用的及匿名函數(shù)的n中寫法,對js匿名函數(shù)調(diào)用,js匿名函數(shù)寫法相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧2016-01-01前端實現(xiàn)下載文件(包含壓縮包下載)方式詳細總結(jié)
這篇文章主要給大家介紹了關(guān)于前端實現(xiàn)下載文件(包含壓縮包下載)方式的相關(guān)資料,這段時間項目需要下載文件,所以這里給大家總結(jié)下,需要的朋友可以參考下2023-09-09layer.alert自定義關(guān)閉回調(diào)事件的方法
今天小編就為大家分享一篇layer.alert自定義關(guān)閉回調(diào)事件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09深入理解JavaScript系列(12) 變量對象(Variable Object)
JavaScript編程的時候總避免不了聲明函數(shù)和變量,以成功構(gòu)建我們的系統(tǒng),但是解釋器是如何并且在什么地方去查找這些函數(shù)和變量呢2012-01-01