本記事では、以下のようにボタンクリックでライトモード(背景:白)とダークモード(背景:黒)を切り替える実装方法を紹介します。
サンプルテキスト
サンプルテキスト
サンプルテキスト
Webページやアプリの外観を変更する設定。それぞれ以下のような特徴とメリット・デメリットがある。
- ライトモード
-
多くのデバイスやアプリでのデフォルト設定。白など明るい背景に対して、黒などの濃い色の文字やアイコンが表示される。日中や明るい環境での視認性は高いが、長時間見続けると目が疲れやすい。
- ダークモード
-
背景が黒や濃いグレーで、文字やアイコンが白や明るい色で表示される。目の疲れを軽減でき、デバイスのバッテリー消費を抑えられることも。(特にOLEDスクリーンの場合)
今回はOS側でダークモードにした際のWebサイトの設定方法と、ユーザーが任意でダークモードを選択できる方法をご紹介します。
HTML / CSS / JavaScript コード
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ダークモード切替</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<button id="mode-toggle">ダークモードに切り替え</button>
<div id="container">
<p>サンプルテキスト</p>
<p>サンプルテキスト</p>
<p>サンプルテキスト</p>
</div>
<script src="script.js"></script>
</body>
</html>
実装のポイント
CSSカスタムプロパティ(変数)を使用して、モードのスタイリングを行う
本実装ではCSS内で変数を定義し、複数のプロパティで利用できるようにしています。
:root {
--bg-color: white;
--text-color: black;
}
:root
疑似クラスを使って、ルート要素(<html>
要素)に変数を設定します。
これにより、ドキュメント全体で変数が使用できるようになります。--bg-color
と--text-color
がカスタムプロパティ(変数)の名前で、white
とblack
がその値です。
設定したCSS変数を使用するには、以下のようにvar()
関数を使います。
body {
background-color: var(--bg-color);
color: var(--text-color);
}
var(--bg-color)
は--bg-color
変数の値(white
)が適用され、背景が白に。var(--text-color)
は--text-color
変数の値(black
)が適用され、テキストが黒に。
続いてダークモードの場合は、.dark-mode
クラスを使って変数を上書きします。
body.dark-mode {
--bg-color: black;
--text-color: white;
}
<body>
要素にdark-mode
クラスが追加されると、--bg-color
と--text-color
の値が上書きされます。
これにより、ダークモードの場合は背景が黒、テキストが白になります。
applyMode関数を作成し、モードの適用 および ボタンテキストの変更を行う
const applyMode = (mode) => {
if (mode === 'dark-mode') {
document.body.classList.add('dark-mode');
toggleButton.textContent = 'ライトモードに切り替え';
} else {
document.body.classList.remove('dark-mode');
toggleButton.textContent = 'ダークモードに切り替え';
}
};
現在のテーマがダークモード(dark-mode)の場合、以下処理を行う
body
要素にdark-modeクラスを付与- ボタンテキストを「ライトモードに切り替え」に変更
現在のテーマがそれ以外(ライトモード)の場合、以下処理を行う
body
要素からdark-modeクラスを削除- ボタンテキストを「ダークモードに切り替え」に変更
ローカルストレージを使用し、モードを保存 および ロード時にモードを適用する
ローカルストレージ(Local Storage)を使用することで、モードの設定をブラウザに保存し、ページを再訪問したときに保存したテーマが自動で適用されるようになります。
const currentMode = localStorage.getItem('Mode');
保存されたモード情報を取得し、currentMode
に代入。
localStorage.setItem('mode', newMode);
ボタンクリック時、モードを変更すると同時に新しく適用されたモード(newMode)をローカルストレージに保存。(Key: ‘mode’ / Value: newMode)