原生JS實現簡易轉盤抽獎


我愛擼碼,擼碼使我感到快樂。

大家好,我是Counter。

本章帶大家來簡單的了解下原生JS實現轉盤抽獎。

因為主要涉及到JS,在這里HTML和CSS起到的功能就沒有那么重要,

因此,沒有過多的闡述HTML與CSS,而JS基本每行都有注釋,但這里CSS

也是起到了至關重要的一步,那就是控制背景色,以及結果的顯示與隱藏,效果先給出,如下:

代碼給出:

<!DOCTYPE html>
<html lang="zh">
<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">
    <title>turntable</title>
    /*<link rel="stylesheet" href="css/index.css">*/
    <!-- css -->
    <style>
    body, table, tr, td {
        margin: 0;
        padding: 0;
    }
    .wrapper {
        position: relative;
        width: 300px;
        height: 300px;
        margin: 100px auto 0;
        text-align: center;
    }
    table {
        display: inline-block;
    }
    td, th {
        width: 100px;
        height: 100px;
        border: 1px solid #ccc;
        border-radius: 20px;
    }
    th {
        cursor: pointer;
        user-select: none;
    }
    /* 設置標識樣式 */
    tr .active {
        background-color: #ff6700;
    }
    /* 設置中獎結果 */
    .results {
        display: none;
        position: absolute;
        top: 0;
        left: 50px;
        width: 200px;
        height: 100px;
        border: 1px solid black;
        border-radius: 30px;
        text-align: center;
        line-height: 100px;
        background-color: skyblue;
    }
    </style>
</head>
<body>
    <div class="wrapper">
        <table>
            <tr>
                <td class="active"></td>
                <td></td>
                <td></td>
            </tr>
            <tr>
                <td></td>
                <th id="play">開始</th>
                <td></td>
            </tr>
            <tr>
                <td></td>
                <td></td>
                <td></td>
            </tr>
        </table>
        <div class="results">今天吃火鍋</div>
    </div>
   <!-- <script src="js/index.js"></script> -->
   <!-- js -->
   <script>
    // 獲取開始元素
var playBtn = document.getElementById('play');
// 獲取所有td元素,獲取到偽數組
var tdAry = document.getElementsByTagName('td');
// 將偽數組的長度存儲在tdLen變量中
var tdLen = tdAry.length;
// 設置計時器變量,剛開始為空
var startTime = null;
// 自己構造數組,使橘紅色背景能夠按照自己想要的方向進行循環移動
var tdList = [0, 1, 2, 4, 7, 6, 5, 3];
// 設置橘紅色背景標識
var tdId = 0;
// 設置已經奔跑的次數,剛開始為0次
var time = 0;
// 固定跑3圈,一圈8次
var fixNum = 24
// 定義最大隨機數
var MaxNum;
// 定義隨機數,開始和結束的閾值
var randomNum;
// 獲取中獎結果元素
var results = document.getElementsByClassName('results')[0];

// 綁定點擊事件,當鼠標點擊開始按鈕后,觸發playStart函數
playBtn.onclick = playStart;

function playStart() {
    // 如果計時器不為空,那就意味着這個線程已經在跑了,就直接退出。
    if (startTime != null) {
        return;
    }
    results.style.display = 'none';
    // 奔跑的次數
    time = 0;
    // 最大隨機數,取值[0, 8],確保每個都能被選到
    MaxNum = parseInt(Math.random() * 9) + fixNum;
    // 隨機閾值,控制剛開始跑幾步加速,以及剩幾步減速,取值范圍[3, 7]
    randomNum = parseInt(Math.random() * 5 + 3);
    // 開啟計時器,每200毫秒執行一次move函數
    startTime = setInterval(move,200);
    
}

function move() {
    // 每執行一次奔跑次數time就加1
    time++;
    // 每次運行當前的背景色清空
    tdAry[tdList[tdId]].className = "";
    // 每執行一次背景色標識就加1
    tdId++;
    // 判斷如果標識大於7的話就標識tdId就等於0,否則的話就等於它本身,這個步驟如果沒有進行判斷和賦值的話,tdId就會一直自增下去,那么對應的td元素將沒有,后台就會報錯
    tdId = tdId > 7 ? 0 : tdId;
    // 設置當前的td背景色
    tdAry[tdList[tdId]].className = "active";
    
    //如果奔跑的次數等於隨機閾值的話,那么當前的計時器清空,重新開啟一個新的計時器,並且是每20毫秒執行一次,這個步驟是控制加速的 
    if (time == randomNum) {
        clearInterval(startTime);
        startTime = setInterval(move,20);
    }

    // 如果奔跑的次數加上隨機的閾值的話,那么就將當前的加速的計時器清空,並且重新開啟一個每200毫秒的計時器,這個步驟是控制減速的
    if (time + randomNum >= MaxNum) {
        clearInterval(startTime);
        startTime = setInterval(move,200);
    }

    // 如果奔跑的次數大於等於最大的奔跑次數,那么清空當前計時器,並且計時器等於null,直接返回出去,一次抽獎結束。這個步驟是控制抽獎結束。
    if (time >= MaxNum) {
        clearInterval(startTime);
        startTime = null;
        // switch語句判斷抽獎結果,這部分比較簡單,就不贅述了。
        switch(tdList[tdId]) {
            case 0:
                results.innerText = '今天吃轉轉樂';
                results.style.display = 'block';
                break;
            case 1:
                results.innerText = '今天吃蜀九香';
                results.style.display = 'block';
                break;
            case 2:
                results.innerText = '今天吃KFC';
                results.style.display = 'block';
                break;
            case 4:
                results.innerText = '今天吃海底撈';
                results.style.display = 'block';
                break;
            case 7:
                results.innerText = '今天吃外賣';
                results.style.display = 'block';
                break;
            case 6:
                results.innerText = '今天吃土';
                results.style.display = 'block';
                break;
            case 5:
                results.innerText = '今天吃牛排';
                results.style.display = 'block';
                break;
            case 3:
                results.innerText = '今天吃草本湯';
                results.style.display = 'block';
                break;
        }
        return;
    }

}


    </script>
</body>
</html>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM