js模仿京東首頁的倒計時功能

模仿京東首頁的倒計時

我們學習了定時器,可以用定時器做一個倒計時,於是我模仿了京東首頁倒計時。

先看看京東首頁的倒計時。

思路:

  1. 如何倒計時?
  • 給一個未來的時間。然後計算未來時間到現在的時間戳。
  • 用定時器每隔一秒,計算時間戳。然後把時間戳轉換為時分秒。
  1. 轉換的時候,要注意取整和取余,別搞混了。

  2. 最後拿到了數據,就把數據填充到靜態頁面中。

  3. 填充數據的時候,判斷一下,當為個位數的時候,前面補0,確保兩位數字。

這是我做出來的效果

最後附上我的代碼

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        .countdown{
            width: 190px;
            height: 260px;
            margin: 0 auto;
            background: #E83632;
            background: url(//misc.360buyimg.com/mtd/pc/index_2019/1.0.0/assets/img/4a15d8883775742e3efbb850ae14def7.png);
        }
        .countdown .title{
            color: #fff;
            font-size: 30px;
            text-align: center;
            font-weight: bold;
            padding-top: 30px;
        }
        .countdown .desc{
            color: #fff;
            font-size: 14px;
            text-align: center;
            margin-top: 100px;
            vertical-align: middle;
        }
        .countdown .desc>strong{
            font-size: 18px;
            vertical-align: middle;
            margin-right: 8px;

        }
        .countdown .time{
            width: 80%;
            height: 30px;
            margin:0 auto;
            margin-top: 10px;
            color: #fff;
            font-size: 20px;
            margin-left: 25px;
        }
        .countdown .time>span{
            width: 30px;
            height: 30px;
            display: inline-block;
            background: #2f3430;
            margin-left: 5px;
            text-align: center;
            font-weight: bold;
            padding-top: 4px;
        }
    </style>
</head>
<body>
    
    <div class="countdown">
        <div class="title">京東秒殺</div>
        <div class="desc">
            <strong></strong>點倒計時
        </div>
        <div class="time">
            <span class="h"></span>
            :
            <span class="m"></span>
            :
            <span class="s"></span>
        </div>
    </div>
    <script>
        //封裝為Date的內置函數
        Date.prototype.countdown = function countdown(endDate){
            if(!(endDate instanceof Date)){
                console.error('Uncaught TypeError :'+endDate+'不是Date類型');
                return undefined;
            }
            var nowDate = new Date();
            //定義cha為時間差 ,接收 現在到結束時的時間戳 
            var cha = endDate.getTime() - nowDate.getTime();

            var year = parseInt(cha / (365*24*60*60*1000));

            var value = cha % (365*24*60*60*1000);

            var day = parseInt(value / (24*60*60*1000));

            var h = parseInt(value / (60*60*1000));
            value = value % (60*60*1000);

            var m = parseInt(value / (60*1000));
            value = value % (60*1000);

            var s = parseInt(value / (1000));

            var ms = parseInt(s);

            return {year,day,h,m,s,ms};
        }
        
        var djs = setInterval(function(){
            //設置結束時間:月份從0-11,0代表1月份,11就是12月份
            var endDate = new Date(2021,0,25,0,0,0,0);
            //匿名調用Date的自定義內置函數,傳入結束的日期,返回一個對象
            var obj = new Date().countdown(endDate);
            //對返回值結果判定
            if( undefined === obj){
                clearInterval(djs);
                return;
            } 
            //獲取倒計時需要渲染的元素
            var end = document.querySelector('strong');
            var h = document.querySelector('.h');
            var m = document.querySelector('.m');
            var s = document.querySelector('.s');
            //時分秒為個位數時,前面補0
            if(obj.s < 10) obj.s = '0'+obj.s;
            if(obj.m < 10) obj.m = '0'+obj.m;
            if(obj.h < 10) obj.h = '0'+obj.h;
            //把數據渲染到頁面
            s.innerHTML = obj.s;
            m.innerHTML = obj.m;
            h.innerHTML = obj.h;
            end.innerHTML = endDate.getHours();
            //時間到了清除定時器
            if( 0===obj.h && 0===obj.m && 0===obj.s ){
                clearInterval(djs);
            }
        },1000);

    </script>
</body>
</html>