原生js手撕实现超级抽奖大转盘

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        ul {
            width: 650px;
            height: 650px;
            margin: auto;
            display: flex;
            flex-wrap: wrap;
            align-items: center;
            justify-content: space-between;
            text-align: center;

        }

        ul li {
            list-style: none;
            width: 200px;
            height: 200px;
            background-color: aqua;
            box-sizing: border-box;
            border: 1px solid blue;

        }

        span {
            line-height: 200px;
        }

        .start {
            display: inline-block;
            width: 100px;
            height: 100px;
            border-radius: 50%;
            background-color: aquamarine;
            border: 2px solid brown;


        }

        ul li:nth-child(5) {
            display: flex;
            align-items: center;
            justify-content: center;

        }

       

        .shade {
            width: 100%;
            height: 100%;
            background-color: rgb(180, 180, 188, 0.5);
            z-index: 1;
            position: absolute;
            top: 0;
            display: none;

        }

        .show {
            width: 300px;
            height: 400px;
            position: absolute;
            margin: auto;
            top: 0;
            bottom: 0;
            left: 0;
            right: 0;
           

        }

        .showreward {
            width: 300px;
            height: 300px;
            text-align: center;
            line-height: 300px;
            background-color: rgb(201, 201, 232,1);
        
            transform: scale(0);
            opacity: 0.3;
            transition: 3s;
          
        }

        .calcel {
            width: 100px;
            height: 50px;
            text-align: center;
            line-height: 50px;
            margin: 50px 100px 0 100px;
        }
    </style>
</head>

<body>
    <ul>
        <li name="reward"><span>100</span></li>
        <li name="reward"><span>200</span></li>
        <li name="reward"><span>400</span></li>
        <li name="reward"><span>500</span></li>
        <li><button class="start">开始</button> </li>
        <li name="reward"><span>600</span></li>
        <li name="reward"><span>700</span></li>
        <li name="reward"><span>800</span></li>
        <li name="reward"><span>900</span></li>
    </ul>
    <div class="shade">
        <div class="show">

            <div class="showreward">
            </div>
            <button class="calcel">取消</button>
        </div>


    </div>

    <script>
        let li = document.getElementsByName("reward")
        let shade = document.querySelector(".shade")
        let showreward = document.querySelector(".showreward")
        let button = document.querySelector(".start")
        let calcel = document.querySelector(".calcel")
        
        let already = false  //定义抽奖中的状态
        let order = [0, 1, 2, 4, 7, 6, 5, 3] //定义滚动顺序
        let curindex = 0
       



        button.onclick = function () {
            if (already) return
            already = true
            let num = Math.floor(Math.random() * 16 + 20) //[20,36)
            let fast = Math.floor(num / 3 * 2)  //快转
            let slow = Math.floor(num / 3 * 1)  //慢转
            console.log(slow);
            var fasttimer = setInterval(() => {

                li[order[curindex]].style.backgroundColor = ""
                if (curindex + 1 > 7) {
                    curindex = -1
                }

                li[order[curindex + 1]].style.backgroundColor = "rgb(144, 127, 226)"
                curindex = curindex + 1


            }, 100);

            var cleanfast = setTimeout(() => {
                clearInterval(fasttimer)
                clearTimeout(cleanfast)   //自身定时器内部清理自己,且定时器内部的也都会继续执行一次,因为虽然删除语句在前面,但是这个函数内部所有执行语句都已经被初始化了
                var slowtimer = setInterval(() => {  //慢转要在快转完全结束后,所以慢转要在清理快转的定时器里

                    li[order[curindex]].style.backgroundColor = ""
                    if (curindex + 1 > 7) {
                        curindex = -1
                    }
                    li[order[curindex + 1]].style.backgroundColor = "rgb(144, 127, 226)"
                    curindex = curindex + 1


                }, 300);

                var cleanslow = setTimeout(() => {
                    clearInterval(slowtimer)
                    clearTimeout(cleanslow) 
                    already = false
                    let rewardcon = li[order[curindex]].childNodes[0].textContent
                    showreward.innerHTML = rewardcon
                    shade.style.display = "block"

                    setTimeout(() => {  //定时器作用是将opacity和transform的操作推迟到下一个tick中处理,从而与display的操作分隔开,否则动画效果会失效
                     
                        showreward.style.opacity= "1";
                        showreward.style.transform= 'scale(1)';
                     
                        
                    }, 1); //要大于0



                }, slow * 300);
            }, fast * 100);



        }


        calcel.onclick = function () {
            shade.style.display = "none"  //由于display对transition的破坏作用,所以动画效果会自动消失,想让transition为0,则也不用再加定时器分隔开
            showreward.style.opacity= "0.3";
            showreward.style.transform= 'scale(0)';
        }


    </script>
</body>

</html>
可将 TTL/UART 串口设备连接至以太网 支持网口升级程序 支持TCP服务器、TCP客户端、UDP模式 支持虚拟串口、Web登录或使用VirCom进行配置 ZLSN2003 概述 ZLSN2003是上海卓岚开发的新一代串口以太网嵌入式模块。该模块功能强大,其基本功能是实现串口联网的方便性,即只要和用户的串口TTL电平的串口连接,ZLSN2003就可以将数据发送到基于TCP/IP/UDP的网络服务器上。默认情况下串口和以太网之间是透明传输协议,即串口发送什么,网络就收到什么数据,不会数据格式化。ZLSN2003内部已经集成网络变压器,外围电路非常简单。 ZLSN2003模块为单片机联网、传统串口设备联网提供了快捷、稳定、经济的方案。不仅能够保证您的产品快速上市,并且为您的产品的稳定提供支撑。 特点 支持在线网络升级固件程序,用户可以从卓岚公司获得软件升级工具和升级firmware,可自行升级到最高版本。 使用配置的ZLVircom工具可以搜索、管理局域网内(支持跨网段搜索)、Internet上的ZLSN2003模块。可一键式配置模块的所有参数。设备配置、管理非常方便。 支持DHCP功能,可以动态获得局域网内的DHCP服务器分配的IP。 支持DNS,自动解析目的域名为IP,目的IP可以为动态域名。 作为TCP Server(TCP服务器端)时,支持独有的100个连接的强大连接能力。 作为TCP Client(TCP客户端)的,支持连接8个目标服务器。作为TCP客户端时,可以在断线后自动进行重连。支持隐含心跳技术,保证网线断线后的恢复。 支持UDP、UDP组播等功能。 支持虚拟串口。 规格 网络界面 以太网 10/100 Mbps 保护 内建1KV电磁隔离 串口界面 界面 TTL电平串口 串口数 1 校验位 None, Even, Odd, Space, Mark 数据位 5~9 停止位 1,2 流控 RTS/CTS,DTR/DCR,XON/XOFF 速率 1200bps~460800bps 软件特性 协议 TCP,HTTP,UDP,ICMP,ARP,IP,DNS,DHCP 虚拟串口平台 Windows 95/98/ME/NT/2000/XP/WIN7/WIN8 配置方式 Web浏览器、卓岚ZLVirCom、串口类AT命令 电器特性 电压输入 DC5V(ZLSN2003-3.3V支持3.3V),210~250mA 机械特性 尺寸 长×宽=43 × 26mm 工作环境 工作温度,湿度 0~70℃,5~95% RH 储存温度,湿度 -45~165℃,5~95% RH W
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值