目標
製作一個倒數計時器,頁面上已經有固定秒數的選項,也有 form 的自訂時間的倒數
Demo | Github
處理步驟
要製作一個倒數計時器,就要使用到 setInterval ,練習的範本上已經有幾個固定秒數按鈕,所以先把顯示文字呈現出來,最後在處理計時器
步驟 1.
顯示文字的部分有兩個,一個是倒數計時,一個是時間截止的時間,另外還要變更網頁標題(頁籤上的標題文字)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| const buttons = document.querySelectorAll("[data-time]");
const timerDisplay = 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}`; document.title = display; timerDisplay.textContent = display; }
function displayEndTime(timestamp) { const end = new Date(timestamp); endTime.textContent = `Be Back At ${end.getHours()}:${end.getMinutes()}:${end.getSeconds()}`; }
|
步驟 2.
各按鈕事件與計時器撰寫,利用 setInterval 來顯示上一步驟的時間。由於 setInterval 設定為每秒鐘進行,所以顯示時間直接根據秒數去扣除顯示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| let countdown;
function startTimer() { const seconds = parseInt(this.dataset.time); timer(seconds); }
function timer(seconds) { clearInterval(countdown); const then = Date.now() + seconds * 1000; displayTimeLeft(seconds); displayEndTime(then);
countdown = setInterval(() => { seconds--; if (seconds < 0) { clearInterval(countdown); return; } displayTimeLeft(seconds); }, 1000); }
buttons.forEach(button => button.addEventListener("click", startTimer));
|
步驟 3.
表單的自訂時間功能,同樣呼叫上一步驟的計時器;並將顯示時間的文字調整;注意表單送出的時候需要取消預設功能,避免頁面重整。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
function displayTimeLeft(seconds) { const minutes = Math.floor(seconds / 60); const remainderSeconds = seconds % 60; const display = `${paddingLeft(minutes.toString(), 2)}:${paddingLeft( remainderSeconds.toString(), 2 )}`; document.title = display; timerDisplay.textContent = display; }
function displayEndTime(timestamp) { const end = new Date(timestamp); const hour = end.getHours().toString(); const minute = end.getMinutes().toString(); const second = end.getSeconds().toString(); endTime.textContent = `Be Back At ${paddingLeft(hour, 2)}:${paddingLeft( minute, 2 )}:${paddingLeft(second, 2)}`; }
function paddingLeft(str, lenght) { if (str.length >= lenght) return str; else return paddingLeft("0" + str, lenght); }
document.customForm.addEventListener("submit", function(e) { e.preventDefault(); const mins = this.minutes.value; timer(mins * 60); this.reset(); });
|
筆記與備註事項
JavaScript 部分
Date.now() 方法回傳自 1970/01/01 00:00:00 UTC 起經過的毫秒數。
資料來源 - MDN
參考資料