当前位置: 首页 > web >正文

Web前端小游戏轮盘。

代码如下:

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>轮盘抽奖</title>

    <style>

        body {

            font-family: Arial, sans-serif;

            display: flex;

            flex-direction: column;

            align-items: center;

            background-color: #f0f0f0;

            padding: 20px;

        }

        .wheel-container {

            position: relative;

            width: 350px;

            height: 350px;

            margin: 20px 0;

        }

        #wheel {

            width: 100%;

            height: 100%;

            border-radius: 50%;

            position: relative;

            overflow: hidden;

            border: 5px solid #333;

            transition: transform 5s cubic-bezier(0.17, 0.67, 0.12, 0.99);

        }

        .segment {

            position: absolute;

            width: 50%;

            height: 50%;

            transform-origin: bottom right;

        }

        .segment-text {

            position: absolute;

            width: 90px;

            padding: 5px;

            font-weight: bold;

            color: white;

            text-shadow: 1px 1px 2px rgba(0,0,0,0.7);

            font-size: 14px;

            box-sizing: border-box;

            text-align: center;

            z-index: 1;

        }

        .pointer {

            position: absolute;

            top: -15px;

            left: 50%;

            transform: translateX(-50%);

            width: 0;

            height: 0;

            border-left: 15px solid transparent;

            border-right: 15px solid transparent;

            border-top: 30px solid #e74c3c;

            z-index: 10;

        }

        #spin-btn {

            padding: 10px 20px;

            background-color: #3498db;

            color: white;

            border: none;

            border-radius: 5px;

            font-size: 16px;

            cursor: pointer;

            margin-bottom: 20px;

        }

        #spin-btn:disabled {

            background-color: #95a5a6;

            cursor: not-allowed;

        }

        #result {

            font-size: 18px;

            color: #333;

            text-align: center;

            padding: 10px 20px;

            background-color: white;

            border-radius: 5px;

            box-shadow: 0 2px 5px rgba(0,0,0,0.1);

        }

    </style>

</head>

<body>

    <h1>幸运抽奖</h1>

   

    <div class="wheel-container">

        <div id="wheel"></div>

        <div class="pointer"></div>

    </div>

   

    <button id="spin-btn">开始抽奖</button>

    <div id="result">等待抽奖...</div>

    <script>

        // 奖品列表

        const prizes = [

            "故事书",

            "铅笔",

            "笔记本",

            "文具盒",

            "尺子",

            "橡皮",

            "水彩笔",

            "书包"

        ];

       

        // 每个格子的背景颜色

        const colors = [

            "#ff6b6b", "#4ecdc4", "#45b7d1", "#ffaa1d",

            "#96ceb4", "#ff8b94", "#a77dc2", "#ffcb74"

        ];

       

        // 获取DOM元素

        const wheel = document.getElementById('wheel');

        const spinBtn = document.getElementById('spin-btn');

        const result = document.getElementById('result');

       

        // 状态变量

        let isSpinning = false;

        let totalRotation = 0;

       

        // 初始化轮盘

        function initWheel() {

            const segmentCount = prizes.length;

            const anglePerSegment = 360 / segmentCount;

           

            // 创建8个格子

            for (let i = 0; i < segmentCount; i++) {

                // 创建格子元素

                const segment = document.createElement('div');

                segment.className = 'segment';

                segment.style.transform = `rotate(${i * anglePerSegment}deg)`;

                segment.style.backgroundColor = colors[i];

               

                // 创建格子内的文本(放在角落位置)

                const text = document.createElement('div');

                text.className = 'segment-text';

               

                // 计算每个格子的角度

                const segmentAngle = i * anglePerSegment;

                // 文本旋转角度(让文字水平显示)

                const textRotation = segmentAngle + anglePerSegment / 2;

           

                // 修复:为所有格子设置半径值,确保文字显示

                let radius = 140; // 基础距离中心的距离

                if ([1, 3, 5, 7].includes(i)) {

                    radius = 130; // 特定格子微调

                }

               

                // 计算坐标位置

                const x = radius * Math.cos((textRotation - 90) * Math.PI / 180);

                const y = radius * Math.sin((textRotation - 90) * Math.PI / 180);

               

                // 设置文本位置和旋转

                text.style.transform = `rotate(${textRotation}deg)`;

                text.style.left = `calc(50% + ${x}px)`;

                text.style.top = `calc(50% + ${y}px)`;

                text.textContent = prizes[i];

               

                segment.appendChild(text);

                wheel.appendChild(segment);

            }

        }

       

        // 抽奖函数

        function spinWheel() {

            if (isSpinning) return;

           

            isSpinning = true;

            spinBtn.disabled = true;

            spinBtn.textContent = "转动中...";

            result.textContent = "轮盘转动中...";

           

            // 计算旋转角度:3-5圈随机

            const randomRotation = 360 * (3 + Math.random() * 2) + (Math.random() * 360);

            totalRotation += randomRotation;

           

            // 应用旋转

            wheel.style.transform = `rotate(${totalRotation}deg)`;

           

            // 等待旋转结束

            setTimeout(() => {

                determineWinner();

                isSpinning = false;

                spinBtn.disabled = false;

                spinBtn.textContent = "开始抽奖";

            }, 5000);

        }

       

        // 确定中奖结果

        function determineWinner() {

            const finalAngle = totalRotation % 360;

            const normalizedAngle = (finalAngle + 360) % 360;

           

            const anglePerSegment = 360 / prizes.length;

            const winningIndex = Math.floor((360 - normalizedAngle) / anglePerSegment) % prizes.length;

           

            result.textContent = `恭喜您抽中了:${prizes[winningIndex]}`;

        }

       

        // 绑定事件

        spinBtn.addEventListener('click', spinWheel);

        window.addEventListener('load', initWheel);

    </script>

</body>

</html>

表现结果如下图所示;

      点击开始抽奖按钮,轮盘就会转动一次转过,故事书,铅笔,笔记本,文具盒,尺子,橡皮,水彩笔和书包等奖品。在一段时间后,转盘停止指针指向奖品

http://www.xdnf.cn/news/17749.html

相关文章:

  • VisionPro——1.VP与C#联合
  • 派聪明RAG知识库----关于elasticsearch报错,重置密码的解决方案
  • 基于 Easy Rules 的电商订单智能决策系统:构建可扩展的业务规则引擎实践
  • 计算机网络摘星题库800题笔记 第2章 物理层
  • 【Redis在远程控制指令传递中的设计】
  • mysql参数调优之 sync_binlog (二)
  • Unity DOTS(一):ECS 初探:大规模实体管理与高性能
  • Apache Shiro
  • 小白学习pid环控制-实现篇
  • 知名车企门户漏洞或致攻击者远程解锁汽车并窃取数据
  • ENCOPIM, S.L. 参展 AUTO TECH China 2025 广州国际汽车技术展览会
  • SSH浅析
  • 【C#】正则表达式
  • Emscripten 指南:概念与使用
  • 科研人如何挖出SCI级创新选题?
  • [激光原理与应用-253]:理论 - 几何光学 - 变焦镜头的组成原理及图示解析
  • 《算法导论》第 21 章-用于不相交集合的数据结构
  • JavaWeb从入门到精通!第二天!(Servlet)
  • HTTPS服务
  • 小黑课堂计算机一级WPSOffice题库安装包1.44_Win中文_计算机一级考试_安装教程
  • 系统架构设计师备考之架构设计实践知识
  • Kafka跨机房双活方案中MM1与MM2
  • 新型Windows RPC攻击可劫持服务并完全攻陷Active Directory,PoC已公开
  • 开发npm包【详细教程】
  • 测试匠谈 | AI语音合成之大模型性能优化实践
  • 【c++】反向赋值:颠覆传统的数据交互范式
  • HeidiSQL 连接 MySQL 报错 10061
  • 工业相机终极指南:驱动现代智能制造的核心“慧眼”
  • mimiconda+vscode
  • 基恩士FSN10系列数字光纤传感器全新型光纤放大器 FSN11CP