HTML&JavaScriptで超シンプルストップウォッチをプログラミングします。
インターネット上に探せばどこにでもありふれているプログラムですが、ちょっと遊べるゲームをつくりたいので一応作っておきます。
それではやっていきましょう。
つくりかた
まずは、全文をお見せしましょう。
ほい。
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<div class="stopwatch">
<h2>ストップウォッチ</h2>
<p id="js-stopwatch">00:00:00:000</p>
<input id="js-stopwatchStart" type="button" value="開始" />
<input id="js-stopwatchStop" type="button" value="停止" disabled />
<input id="js-stopwatchResset" type="button" value="リセット" disabled />
</div>
<script>
// ■ストップウォッチ
const $watch = document.getElementById("js-stopwatch");
const $start = document.getElementById("js-stopwatchStart");
const $stop = document.getElementById("js-stopwatchStop");
const $resset = document.getElementById("js-stopwatchResset");
// 開始時間
let startTime;
// 停止時間
let stopTime = 0;
// タイムアウトID
let timeoutID;
// 時間を表示する関数
function displayTime() {
const currentTime = new Date(Date.now() - startTime + stopTime);
const h = String(currentTime.getHours() - 9).padStart(2, "0");
const m = String(currentTime.getMinutes()).padStart(2, "0");
const s = String(currentTime.getSeconds()).padStart(2, "0");
const ms =String(currentTime.getMilliseconds()).padStart(3, "0");
$watch.textContent = `${h}:${m}:${s}:${ms}`;
timeoutID = setTimeout(displayTime, 10);
}
// スタートボタンがクリックされたら時間を進める
$start.addEventListener("click", () => {
$start.disabled = true;
$stop.disabled = false;
$resset.disabled = true;
startTime = Date.now();
displayTime();
});
// ストップボタンがクリックされたら時間を止める
$stop.addEventListener("click", function () {
$start.disabled = false;
$stop.disabled = true;
$resset.disabled = false;
clearTimeout(timeoutID);
stopTime += Date.now() - startTime;
});
// リセットボタンがクリックされたら時間を0に戻す
$resset.addEventListener("click", function () {
$start.disabled = false;
$stop.disabled = true;
$resset.disabled = true;
$watch.textContent = "00:00:00:000";
stopTime = 0;
});
</script>
</body>
</html>
うわーめっちゃ目が痛くなるー。
HTMLとJavaScriptがどこで分けられているかわかりますか?
<script>から</script>がJavaScript、それ以外がHTMLです。
今回はストップウォッチの解説なので、この違いは省きますね。
<div class="stopwatch">
<h2>ストップウォッチ</h2>
<p id="js-stopwatch">00:00:00:000</p>
<input id="js-stopwatchStart" type="button" value="開始" />
<input id="js-stopwatchStop" type="button" value="停止" disabled />
<input id="js-stopwatchResset" type="button" value="リセット" disabled />
</div>
ここでは、HTMLで文字やらボタンやらを表示する指示を出しています。
<div class=”stopwatch”>から</div>までがひとくくりです。
stopwatchという箱だと思ってください。
2番目はただのタイトルです。
3番目の<p id=”js-stopwatch”>00:00:00:000</p>はjs-sotpwatchというID(なんでもいいです)のついた00:00:00:000というアイテムです。オブジェクト(置物)といいます。
4番目~6番目はスイッチです。type=”button”でボタンのような表示をすることができます。ただし、この時点ではなんもできないただのボタンです。
では次に、JavaScriptを見ていきましょう。
まず最初にこちら。
// ■ストップウォッチ
const $watch = document.getElementById("js-stopwatch");
const $start = document.getElementById("js-stopwatchStart");
const $stop = document.getElementById("js-stopwatchStop");
const $resset = document.getElementById("js-stopwatchResset");
// 開始時間
let startTime;
// 停止時間
let stopTime = 0;
// タイムアウトID
let timeoutID;
これらは、それぞれの名前のついた箱を用意し、その中にdocument.getElementById(”先ほどのid”)というものを入れたと思ってください。
IDの要素をゲットだぜ!って感じです。
10行目の stopTime = 0; は、stopTimeに0という数字を置いておきましたよということです。
文字が多くて難しそうですが、やっていることは単純です。次。
// 時間を表示する関数
function displayTime() {
const currentTime = new Date(Date.now() - startTime + stopTime);
const h = String(currentTime.getHours() - 9).padStart(2, "0");
const m = String(currentTime.getMinutes()).padStart(2, "0");
const s = String(currentTime.getSeconds()).padStart(2, "0");
const ms =String(currentTime.getMilliseconds()).padStart(3, "0");
$watch.textContent = `${h}:${m}:${s}:${ms}`;
timeoutID = setTimeout(displayTime, 10);
}
ここでは、 function displayTime() {から}の間に時間を表示するためのプログラムをします。
currentTime の中には、計算式が入っています。その下からはそれぞれ時、分、秒、ミリ秒が書いてあり、それぞれ何桁まで表示するか、最初の数字は何かが記述されています。
$watch.textContent = `${h}:${m}:${s}:${ms}`;では、h、m、s、msの中に今の数字を入れてねって感じです。
timeoutID = setTimeout(displayTime, 10);は一定時間後にその処理をしてねってことです。1000で1秒(だと思います。)です。
// スタートボタンがクリックされたら時間を進める
$start.addEventListener("click", () => {
$start.disabled = true;
$stop.disabled = false;
$resset.disabled = true;
startTime = Date.now();
displayTime();
});
// ストップボタンがクリックされたら時間を止める
$stop.addEventListener("click", function () {
$start.disabled = false;
$stop.disabled = true;
$resset.disabled = false;
clearTimeout(timeoutID);
stopTime += Date.now() - startTime;
});
// リセットボタンがクリックされたら時間を0に戻す
$resset.addEventListener("click", function () {
$start.disabled = false;
$stop.disabled = true;
$resset.disabled = true;
$watch.textContent = "00:00:00:000";
stopTime = 0;
});
残りは、最初に表示できるようにしたボタンに、それぞれの機能を記述しています。
これでボタンを押すことでそれぞれの仕事をしてくれます。やったね!
で、完成品がこちら↓
あっ、文字化け。文字コードが合ってないみたい。宣言してなかったからなぁ。
一応、左がスタート、真ん中がストップ、左がリセットボタンです。
後で直しておきます。
まとめ
はい、というわけでストップウォッチができました。
このプログラムをちょっといじって簡単なゲームを作ってみたいと思います。
それではまた!