コース一覧
JavaScriptでWebページを動かす
つくる ダークモード切替

JavaScriptでWebページを動かす

DOM から要素を取得・更新・追加し、クリック・入力・フォーム送信に反応する処理を作る全 20 レッスン(411 分)のコースです。タイマーと localStorage も使い、最後は入力を保存できるひとことメモを仕上げます。用意された HTML/CSS を使うため、学習の中心は JavaScript です。

1
DOM のきほん
01. DOM とは何か15分
02. 要素を取得する20分
03. テキストを書き換える20分
04. class を付け外しする20分
05. 要素を作って追加する20分
06. 配列から一覧を描画する25分
07. つくる ギャラリーをデータ駆動にする30分
08. 第1章まとめクイズ10分
2
イベント処理
01. クリックに反応する18分
02. event オブジェクト20分
03. 入力欄の値を取る18分
04. フォーム送信を制御する20分
05. つくる ダークモード切替25分
06. つくる フォームの入力チェック25分
07. 第2章まとめクイズ10分
3
タイマーと総合制作
01. setTimeout と setInterval20分
02. localStorage で保存する20分
03. つくる ひとことメモウィジェット30分
04. 自由拡張30分
05. 完成と次のステップ15分

つくる ダークモード切替

解説

このレッスンで分かること

  • classList.toggle は、付いていれば外し、無ければ付けます
  • toggle の戻り値は実行後に付いているかどうかで、ボタンの文言の切り替えにそのまま使えます

1 回目は変わるのに、2 回目が戻らない

押したら見た目が変わるボタンを作るとき、多くの人が最初にこう書きます。

JavaScript

menuButton.addEventListener("click", function () { menu.classList.add("is-open"); });

1 回目はちゃんと開きます。ところが、もう一度押しても閉じません。add はすでに付いていれば黙って何もしないからです。切り替えは往復して初めて切り替えです。

今回作るのはダークモードの切り替えボタンです。決まりは次のとおりです。

  • ヘッダーの nav のうしろに id="theme-toggle" class="theme-toggle" type="button" のボタンを足し、文字は「ダークモード」にする
  • そのボタンに click を登録し、document.body の class を切り替える
  • 切り替えた結果を受け取って、ボタンの文字を「ライトモード」と「ダークモード」で入れ替える

見た目の CSS は用意してあります。書けたら必ず 2 回押して、明るい状態まで戻ることを確かめてください。

toggle なら 1 行で済む

add と remove を自分で振り分けても書けます。

JavaScript

if (menu.classList.contains("is-open")) { menu.classList.remove("is-open"); } else { menu.classList.add("is-open"); }

間違ってはいませんが、これとまったく同じことが menu.classList.toggle("is-open") の 1 行で書けます。条件分岐が消えるぶん、読み違いも起きません。切り替えを書くときは toggle を第一候補にしてください。

メソッド動き戻り値
add付ける。すでにあれば何もしないなし
remove外す。無ければ何もしないなし
toggleあれば外し、無ければ付ける実行後に付いているか
contains付いているかを調べるtrue か false

toggle は実行後の状態を真偽値で返します。付いた直後なら true、外れた直後なら false です。この戻り値をそのまま使えば、contains で調べ直さずにボタンの文字もそろえられます。

JavaScript

const opened = menu.classList.toggle("is-open"); menuButton.textContent = opened ? "メニューを閉じる" : "メニューを開く";

第3章の三項演算子が短く効いています。ボタンの文言を「いまの状態」にするか「押したらどうなるか」にするかは設計の分かれ目ですが、行き先を書くほうが押す前に迷いません。

色は CSS に、名前の付け外しは JavaScript に

配色を切り替えるとき、style.backgroundColor に色を代入していく書き方でも動きます。ただし色の数だけ行が増え、どこで何色にしたのか追えなくなります。JavaScript がやるのは class を付け外しすることだけにして、その class が付いたときの見た目は CSS に書きます。

CSS

body.dark { background-color: #1b1f27; color: #e8eaee; } body.dark .section { background-color: #242a34; }

class を付ける相手は、変えたい範囲のいちばん外側にします。ページ全体の配色を変えたいなら document.body です。.section それぞれに付けて回ると、要素の数だけ処理が増えるうえ、あとから足した要素には付きません。外側 1 か所に付けて、中は CSS の子孫セレクタで受ける。これなら JavaScript は 1 行のままです。

現場では is-open is-active is-loading has-error のように、状態を表す class に is- や has- を付ける習慣があります。形を決める class と読み分けられるようにするためです。

よくある間違い

  • class 名にドットを付ける — classList に渡すのは class 名そのものです。ドットが要るのは querySelector のセレクタのときだけで、.dark という名前の class が付いてしまい CSS には当たりません
  • className を上書きする — document.body.className = "dark" は class 全体を置き換える書き方です。元から付いていた class が消えます。付け外しには classList を使います

課題

  1. HTML の .site-header の中、nav のうしろに id="theme-toggle" class="theme-toggle" type="button" のボタンを足し、文字は「ダークモード」にする
  2. JavaScript で #theme-toggle に click を登録する
  3. 処理の中で document.body.classList.toggle("dark") を呼ぶ
  4. toggle の戻り値を使って、ボタンの文字を「ライトモード」と「ダークモード」で切り替える

ヒント

`body` は `document.body` で取れます。`querySelector` を使わなくてもかまいません

`add` だけだと 2 回目に何も起きません。付け外しを 1 行で書ける `toggle` を使います

`const isDark = document.body.classList.toggle("dark");` と受け取れば、三項演算子でボタンの文字を切り替えられます

index.html
style.css
script.js
プレビュー

できているか

  • #theme-toggle のボタンがある
  • 切替ボタンがヘッダーの中にある
  • 最初はライトモードになっている
  • 2 回押すと元のライトモードに戻る
  • もう一度押すとダークモードになる
エディタを読み込んでいます