結論: ボタンを探して、押されたら class を付け外しする
実際に動く見本です。ボタンを押すたびに切り替わります。
はじめてのページ
IT業界をやさしく案内します。
今日のコード(コピーして使えます)
動画の最後にできあがったファイルです。contact.html は変更なし(第8回の記事と同じ)。index.html の <button> と <script>、style.css の .dark、新しい script.js の3つが今回足した部分です。
const btn = document.getElementById("btn");
btn.addEventListener("click", function () {
document.body.classList.toggle("dark");
});
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width">
<title>はじめてのページ</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<nav>
<a href="index.html">自己紹介</a>
<a href="contact.html">お問い合わせ</a>
</nav>
<div class="box">
<h1>はじめてのページ</h1>
<button id="btn">ダークモード</button>
<h2>自己紹介</h2>
<table>
<tr>
<th>好きなもの</th>
<th>理由</th>
</tr>
<tr>
<td>猫</td>
<td>かわいいから</td>
</tr>
<tr>
<td>カレー</td>
<td>おいしいから</td>
</tr>
</table>
<p>IT業界をやさしく案内します。</p>
<p>これは1行目。<br>
これは2行目。</p>
<ol>
<li>開発の流れ</li>
<li>職種図鑑</li>
<li>用語集</li>
<li>学び方</li>
</ol>
<a href="https://it-nyumon.com/">サイトへ</a>
<a href="https://it-nyumon.com/">
<img src="neko.png" alt="ねこ" width="200">
</a>
</div>
<script src="script.js"></script>
</body>
</html>
h1 { color: tomato; }
p { font-size: 20px; }
body { background: lightcyan; }
h1 { text-align: center; }
th, td { border: 1px solid gray; }
table { border-collapse: collapse; }
th, td { padding: 8px; }
.box {
background: white;
padding: 24px;
max-width: 400px;
margin: 0 auto;
border-radius: 12px;
}
nav a {
margin-right: 16px;
}
img {
max-width: 100%;
}
.dark {
background: #333;
color: white;
}
.dark .box {
background: #555;
}
id と script タグの置き場所
<button id="btn">ダークモード</button>: 第5回のボタンに id を付けました。id はページの中で1つだけにします。<script src="script.js"></script>: 第6回の link タグと同じく、別ファイルをつなぐ1行です。body の最後に置くのがポイントで、ボタンより前に書くと「まだボタンがない」状態で探すことになり、見つかりません。.dark { ... }: ダークモードの見た目は CSS に書いておきます。JavaScript がやるのは「dark という class を付けるか外すか」だけ。役割を分けると、あとで色を変えたいときも CSS だけ直せば済みます。
3行の JavaScript を1行ずつ
const btn = document.getElementById("btn");: ページ(document)の中から id が btn の要素を探してきて、btn という名前で持っておきます。btn.addEventListener("click", function () { ... });: ボタンが click されたら、中かっこの中をやれ、という意味です。「押されるのを待つ係」を付けるイメージです。document.body.classList.toggle("dark");: body の class 一覧(classList)に dark を付けたり外したりします。toggle はスイッチで、付いていなければ付け、付いていれば外します。押すたびに切り替わるのはこのためです。
ここまでの3つを一言でまとめると、HTML が意味の札、CSS が見た目の指示書、JavaScript が動きの台本です。
HTML入門シリーズ全10回(まとめ)
自己紹介ページを作って、ネットに公開するところまで、全10回でやってきました。振り返りにどうぞ。
- #1HTMLってなに?3つのタグで最初のページを作る
- #2リンクと画像(a・img)
- #3CSSで見た目を変える
- #4表を作る(table・tr・th・td)
- #5入力欄とボタン(form・input・button)
- #6ページを増やす(nav・style.css)
- #7レイアウトを整える(div・class・余白)
- #8スマホで見ても崩さない(viewport・max-width)
- #9ネットに公開する(GitHub Pages)
- #10JavaScriptで動かす(この記事)
よくある質問
script タグはなぜ body の最後に書くのですか?
JavaScript は書かれた場所で上から順に実行されます。ボタンより前に書くと、探す時点でまだボタンが読み込まれておらず見つかりません。body の最後に置けば、ページの部品がそろってから動きます。
const は何ですか?
値に名前を付けて持っておく「箱(変数)」を作る書き方です。あとで中身を入れ替えないときは const を使います。今回は探してきたボタンに btn という名前を付けています。
ボタンを押しても何も起きません。
確認する順番は、HTML の id="btn" と JavaScript の "btn" の綴りが同じか、script タグの src が script.js と同じファイル名か、script タグが body の最後にあるか、CSS の .dark が書けているか。ブラウザで F12 を押してコンソールに赤いエラーが出ていないかを見ると原因が分かります。
ダークモードをページを開き直しても覚えさせるには?
ブラウザに小さなメモを残す localStorage という仕組みを使います。押したときに保存し、開いたときに読み出して dark を付け直します。次のシリーズ「JavaScript入門」で扱います。