
主題目標
製作一個倒數計時器,頁面上已經有固定秒數的選項,也有 form 的自訂時間的倒數。
作品網址:
處理步驟
要製作一個倒數計時器,就要使用到 setInterval ,練習的範本上已經有幾個固定秒數按鈕,所以先把顯示文字呈現出來,最後在處理計時器
步驟一
顯示文字的部分有兩個,一個是倒數計時,一個是時間截止的時間,另外還要變更網頁標題(頁籤上的標題文字)
// 取得所有 buttons //data-time 是所有需要使用的button
const buttons = document.querySelectorAll('[data-time]');
// 倒數計時的標題
const timeDisplay = document.querySelector('.display__time-left');
// 結束時間的顯示元素
const endTime = document.querySelector('.display__end-time');
//顯示倒數計時
function displayTimeLeft(seconds){
// 計算幾分鐘
const minutes = Math.floor(seconds/60);
// 計算剩餘秒數
const remainderSeconds = seconds % 60;
// 組合顯示文字(剩餘時間)
const display = `${minutes}:${remainderSeconds < 10 ? '0':''}${remainderSeconds}`;
// 變更網頁的標題
document.title = display;
// 顯示倒數計時的區塊
timeDisplay.textContent = display;
}
//顯示結束時刻
function displayEndTime(timestamp){
//轉換為時間
const end = new Date(timestamp);
//顯示結束時間
endTime.textContent = `Be Back At ${end.getHours()}:${end.getMinutes()}:${end.getSeconds()}`;
}步驟二
各按鈕事件與計時器撰寫,利用 setInterval 來顯示上一步驟的時間。由於 setInterval 設定為每秒鐘進行,所以顯示時間直接根據秒數去扣除顯示。
// 建立計時器
let countdown;
//按鈕事件,啟動計時器
function startTimer () {
//data 轉換
const seconds = parseInt(this.dataset.time); //dataset.time就是抓取自定義屬性data-time
//執行倒數計時器
timer(seconds);
}
function timer(seconds){
// 先清除其他計時器,避免相互影響
clearInterval(countdown);
// 計算倒數計時完成的時刻(使用毫秒)
const then = Date.now() + seconds * 1000;
// 顯示倒數計時
displayTimeLeft(seconds);
// 顯示完成時刻
displayEndTime(then);
//計時器迴圈
countdown = setInterval(()=>{
// 每秒鐘執行,所以直接每次減 1 就好
seconds--;
// 小於 0 時,清除計時器 並跳出迴圈
if(seconds < 0 ){
clearInterval(countdown);
return;
}
//顯示到計時器的地方
displayTimeLeft(seconds);
},1000);//每1000毫秒迴圈跑一次
}
//設置事件,每個button按鈕,只要點選,即開始計時器
buttons.forEach(button => button.addEventListener("click",startTimer));步驟三
表單的自訂時間功能,同樣呼叫上一步驟的計時器;並將顯示時間的文字進行調整;
注意表單送出的時候需要取消預設功能,避免頁面重整。
//顯示結束時刻
function displayEndTime(timestamp){
//轉換為時間
const end = new Date(timestamp);
const minutes = end.getMinutes();
const seconds = end .getSeconds();
//顯示結束時間
endTime.textContent = `Be Back At ${end.getHours()}:${minutes<10 ? '0':''}${minutes}:${seconds < 10 ? '0':''}${seconds}`;
}
//輸入時間的功能部分
document.customForm.addEventListener('submit',function(e){ //文件中name名稱為customForm的物件增加事件
//取消預設功能**重要
e.preventDefault();
const mins = this.minutes.value; //表單內neme為minutes的值
timer(mins * 60);//開始計時 分鐘*60
//表單清空
this.reset();
})特別技術、函式
<HTML>
<CSS>
<JavaScript>
Date.now()
方法回傳自 1970/01/01 00:00:00 UTC 起經過的毫秒數。
參考資料:
JS30紀錄 29-Countdown Timer:https://shunnien.github.io/2018/02/03/Javascript30days-29/
Js 30 day 中文指南:https://github.com/soyaine/JavaScript30
