zoukankan      html  css  js  c++  java
  • 静态页面(一):原生JS模拟京东秒杀专场倒计时

    最近将BOM重新复习了一遍,本想使用定时器给女朋友做一个生日倒计时,奈何canvas都忘了。所以模拟了一个京东的秒杀专场倒计时。

    各位小伙伴有什么建议和意见,请不吝赐教。

    下面是京东首页的截图:

     利用BOM提供的setInterval()方法可以实现这样的一个小功能。

    HTML代码:

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <link rel="stylesheet" type="text/css" href="css/模拟京东倒计时.css"/>
            <script src="js/模拟京东倒计时.js" type="text/javascript" charset="utf-8"></script>
        </head>
        <body>
                <!-- 倒计时超链接 -->
                <a href="https://miaosha.jd.com" id="countdownLink">
                    <!-- 秒杀框标题 -->
                    <div id="seckill">京东秒杀</div>
                    <!-- 促销特殊时间:时间场 -->
                    <div id="specialTime"></div>
                    <!-- 倒计时剩余时间 -->
                    <div id="leftTime">
                        <span id="hour">00</span>
                        <span id="minute">00</span>
                        <span id="second">00</span>
                    </div>
                </a>
        </body>
    </html>

    CSS样式表:

    /* 清除默认内外边距 */
    *{
        padding: 0;
        margin: 0;
    }
    
    /* 设置超链接的样式 */
    #countdownLink{
        /* 将其变为块元素之后,设置宽高,宽高和背景图片的大小一致 */
        display: block;
        width: 191px;
        height: 261px;
        /* 设置超链接背景图片,点击图片任何位置都能访问该超链接 */
        background-image: url(//misc.360buyimg.com/mtd/pc/index_2019/1.0.0/assets/img/4a15d8883775742e3efbb850ae14def7.png);
        /* 去掉超链接里文字的下划线 */
        text-decoration: none;
    }
    
    /* 设置秒杀框标题的样式 */
    #seckill{
        /* 宽度设置为父元素的100%,也就是191px */
        width:100%;
        /* “京东秒杀”字体样式 */
        font-family: "黑体";
        font-weight: bold;
        color:white;
        font-size: 32px;
        /* “京东秒杀”在其所在盒子里居中 */
        text-align: center;
        /* 将京东秒杀的盒子居中,由于宽度是100%,故仅设置上下外边距即可,在这里习惯性加auto*/
        margin: 40px auto;
    }
    
    /* 消除#countDownLink和#seckill的垂直外边距重叠 */
    #countdownLink::before,
    #countdownLink::after{
        content:"";
        display: table;
        clear: both;
    }
    
    /* 设置场次字体大小*/
    #specialTime{
        /* 宽度设置为父元素的100%,也就是191px */
        width:100%;
        height:20px;
        /* 内容居中 */
        text-align: center;
        /* 字体样式 */
        /* 文字大小设置默认值为15px,后面选择器里会有变动 */
        font-size: 15px;
        color:white;
        font-family: "黑体";
        font-weight: bold;
        /* 设置一个上下外边边距,其中,上外边距会与最上边盒子的下外边距重合一部分 */
        margin: 75px auto 20px;
    }
    
    /* JS根据场次信息添加的标签,显示时间,由于时间字体偏大,就单独设置一个p标签 */
    #specialTime #strong{
        display: inline-block;
        font-size: 23px;
    }
    /* JS添加的标签,显示场次信息里的中文,字体偏小 */
    #specialTime #nomal{
        display: inline-block;
        /* 继承父元素字体大小 */
        /* 调节根据基线的偏移值,使得场次时间与中文对齐 */
        vertical-align: 3px;
    }
    
    /* 设置剩余时间所在盒子的样式 */
    #leftTime{
        width: 100%;
        text-align: center;
    }
    
    /* 时间子盒子的样式 */
    #hour,#minute,#second{
        /* 宽高 */
        width: 30px;
        height: 30px;
        /* 背景 */
        background-color: black;
        /* 字体 */
        color:white;
        font-family: "黑体";
        font-weight: bold;
        font-size:25px;
        /* 文字居中 */
        text-align: center;
        display: inline-block;
        /* 左右外边距*/
        margin:0 5px;
        /* 开启决相对定位 */
        position: relative;
    } 
    
    /* 在时和分的后面添加一个: */
    #hour::after,#minute::after{
        content: ":";
        position: absolute;
        /* 调一调冒号的位置,使其与数字对齐 */
        left: 32px;
        top: -3px;
    }

    JS代码:

    window.addEventListener("load",function(){
        //设置秒杀专场开始时间基于1970年的毫秒数
        var startTime = +new Date("2020-03-06T17:00:00");
        //设置秒杀专场当天的00:00时基于1970年的毫秒数
        var zeroOclock = +new Date("2020-03-06T00:00:00");
        //将上述两个时间相减,将结果换算成24小时制的时间放在specialTime里显示用于表明多少点的场次
        var h1 = (startTime-zeroOclock)/1000/60/60;
        //若时间为个数,前面补个0
        h1 = h1<10?"0"+h1:h1;
        //获取显示场次信息的那个div元素的对象
        var box = document.getElementById("specialTime");
        //在里面添加两个p标签,分别存放时间和描述性中文
        box.innerHTML = "<p id="strong">"+ h1 + ":00</p>" + "<p id="nomal">点场 倒计时</p>";
        //获取时分秒盒子的对象
        var span = document.getElementsByTagName("span");
        //获取当前时间基于1970年的毫秒数
        var now = +new Date;
        // 如果开场时间未到,则不停地计时
        if((startTime - now)>0){
            cal();
            var countDown = setInterval(cal,1000);    
        }
        
        function cal(){
            // 重新获取当前时间
            now = +new Date();
            // 计算开场时间与现在时间的差
            var leftTime = startTime - now;
            // 分别计算年月日
            var h = parseInt(leftTime/1000/60/60%24);
            h = h < 10 ? "0" + h : h;
            var m = parseInt(leftTime/1000/60%60);
            m = m < 10 ? "0" + m : m;
            var s = parseInt(leftTime/1000%60);
            s = s < 10 ? "0" + s : s;
            // 如果时间到了,则停止计时,时间没到的话,就更新倒计时
            if((h+m+s)!="00000000"){
                span[0].innerHTML = h;
                span[1].innerHTML = m;
                span[2].innerHTML = s;
            }else{
                span[2].innerHTML = s;
                clearInterval(countDown);
            }
        }
    })

    输出结果(IE8及以下不兼容):

  • 相关阅读:
    阿里妈妈MaxCompute架构演进_-_AON(MPI)集群
    阿里云ECS部署Grafana接入zabbix
    ECS实例RAM角色实践
    上海云栖—人工智能-视觉计算专场预热
    阿里云论坛版主制作最新教程汇总贴
    移动相关的css
    GULP入门(一)
    mongodb+nodejs 增删查的demo
    nodejs+express 初学(三)
    nodejs+express 初学(二)
  • 原文地址:https://www.cnblogs.com/lilisblog/p/12427368.html
Copyright © 2011-2022 走看看