CSSで実現する「ダークモード対応」のベストプラクティス
- #CSS
- #デザインシステム
- #アクセシビリティ
CSSで実現する「ダークモード対応」のベストプラクティス
はじめに
ユーザーのOSやブラウザ設定に応じて、ダークモード/ライトモードを切り替えられるデザインは今や標準的になっています。ここでは、CSSだけでシンプルに対応する方法と、より良いユーザー体験を実現するための工夫を紹介します。
1. prefers-color-schemeの利用
CSSメディアクエリでOSのテーマ設定を判定し、自動的に配色を切り替えられます。まずはライトモードをデフォルトとして定義し、prefers-color-scheme: dark でダークモード用のスタイルを上書きします。
/* ライトモード(デフォルト) */
body {
background: #ffffff;
color: #000000;
}
/* ダークモード */
@media (prefers-color-scheme: dark) {
body {
background: #121212;
color: #ffffff;
}
}
ダークモード用の背景色は完全な黒ではなく、#121212などのやや明るい色を使うとコントラストが過度にならず、視認性と疲れにくさのバランスが取れます。
2. トグル切り替えの実装(ユーザー選択を優先)
OS設定を尊重しつつも、ユーザーが好みのテーマを手動で切り替えられるとさらに親切です。data-theme 属性を持つ body 要素のスタイルを用意し、JavaScriptでトグルを実装します。
body[data-theme="dark"] {
background: #121212;
color: #ffffff;
}
body[data-theme="light"] {
background: #ffffff;
color: #000000;
}
const toggle = document.getElementById("theme-toggle");
toggle.addEventListener("click", () => {
document.body.dataset.theme =
document.body.dataset.theme === "dark" ? "light" : "dark";
});
ローカルストレージに選択したテーマを保存しておくと、ページ再訪問時にもユーザーの好みが維持されます。初期表示時には prefers-color-scheme でOS設定を確認し、保存されたテーマがあればそちらを優先する流れが一般的です。
3. 実践的なポイント
- コントラスト比を意識してアクセシビリティを確保: テキストと背景のコントラスト比はWCAGの推奨値(通常テキストで4.5:1以上)を満たすように調整しましょう。
- 画像やアイコンもダークモード用を用意: SVGなら
fillを切り替える、ビットマップならフィルターや別ファイルで対応するなど、ビジュアル要素全体で統一感を保ちます。 transitionを使って滑らかな切り替えを演出:colorやbackground-colorに短いトランジションを設定すると、テーマ変更時のちらつきを抑えられます。
まとめ
prefers-color-scheme で自動切り替えに対応しつつ、ユーザーが選択できるトグルを備えるのがベストプラクティスです。アクセシビリティやビジュアルの統一感を意識すれば、モダンで快適なユーザー体験を提供できます。