You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript键盘事件实现幸运转盘:空格触发随机逻辑可行吗?

幸运转盘小游戏的实现方案

嘿,你的思路完全没问题!不过有个小细节可以优化下——keyCode其实已经被标记为废弃(deprecated)啦,虽然目前大部分浏览器还支持,但更推荐用更直观、符合现代标准的event.key来判断空格键,比如写成if (event.key === ' ')或者if (event.key === 'Space'),这样代码可读性更高,未来兼容性也更好~

作为编程初学者,我给你准备了一个纯HTML+CSS+原生JavaScript的极简幸运转盘示例,完全不用jQuery,代码注释超详细,一看就懂:

完整可运行代码

<!DOCTYPE html>
<html>
<head>
    <style>
        /* 转盘基础样式 */
        #wheel {
            width: 200px;
            height: 200px;
            border: 3px solid #333;
            border-radius: 50%;
            position: relative;
            margin: 20px auto;
            transition: transform 3s ease-out; /* 平滑转动的动画效果 */
        }

        /* 转盘指针 */
        #pointer {
            width: 0;
            height: 0;
            border-left: 10px solid transparent;
            border-right: 10px solid transparent;
            border-top: 20px solid red;
            position: absolute;
            top: -10px;
            left: 50%;
            transform: translateX(-50%);
            z-index: 1; /* 让指针在转盘上方 */
        }

        /* 转盘的奖项区域 */
        .slice {
            position: absolute;
            width: 50%;
            height: 50%;
            transform-origin: bottom right; /* 以右下角为旋转中心,实现扇形分割 */
            display: flex;
            align-items: center;
            justify-content: center;
            font-weight: bold;
        }

        /* 给不同区域加颜色区分 */
        .slice:nth-child(1) { background: #ffcccc; transform: rotate(0deg) skewY(-45deg); }
        .slice:nth-child(2) { background: #ccffcc; transform: rotate(45deg) skewY(-45deg); }
        .slice:nth-child(3) { background: #ccccff; transform: rotate(90deg) skewY(-45deg); }
        .slice:nth-child(4) { background: #ffffcc; transform: rotate(135deg) skewY(-45deg); }
        .slice:nth-child(5) { background: #ffccff; transform: rotate(180deg) skewY(-45deg); }
        .slice:nth-child(6) { background: #ccffff; transform: rotate(225deg) skewY(-45deg); }
        .slice:nth-child(7) { background: #ffd9cc; transform: rotate(270deg) skewY(-45deg); }
        .slice:nth-child(8) { background: #d9ffcc; transform: rotate(315deg) skewY(-45deg); }

        /* 结果展示区域 */
        #result {
            text-align: center;
            font-size: 20px;
            margin-top: 20px;
            font-weight: bold;
        }
    </style>
</head>
<body>
    <div id="wheel">
        <div id="pointer"></div>
        <div class="slice">一等奖</div>
        <div class="slice">二等奖</div>
        <div class="slice">三等奖</div>
        <div class="slice">谢谢参与</div>
        <div class="slice">三等奖</div>
        <div class="slice">二等奖</div>
        <div class="slice">谢谢参与</div>
        <div class="slice">谢谢参与</div>
    </div>
    <div id="result">按下空格键开始抽奖!</div>

    <script>
        // 获取页面上的元素
        const wheel = document.getElementById('wheel');
        const resultText = document.getElementById('result');
        let isSpinning = false; // 标记转盘是否在转动,防止连续按空格打乱动画

        // 奖项列表,和转盘上的区域顺序一一对应
        const prizes = ['一等奖', '二等奖', '三等奖', '谢谢参与', '三等奖', '二等奖', '谢谢参与', '谢谢参与'];

        // 监听全局键盘按下事件
        document.addEventListener('keydown', function(event) {
            // 判断是否按了空格键,并且转盘不在转动状态
            if (event.key === ' ' && !isSpinning) {
                startSpin();
            }
        });

        // 启动转盘转动的函数
        function startSpin() {
            isSpinning = true;
            resultText.textContent = '转盘转动中...';

            // 生成随机旋转角度:至少转2圈(720度),再加上0-360的随机角度,让结果更随机
            const randomDegrees = 720 + Math.floor(Math.random() * 360);
            // 设置转盘的旋转样式
            wheel.style.transform = `rotate(${randomDegrees}deg)`;

            // 等待动画结束(和CSS里的transition时间3秒一致),然后计算中奖结果
            setTimeout(() => {
                // 计算最终停留的角度:总角度对360取余,得到相对于初始位置的角度
                const finalDeg = randomDegrees % 360;
                // 每个奖项区域占45度(360/8),计算对应哪个奖项
                const prizeIndex = Math.floor((360 - finalDeg) / 45) % 8;
                const winningPrize = prizes[prizeIndex];

                // 展示中奖结果
                resultText.textContent = `恭喜你抽到:${winningPrize}!`;
                isSpinning = false; // 允许再次触发抽奖
            }, 3000);
        }
    </script>
</body>
</html>

关键代码解释

  • 键盘事件判断:用event.key === ' '替代keyCode == 32,不仅更直观,还符合现代JS标准,避免废弃API的兼容性问题。
  • 防止重复触发:用isSpinning变量控制,确保转盘转动时不会响应新的空格键,避免动画混乱。
  • 转盘动画:依靠CSS的transition实现平滑旋转,JS只需要修改旋转角度,不用自己写复杂的动画逻辑。
  • 结果计算:通过旋转角度的余数,结合每个奖项区域的角度占比,轻松算出中奖结果,逻辑简单易懂。

你可以直接把这段代码复制到一个HTML文件里,用浏览器打开就能玩啦!还能自己修改奖项内容、转盘大小、转动时间这些参数,慢慢调整成你想要的样子~

内容的提问来源于stack exchange,提问作者LearnerCoderGamer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:43:25