九宫格转圈圈抽奖活动,有加速,减速效果

在线访问demo和代码在底部

代码,复制就可以跑

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>🐯🐯🐯</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        .box {
            position: relative;
            width: 300px;
            height: 300px;
            border: 1px solid grey;
        }

        .item {
            width: 80px;
            height: 80px;
            position: absolute;
            background-color: gainsboro;
            display: flex;
            justify-content: center;
            align-items: center;
        }

        .item.active {
            background-color: red;
            font-weight: 600;

        }
    </style>
</head>

<body>
    <h1 id="result">这一次结果</h1>
    <div class="box" id="box"></div>
    <button id="start">开始</button>
    <script>
        let box = document.querySelector("#box")
        let start = document.querySelector("#start")
        let result = document.querySelector("#result");
        //奖项个数
        const itemLen = 8;
        let arr = [];
        //开启位置
        let startIndex = 0;
        let timer = null;
        let speed = 80;

        //随机工具函数
        function getRandomNumber(min, max) {
            return Math.floor(Math.random() * (max - min + 1)) + min;
        }
        //基础圈数
        let baseTarget = getRandomNumber(4, 6) * itemLen;
        //开奖索引
        let targetIndex = null;
        //基础圈数+开奖索引
        let totalCount = 0;
        //初始化dom渲染
        for (let i = 0; i < itemLen; i++) {
            arr.push("奖项:" + i)
        }
        let domStr = document.createDocumentFragment();
        const domItems = []
        for (let i = 0; i < arr.length; i++) {
            let dom = document.createElement("div");
            dom.className = "item";
            dom.innerHTML = arr[i];

            switch (i) {
                case 0:
                    dom.style.top = 0;
                    dom.style.left = 0;
                    break;
                case 1:
                    dom.style.top = 0;
                    dom.style.left = "110px";
                    break;
                case 2:
                    dom.style.top = 0;
                    dom.style.right = 0;
                    break;
                case 3:
                    dom.style.top = "100px";
                    dom.style.right = 0;
                    break;
                case 4:
                    dom.style.bottom = 0;
                    dom.style.right = 0;
                    break;
                case 5:
                    dom.style.bottom = 0;
                    dom.style.right = "110px";
                    break;
                case 6:
                    dom.style.bottom = 0;
                    dom.style.left = 0;
                    break;
                case 6:
                    dom.style.bottom = "100px";
                    dom.style.left = 0;
                    break;
                case 7:
                    dom.style.bottom = "120px";
                    dom.style.left = 0;
                    break;
            }
            box.appendChild(dom)
            domItems.push(dom);
        }
        box.appendChild(domStr);

        function frame() {

            //清除定时器
            clearTimeout(timer);
            //获取递增过程的索引变量对饮奖项的索引
            let currentpos = startIndex % itemLen;
            //更新奖项的高亮样式
            for (let i = 0; i < itemLen; i++) {
                if (currentpos == i) {
                    domItems[i].classList.add("active");
                }
                else {
                    domItems[i].classList.remove("active");
                }
            }
            //如果达到中奖的目标位置就停止
            if (startIndex == totalCount) {
                clearTimeout(timer);
                return;
            }
            //地址的索引不断的递增
            startIndex++;
            //获取运行比例
            let percent = Math.floor(startIndex / totalCount * 100);
            //递增的索引跑了目标值的50%前都加快
            if (percent <= 50) {
                //需要兜底,否则会出意外
                if (speed > 10) {
                    speed--;
                }
            }
            else {
                //后50%速度开始减速
                speed += 6;
            }
            //这里的定时器的时间是动态的!!!!重要
            timer = setTimeout(() => {
                frame();
            }, speed)
        }
        function startGame() {
            //基础圈数
            baseTarget = getRandomNumber(4, 6) * itemLen;
            //随机目标位置
            targetIndex = getRandomNumber(0, 7);
            //总个数
            totalCount = baseTarget + targetIndex;

            result.innerHTML = "这次开奖的结果:" + arr[targetIndex];
            startIndex = 0;
            //初始化速度
            speed = 80;
            //重置完所有配置后,开始跑定时器
            frame();

        }
        start.onclick = startGame;







    </script>
</body>

</html>

在线demo

 代码在这,请直接品尝JS Bin - Collaborative JavaScript Debugging

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/635995.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

作业-day-240523

思维导图 知识点问答 1、IO多路复用的原理 1、创建一个检测文件描述符的容器 fd_set fds; 2、将需要检测的文件描述符放入容器中 FD_SET(文件描述符&#xff0c;&fds); 3、通过一个阻塞函数阻塞等待容器中是否有事件产生&#xff0c;如果有一个或多个事件产生&#xff0c…

vscode 插件开发指南

1安装nodejs、vscode 2安装插件脚手架 npm install -g yo generator-code 3使用命令创建插件项目 yo code 4在vscode中打开项目 5运行调试&#xff0c;按F5键 6在新打开的窗口中按shiftctrlp 然后执行命令 7配置右键菜单命令 遇到问题&#xff1a; 1.package.json中vsc…

科大讯飞Nano+耳机套装登场:智能录音转写,办公充电新方案

目录 一、科大讯飞Nano会议耳机&#xff1a;专业会议助手 二、会议狗Kit&#xff1a;即插即用&#xff0c;智能会议新体验 三、努比亚65W氮化镓充电头&#xff1a;全能快充&#xff0c;一充多用 四、产品总结 在这个快节奏的数字化时代&#xff0c;高效沟通与信息处理能力成…

Koupleless 单进程多应用如何解决兼容问题

文&#xff5c;苟振东&#xff08;花名&#xff1a;盛知&#xff09; Koupleless 项目 committer 蚂蚁集团技术专家 本文 5789 字 阅读 12 分钟 本篇文章属于 Koupleless 进阶系列文章第二篇&#xff0c;默认读者对 Koupleless 的基础概念、能力都已经了解&#xff0c;如果还…

【VTKExamples::Texture】第六期 TextureThreshold

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例TextureThreshold,并解析接口vtkTexture,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~Y…

ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

网络空间资产梳理

网络空间资产梳理 网络安全建设的实质是对风险的管理&#xff0c;古人云&#xff1a;知己知彼百战不殆。所谓知己&#xff0c;就是要了解自己的资产以及这些资产的脆弱性&#xff0c;知彼就是了解外部威胁及威胁所使用的手段。要做到知己&#xff0c;首先就要对自身的资产进行梳…

虚拟局域网VLAN

前面的是ip地址&#xff0c;后面的子网掩码 hr和财务是俩网段&#xff0c;hr部门发的广播包财务部门也能收到&#xff0c;那么怎么把不同的网段隔离在不同的广播域里呢 如果只有俩部门就用路由器隔离就行了&#xff0c;但是部门一多每一个都用交换机就浪费钱了 可以通过虚拟…

在MySQL数据库中的视图和事务。

视图 view 临时表 作用&#xff1a;优化多表查询的效率 可以将经常使用的连接查询结果使用视图进行保存&#xff0c;避免多次重复的笛卡尔积运算 MySQL数据库在多表查询的时候会自动进行笛卡尔积运算。 如果将来经常要用到某一个多表查询的结果就可以使用视图将这个结果…

代码随想录——路径总和(Leetcode112)需要回顾

题目链接 递归 递归函数什么时候需要返回值&#xff1f; 如果需要搜索整棵二叉树且不需要处理递归返回值&#xff0c;递归函数不要返回值如果需要搜索整棵二叉树且需要处理递归返回值&#xff0c;递归函数需要返回值如果搜索其中一条条件的路径&#xff0c;递归一定需要返回值…

iOS App上架全流程及审核避坑指南

App Store作为苹果官方的应用商店&#xff0c;审核严格周期长一直让用户头疼不已&#xff0c;很多app都“死”在了审核这一关&#xff0c;那我们就要放弃iOS用户了吗&#xff1f;当然不是&#xff01;本期我们从iOS app上架流程开始梳理&#xff0c;详细了解下iOS app上架的那些…

升级版网创教程wordpress插件自动采集并发布

主要功能&#xff1a; wordpress 插件主题系列支持自动采集并发布。 主要采集: 福缘&#xff0c;中创&#xff0c;冒泡 自动采集各大项目网进行整合发布到自己个人网站 插件话更新&#xff0c;减少网络请求&#xff0c;提升稳定性 代码完美开源 傻瓜式操作&#xff0c;一…

计算机SCI期刊,中科院2区,收稿范围非常广泛!

一、期刊名称 Journal of Web Semantics 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;计算机科学 影响因子&#xff1a;2.5 中科院分区&#xff1a;2区 出版方式&#xff1a;开放出版 版面费&#xff1a;$1600 三、期刊征稿范围 《网络语义学杂志》…

Redis实现热点数据排行榜或游戏积分排行榜

数据库中的某张表中存储着文章的浏览量&#xff0c;或者点赞数等&#xff0c;或者游戏积分等数据...... 这些数据的更新在redis中完成&#xff0c;并定时同步到mysql数据库中。 而如果要对这些数据进行排序的话&#xff1a; Redis中的Sorted Set(有序集合)非常适合用于实现排…

ZEDmini使用完全指南

ZEDmini使用 ZED stereolabs 开箱测评 使用说明 ubuntu18.04nvidiacuda10 ubuntu18.04ZED SDK安装和使用 Ubuntu16.04安装NVIDIA显卡驱动 查看显卡信息 redwallredwall-G3-3500:~/catkin_ws$ lspci | grep VGA 00:02.0 VGA compatible controller: Intel Corporation Device …

成功案例(IF=7.4)| 代谢组+16s联合分析助力房颤代谢重构的潜在机制研究

研究背景 心房颤动&#xff08;AF&#xff09;是临床上最常见的持续性心律失常&#xff0c;具有显著的发病率和死亡率。高龄是房颤发病率、患病率和进展最显著的危险因素。与年龄在50-59岁之间的参与者相比&#xff0c;80-89岁之间的参与者患房颤的风险增加了9.33倍。目前尚不…

IEEE Transactions on Neural Networks and Learning Systems神经网络和学习系统TNNLS论文投稿须知

一、TNNLS介绍 IEEE Transactions on Neural Networks and Learning Systems作为控制领域的TOP期刊&#xff0c;2024年5月影响因子为10.4&#xff0c;虽然有些下降&#xff0c;之前五年平均影响因子为11.2&#xff0c;但依然是该领域王牌期刊&#xff0c;接收关于神经网络和相…

【软考中级 软件设计师】计算机网络和安全

计算机网络和安全是软件设计师&#xff08;软考中级&#xff09;考试中的重要组成部分&#xff0c;它涵盖了网络基础、网络协议、网络架构、网络安全等多个方面。以下是一些核心概念和要点&#xff0c; 计算机网络基础 OSI七层模型&#xff1a;物理层、数据链路层、网络层、传…

《intel开发手册卷3》读书笔记2

IA-32架构的内存管理分为两个部分&#xff1a;分段和分页。分段提供了一种隔离每个进程 或者任务代码、数据和栈模块的机制,保证多个进程或者任务能够在同一个处理器上运 行而不会互相干扰。分页机制实现了传统请求调页的虚拟内存系统&#xff0c;在这种系统中&#xff0c; 程序…

由于删除、修改、重装QT库引起的软件问题@FreeBSD

由于由于删除、修改、重装QT库以及snappy库等&#xff0c;导致很多软件出现了异常&#xff0c;即无法启动&#xff0c;逐个解决问题。 qutebrowser浏览器 报错&#xff1a; qutebrowser报错 No backend library found qutebrowser needs QtWebKit or QtWebEngine, but neith…