主題目標


製作一個倒數計時器,頁面上已經有固定秒數的選項,也有 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

Steven玄

謝謝您觀看本站內容!! 😅 西元93年台灣男,軟體前、後、資料庫工程師 和 多元收入實踐,程式設計、網站系統規劃、商業策略分析規劃、多元收入研究,目前在網站開發公司擔任工程師。

發佈留言