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

原生JS實(shí)現(xiàn)H5轉(zhuǎn)盤游戲的示例代碼

 更新時(shí)間:2022年03月10日 15:13:45   作者:歐陽(yáng)呀  
這篇文章主要介紹了如何利用原生JS實(shí)現(xiàn)轉(zhuǎn)盤游戲,可以自由調(diào)整概率。文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)JavaScript有一定幫助,需要的可以參考一下

本文是真實(shí)的實(shí)戰(zhàn)項(xiàng)目,可以直接拿去用 —— 轉(zhuǎn)盤抽獎(jiǎng)

可以自由調(diào)整概率,你也可以成為黑心商家

項(xiàng)目效果是這樣滴:視頻鏈接

1. 基礎(chǔ)的頁(yè)面布局(index.html)

這里不做過(guò)多解釋了,就是一些頁(yè)面布局

大家直接復(fù)制粘貼過(guò)去用就行(是不是很貼心~)

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>九宮格抽獎(jiǎng)</title>
</head>

<body>
    <div class="container">
        <p>H5轉(zhuǎn)盤抽獎(jiǎng)(可自由設(shè)置概率)</p>
        <ul class="lottery">
            <li class="item lottery-item-0">華為手機(jī)</li>
            <li class="item lottery-item-1">iPhone 手機(jī)</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">開(kāi)始</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ù)傳入一個(gè)二維數(shù)組,用于調(diào)整概率
  • 默認(rèn)商品概率相同,調(diào)用的時(shí)候 randomNum() 時(shí)候不傳參數(shù)即可
  • 也可以自由設(shè)置概率
function randomNum(arr){
    // 1. 容錯(cuò)處理
    arr = arr || [];
    // ES6 Map對(duì)象: 鍵與值的集合 方便訪問(wèn)其鍵與值
    let m = new Map(arr);
    // 計(jì)算概率
    let probability = 0;
    // console.log(m.values())
    for (const i of m.values()) {
        probability += i;
    }
    
   if(probability > 1){
        // 給一個(gè)友好的提示
        alert("概率總和不能大于1,小學(xué)數(shù)學(xué)是體育老師教的???");
        return false;
   }

    // 剩下沒(méi)有定義的各自能占多少概率。
    // size 返回映射中的元素?cái)?shù)
    let remainProbability = (1 - probability) / (8 - m.size);
    console.log(remainProbability)
     // 生成隨機(jī)值,跟i對(duì)應(yīng)的概率比較,
     let res = 0, r = Math.random();
     for (let i = 0; i < 8; i++) {
         // 有就取值 沒(méi)有就隨機(jī)取
         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, //計(jì)數(shù)器
         timeInterval = 2, //速度控制器
         final, //最終位置
         looperFun, // setTimeout的返回值
         prizeList = ['華為', 'iPhone X', '謝謝惠顧', '小度音響', '手環(huán)', '格力冰箱', '電風(fēng)扇', '小熊抱枕'];
        // 開(kāi)始游戲
        function start(e){
            if(e.target.dataset.able === "1"){
                // 隨機(jī)0-7 
                // 設(shè)置抽獎(jiǎng)概率 不傳參的話這幾個(gè)商品幾率相等
                // 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("出錯(cuò)了");
                    return false;
                }
                e.target.setAttribute('data-able', 0);
                looperFun = setTimeout(looper, 100);
            }else{
                console.log("什么垃圾玩意,點(diǎn)不了");
                return false;
            }
        }

傳參的二維數(shù)組第一個(gè)值代表商品id,第二個(gè)值為分配的概率

// 設(shè)置抽獎(jiǎng)概率 不傳參的話這幾個(gè)商品幾率相等
// 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(){
    // 移除上一個(gè)被選中的樣式
    $my(".active") && $my(".active").classList.remove("active");

    // 轉(zhuǎn)了超過(guò)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++;
    // 下次變色的時(shí)間。
    let duration;
    if (step >= (16 + final)) { //在剩余一圈時(shí)候開(kāi)始減速
        timeInterval += 1;
    } else {
        if (timeInterval <= 2) {
            timeInterval = 2; //時(shí)間縮短不能太小。
        }
        // 越來(lái)越快
        timeInterval--;
    }
    duration = timeInterval * 50;
    looperFun = setTimeout(looper, duration);
}

5. FAQ(注意事項(xiàng))

1.手機(jī)端和PC端都可以操作

2.商品圖需要自己引入一下

3.注意引入路徑問(wèn)題

4.js文件可以只寫一個(gè)(第三步和第四步放一起就行)

以上就是原生JS實(shí)現(xiàn)H5轉(zhuǎn)盤游戲的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于JS轉(zhuǎn)盤游戲的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 生產(chǎn)制造追溯系統(tǒng)之再說(shuō)條碼打印

    生產(chǎn)制造追溯系統(tǒng)之再說(shuō)條碼打印

    這篇文章主要介紹了生產(chǎn)制造追溯系統(tǒng)之再說(shuō)條碼打印,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-06-06
  • JavaScript數(shù)組去重的五種方法及其他細(xì)節(jié)和拓展

    JavaScript數(shù)組去重的五種方法及其他細(xì)節(jié)和拓展

    JavaScript數(shù)組去重這個(gè)問(wèn)題,經(jīng)常出現(xiàn)在面試題中,下面這篇文章主要給大家介紹了關(guān)于JavaScript數(shù)組去重的五種方法及其他細(xì)節(jié)和拓展的相關(guān)資料,文中通過(guò)實(shí)例代碼以及圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • webpack入門必知必會(huì)

    webpack入門必知必會(huì)

    本文主要介紹了webpack入門的一些簡(jiǎn)單命令和基本配置信息,從代碼拆分、打包、壓縮的角度和傳統(tǒng)的前端項(xiàng)目進(jìn)行對(duì)比,希望以此加深大家對(duì)webpack基礎(chǔ)知識(shí)的印象。下面跟著小編一起來(lái)看下吧
    2017-01-01
  • 微信小程序?qū)崿F(xiàn)的數(shù)字滑塊拼圖效果

    微信小程序?qū)崿F(xiàn)的數(shù)字滑塊拼圖效果

    滑塊拼圖(Slider?Puzzle)是一種經(jīng)典的智力游戲,通常由一個(gè)3x3或更大的格子組成,其中一個(gè)格子為空,玩家通過(guò)滑動(dòng)拼圖塊來(lái)達(dá)到特定的圖案或順序,這篇文章主要介紹了微信小程序?qū)崿F(xiàn)的數(shù)字滑塊拼圖,需要的朋友可以參考下
    2024-08-08
  • JS 參數(shù)傳遞的實(shí)際應(yīng)用代碼分析

    JS 參數(shù)傳遞的實(shí)際應(yīng)用代碼分析

    在項(xiàng)目中,有一個(gè)Ajax加載的區(qū)域,是一個(gè)Div標(biāo)簽,id為msg_box,這個(gè)控制鏈接包含在一個(gè)左側(cè)的導(dǎo)航中,當(dāng)從其他頁(yè)面鏈接到這個(gè)頁(yè)面時(shí),該JS代碼就失效了。
    2009-09-09
  • 淺談js 閉包引起的內(nèi)存泄露問(wèn)題

    淺談js 閉包引起的內(nèi)存泄露問(wèn)題

    這篇文章主要介紹了淺談js 閉包引起的內(nèi)存泄露問(wèn)題的相關(guān)資料,需要的朋友可以參考下
    2015-06-06
  • 當(dāng)前頁(yè)禁止復(fù)制粘貼截屏代碼小集

    當(dāng)前頁(yè)禁止復(fù)制粘貼截屏代碼小集

    本文為大家詳細(xì)介紹下禁止截屏,通過(guò)清除剪切板實(shí)現(xiàn)、禁止復(fù)制、禁止右鍵菜單、禁止網(wǎng)頁(yè)另存為等等,感興趣的朋友可以參考下哈,希望對(duì)大家有所幫助
    2013-07-07
  • javascript如何刪除所有事件監(jiān)聽(tīng)器

    javascript如何刪除所有事件監(jiān)聽(tīng)器

    這篇文章主要介紹了javascript 刪除所有事件監(jiān)聽(tīng)器,文中還通過(guò)示例代碼介紹了javaScript刪除對(duì)象屬性總結(jié)方法,結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • JS解決iframe之間通信和自適應(yīng)高度的問(wèn)題

    JS解決iframe之間通信和自適應(yīng)高度的問(wèn)題

    關(guān)于iframe之間的通信問(wèn)題與自適應(yīng)高度問(wèn)題網(wǎng)上有很多,那么這篇文章小編也和大家一起來(lái)談?wù)刬frame之間通信問(wèn)題及iframe自適應(yīng)高度問(wèn)題,有需要的可以參考借鑒。
    2016-08-08
  • JavaScript實(shí)現(xiàn)簡(jiǎn)單日歷效果

    JavaScript實(shí)現(xiàn)簡(jiǎn)單日歷效果

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)簡(jiǎn)單日歷效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09

最新評(píng)論

四平市| 同心县| 浦东新区| 怀仁县| 武山县| 宜兴市| 尉氏县| 田阳县| 墨脱县| 乐都县| 孟津县| 武夷山市| 福泉市| 当雄县| 宣化县| 北川| 图木舒克市| 花莲市| 延吉市| 高阳县| 张家口市| 调兵山市| 桦甸市| 岳普湖县| 凤冈县| 濮阳县| 肇源县| 客服| 姚安县| 犍为县| 九江县| 化德县| 贵德县| 砀山县| 黄大仙区| 民乐县| 濉溪县| 石嘴山市| 安仁县| 五峰| 绩溪县|