来做一个铁人赛倒数计时器吧!

前言

呼~铁人赛终於来到倒数一周的时刻了~/images/emoticon/emoticon42.gif
参加铁人赛的大家都辛苦了!
为了振奋一下精神,今天来尝试做一个简单的倒数计时画面吧~

HTML: 先准备好标题和倒数时间的部分

<main>
      <h1>iT铁人赛倒数</h1>
      <div class="countdown">
        <div class="time">
          <h2 class="days">0</h2>
          <span>Days</span>
        </div>

        <div class="time">
          <h2 class="hours">0</h2>
          <span>Hours</span>
        </div>

        <div class="time">
          <h2 class="minutes">0</h2>
          <span>Minutes</span>
        </div>

        <div class="time">
          <h2 class="seconds">0</h2>
          <span>Seconds</span>
        </div>
      </div>
</main>

由於我们要计算时间,所以需要知道几个必要的概念:

Date 物件

  • 基於世界标准时间 1970 年 1 月 1 日开始
  • 以毫秒来储存时间 (1000毫秒 = 1 秒)
  • 可以传入字串指定时间,如果没有传入值,则为当下时间

对於Date物件不太熟悉的朋友,可以看看追求JS小姊姊系列- 如果时间能重来,我不想跟工具人聊天

setInterval( function, milliseconds, param1, param2, ...)

  • 第一个参数是 callback function,会依据第二个参数所设定的时间间隔循环,不断执行下去
  • setInterval本身会回传一个独立的 Timer ID,用来传入clearInterval()

有了这些概念後,就可以开始写JS的部分了~

JS部分

// 先选取好之後要改的元素
const days = document.querySelector(".days");
const hours = document.querySelector(".hours");
const minutes = document.querySelector(".minutes");
const seconds = document.querySelector(".seconds");

// 传入字串设定好结束的日期
const endDay = new Date("October 16, 2021 00:00:00");


// 计算距离比赛结束时间
function countTimeLeft() {
  const currentTime = new Date();
  const timeDifference = endDay - currentTime;

  const days = Math.floor(timeDifference / 1000 / 60 / 60 / 24);
  const hours = Math.floor(timeDifference / 1000 / 60 / 60) % 24;
  const minutes = Math.floor(timeDifference / 1000 / 60) % 60;
  const seconds = Math.floor(timeDifference / 1000) % 60;

  return { days, hours, minutes, seconds };
}

计算好时间後,就可以用另一个函式做显示时间的部分

// 以下写法会出错: 必须更新页面,时间才会更新
// 错误原因:每一秒执行的程序是显示时间的函式,但时间的资料是上次执行拿到的资料
// const timeLeft = countTimeLeft();
// const ID = setInterval(displayCountdown(timeLeft), 1000);


// 以下写法才可以在每次显示画面时拿到新的资料显示
const ID = setInterval(() => {
  const timeLeft = countTimeLeft();
  displayCountdown(timeLeft);
}, 1000);


function displayCountdown(timeLeft) {
  const passEndDay =
    timeLeft.days <= 0 &&
    timeLeft.hours <= 0 &&
    timeLeft.minutes <= 0 &&
    timeLeft.seconds < 0;

  if (passEndDay) {
    days.innerHTML = "0";
    hours.innerHTML = "0";
    minutes.innerHTML = "0";
    seconds.innerHTML = "0";
    clearInterval(ID);
  } else {
    days.innerHTML = timeLeft.days;
    hours.innerHTML = timeLeft.hours;
    minutes.innerHTML = timeLeft.minutes;
    seconds.innerHTML = timeLeft.seconds;
  }
}


图片来源:Unsplash

这样就完成了~~~如果有更好的做法欢迎留言建议~感谢~
/images/emoticon/emoticon41.gif


<<:  [Day 23]从零开始学习 JS 的连续-30 Days---箭头函式

>>:  JavaScript学习日记 : Day26 - 重做原生方法 -- Array

30天完成家庭任务平台:第三十天

终於最後一天了!!~虽然没有写的很好,就是心得的小小整理,但是也坚持了三十天了,谢谢不小心进到这个网...

[Day8] Android - Kotlin笔记:JetPack - Core KTX

Core KTX 包含的module有: androidx.core.animation andro...

[鱼刺-Python-2] 快速建立测试用API服务

快速建立API服务使用 flask,要先安装 先执行 python -m pip install f...

生成模式 - factory method

今天介绍第三种生成模式 - factory method (工厂模式) 这个模式的目的是,在定义一个...

未来狂想:工业技术发展

人的科技文明发展始终来自於人性 伴随着整体世界的技术进步与科技的发展,人们的生活越来越便利且越来越舒...