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

news2024/9/19 10:03:42

在线访问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

分享个微信刮刮乐:https://developers.weixin.qq.com/community/develop/article/doc/0000a6593d8f38898dbb4f2cc54413

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023idea没有VCS首次提交代码到Git

1、setting 2、vcs------>create git repository 3、右键项目----->Git------>add 4、右键项目------>git------>commit Directory 之后就会显示这个页面(下面写你提交的信息&#xff0c;就是你修改了什么) 点击commit,提交 5、Git--------->push 6、选择…

C++基础:类的继承,public,private,protected

三种继承模式 在上图中: 派生继承 三种继承模式 protected模式中 父类的公有属性和保护属性的成员在子类中都会变为保护属性,只能通过父类或者子类的成员函数调用. 代码示例: #include <iostream> #include <string> using namespace std; //protected class per…

numpy-mkl的下载地址

不要使用pip3直接在终端安装&#xff0c;因为pip3默安装的是numpy&#xff0c;而不是numpymkl。 采用在第三方库中手动下载后&#xff0c;再安装的方式。 第三方库网址&#xff1a;https://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy 如果不能进入就可以选择去git里面&#x…

代码随想录算法训练营第四十一天 | 理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

理论基础 代码随想录 视频&#xff1a;从此再也不怕动态规划了&#xff0c;动态规划解题方法论大曝光 &#xff01;| 理论基础 |力扣刷题总结| 动态规划入门_哔哩哔哩_bilibili 动归五部曲 1.dp数组以及下标的含义 2.递推公式 3.dp数组如何初始化 4.遍历顺序(例如先背包再…

Python 求积分

文章目录 Part.I IntroductionPart.II 基础知识Chap.I 特殊量的表示Chap.II integrate 函数简析 Part.III 实例Chap.I 一重积分Chap.II 二重积分 Reference Part.I Introduction 高中及大学时代&#xff0c;苦『积分』久矣&#xff0c;当时如掌握了此『黑科技』&#xff0c;课…

【MiniCPM-V】win10本地部署OCR等性能测试

性能尝试 本地配置如下 --------------------------------------------------------------------------------------- | NVIDIA-SMI 546.80 Driver Version: 546.80 CUDA Version: 12.3 | |-----------------------------------------------------…

设计模式17——模板方法模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 模板方法模式&#xff08;Temp…

Java面试八股之自旋是什么意思

Java中的自旋是什么意思 自旋是多线程编程中的一种同步机制&#xff0c;尤其在Java中与锁的实现密切相关。当一个线程尝试获取某个锁&#xff08;如内置锁或显式锁&#xff09;时&#xff0c;如果锁已被其他线程持有&#xff0c;通常的做法是将该线程置于阻塞状态&#xff0c;…

知识融合概述

文章目录 知识融合知识融合过程研究现状技术发展趋势 知识融合 知识融合的概念最早出现在1983年发表的文献中&#xff0c;并在20世纪九十年代得到研究者的广泛关注。而另一种知识融合的定义是指对来自多源的不同概念、上下文和不同表达等信息进行融合的过程认为知识融合的目标是…

02 FreeRTOS 任务

1、创建任务函数 1.1 动态内存的使用 在之前我们如果要创建一个与学生有关的任务&#xff0c;我们会定义&#xff1a; //打印50个学生的信息 char name[50][100]; int age[50]; int sex[50]; //1表示男&#xff0c;0表示女 int score[50]; 如果之后要对其进行修改会非常麻烦&…

java面对对象编程-多态

介绍 方法的多态 多态是在继承&#xff0c;重载&#xff0c;重写的基础上实现的 我们可以看看这个代码 package b;public class main_ {public static void main(String[] args) { // graduate granew graduate(); // gra.cry();//这个时候&#xff0c;子类的cry方法就重写…

[Java EE] 网络编程与通信原理(三):网络编程Socket套接字(TCP协议)

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …

第36届世界超级小姐大赛安徽赛区正式启动

5月26日,在现场几百位出席仪式的社会名流、时尚界大咖、文化旅游机构负责人和前沿品牌代表以及现场嘉宾的共同见证下&#xff0c;第36届世界超级小姐大赛安徽赛区活动的神秘面纱终于在安徽黄山悠悠湖文化中心正式揭开。伴随着高亢激情的现代音乐&#xff0c;长发飘逸、身形灵动…

“AURORA-M:首个遵循人类审查安全指令微调的开源多语言模型

在人工智能领域&#xff0c;多模态学习是一个日益增长的研究领域&#xff0c;它涉及将来自不同源&#xff08;如图像、文本、音频等&#xff09;的信息结合起来。但高昂的训练计算成本限制了模型的普及性&#xff0c;使得小型机构和个人难以负担。而且现有模型在多语言能力上受…

结算协同,打通企业上下游业、财、票、资

市场变革&#xff0c;转型当先 随着电子发票的普及与数字化浪潮的涌动&#xff0c;企业正面临着前所未有的转型挑战。如何在快速变化的市场中站稳脚跟&#xff0c;提升竞争力&#xff1f;答案在于数字化转型&#xff0c;特别是供应链结算流程的革新。 无纸化、自动化&#xff0…

数字孪生为什么这么火?水务离不开它的原因又是什么?

数字孪生利用可视化技术结合视频融合、BIM、5G、物联网、云计算和大数据等先进技术&#xff0c;围绕实现水质达标、安全生产、高效节能等生产、运营和管理目标。它构建了一个三维场景&#xff0c;涵盖自来水厂区的建筑、生产设备、管线等设施&#xff0c;以实现对水厂实时运行信…

分享目前堪称最好用的车机桌面app,支持画中画模式!

好用的车机桌面了&#xff0c;支持悬浮画中画&#xff01; 如果你想改变单调的车机桌面&#xff0c;那么这篇文章你不要错过了&#xff01;支持地图悬浮、画中画的车机桌面&#xff0c;不要错过&#xff01; 今天阿星给大家分享3款好用、好看的大屏桌面软件&#xff0c;重要的…

Python数据分析常用函数

Python基础 数字处理函数 Python提供了用于数字处理的内置函数和内置模块(math)&#xff0c;使用内置模块&#xff0c;需要先导入 import math。 内置函数math模块abs(-5)返回绝对值math.ceil(2.3)返回不小于x的最小整数divmod(9,4)返回商和余数math.floor(2.3)返回不大于x的…

Unity OutLine 模型外描边效果

效果展示&#xff1a; 下载链接

十四天学会Vue——Vue核心(理论+实战)中篇(第二天)

声明&#xff1a;是接着上篇讲的哦&#xff0c;感兴趣可以去看一看~ 这里一些代码就不写了&#xff0c;为了缩减代码量&#xff0c;大家知道就可以了&#xff1a; Vue.config.productionTip false //阻止 vue 在启动时生成生产提示。热身小tips&#xff0c;可以安装这个插件&…