☆HTML☆ ストップウォッチ

ストップウォッチ

ただのストップウォッチだよ。

00:00.000
Start
Stop
Reset
☆CSS☆ body{ font-family: 'Courier New',monospace; font-size: 14px; background: #eee } *{ margin: 0; } header{ text-align: center; background-color: rgb(0, 248, 248); font-weight: bold; font-size: 30px; padding-top: 20px; padding-bottom: 20px; } .container{ margin: 20px auto; width: 270px; background: #fff; padding: 15px; text-align: center; } #timer{ background: #ddd; height: 120px; line-height: 120px; font-size: 40px; margin-bottom: 15px; } .btn{ width: 80px; height: 45px; line-height: 45px; background-color: #ddd; font-weight: bold; cursor: pointer; user-select: none; } .controls{ display: flex; justify-content: space-between; } .inactive{ opacity: 0.6; } p{ padding-left: 35%; font-size: 30px; padding-top: 30px; padding-bottom: 30px; } ☆JavaScript☆ 'use strict'; { const timer = document.getElementById('timer'); const start = document.getElementById('start'); const stop = document.getElementById('stop'); const reset = document.getElementById('reset'); let startTime; let timeoutId; let elapsedTime = 0;//タイマーが走っていた時間 function countUp() { console.log(Date.now() - startTime);//startTimeはstartボタンを押した時刻と下で定義している。現在の時刻-startを押した時刻でストップウォッチの経過時間を求めている。 const d = new Date(Date.now() - startTime + elapsedTime);//new Dateオブジェクトにコンソールログに表示した値をそのまま渡し、変数dに代入。+elapsedTimeで経過時間も含めてタイマーに表示させている。(startを再びクリックすると0から始まってしまう現象を無くす) const m = String(d.getMinutes()).padStart(2, '0');//分を求める const s = String(d.getSeconds()).padStart(2, '0');//秒を求める const ms = String(d.getMilliseconds()).padStart(3, '0');//ミリ秒を求める timer.textContent = `${m}:${s}.${ms}`;//timerにtextContentで``内の文字列にしなさいと命令 timeoutId = setTimeout(() => { countUp(); }, 10);//countUpの処理を一定時間ごとに繰り返したい為、setTimeoutを使用。10ミリ秒後にこの処理が走る為、10ミリ秒ごとに現在時刻とstartTimeの差が表示される。 }//countUpの定義を{}内に記載 function setButtonStateInitial() { start.classList.remove('inactive'); stop.classList.add('inactive'); reset.classList.add('inactive'); }//start前に押せるボタンを制限する関数,true(add)がクリック不可、false(remove)がクリック可 function setButtonStateRunning() { start.classList.add('inactive'); stop.classList.remove('inactive'); reset.classList.add('inactive'); }//タイマーが動いている時に押せるボタンを制限する関数 function setButtonStateStopped() { start.classList.remove('inactive'); stop.classList.add('inactive'); reset.classList.remove('inactive'); }//stopボタンを押した時に押せるボタンを制限する関数 setButtonStateInitial();//ページ読み込み時にこの関数を呼び出したい為ここに記載 start.addEventListener('click', () => { if (start.classList.contains('inactive') === true) { return; }//inactiveクラスがついていたら処理を行わないという命令。有効なボタンしか押せないようにしている。 setButtonStateRunning();//タイマー始動時にこの関数を呼び出したい為ここに記載 startTime = Date.now();//基準となる日時からの経過ミリ秒を使用し計算を行う為、Date.now()を使用。Date.nowは現在の時刻を表す。 countUp(); });//startボタンの設定 stop.addEventListener('click', () => { if (stop.classList.contains('inactive') === true) { return; } setButtonStateStopped();//stopボタンを押した時にこの関数を呼び出したい為ここに記載 clearTimeout(timeoutId);//setTimeoutをキャンセルしたい為、clearTimeoutを使用 elapsedTime += Date.now() - startTime//+=にしてタイマーが走った時間を全て足し上げることで何回stopを押しても次にstartを押したときに直近のstopの時間から始まるようにしている。 });//stopボタンの設定 reset.addEventListener('click', () => { if (reset.classList.contains('inactive') === true) { return; } setButtonStateInitial();//reset時も最初の状態に戻したい為、ここにもこの関数を記載 timer.textContent = '00:00.000'//timerを元の値に戻すために、このボタンが押されたら''内のテキストに変更するという命令をしている。 elapsedTime = 0;//resetを押したときに経過時間も0にすることで、再びstartを押したときに0から始まるようにしている。一つ上の命令はテキストを設定しているだけ。 });//resetボタンの設定 }