近年、ダークモードの人気が高まり、ユーザーエクスペリエンスの向上や目の負担軽減のために、多くのウェブサイトやアプリがダークモードに対応しています。今回は、CSSでダークモードに対応する方法と、効率的な実装のコツについて解説します。

LINE着せかえ「回るお寿司」販売中!

CSS でダークモードに対応する方法

CSS でダークモードに対応する方法は、大きく分けて 2 つあります。

  • メディアクエリを使用する
  • light-dark()関数を使用する

メディアクエリを使用する

CSS でダークモードに対応する方法の一つは、@media (prefers-color-scheme: dark) {}というメディアクエリを使用する方法です。

@media (prefers-color-scheme: dark) {
  /* ここにダークモード用のスタイルを記述 */
}

@media (prefers-color-scheme: dark) {}は、ユーザーのシステム設定に基づいてスタイルを切り替えるためのメディアクエリで、ブラウザなどの設定でダークモードを選択している場合に、この中に記述した CSS が適用されるようになっています。

light-dark() 関数を使用する

もう一つは、light-dark()関数を使用する方法です。この関数を使うと、ライトモードとダークモードで、それぞれ別々の色を指定することができます。

light-dark(ライトモード時の色, ダークモード時の色);

light-dark()関数を有効にするには、color-schemelight darkという値を指定する必要があります。これは「このサイトではこのカラーのテーマを使用しますよ」という宣言のようなものです。このcolor-schemeは、通常は:root擬似クラスで設定します。

例として、light-dark()関数を使用して文字色と背景色をライトモードとダークモードで変更する場合は、以下のように記述します。

:root {
  /* light-dark() を使用するために必要な記述 */
  color-scheme: light dark;
}

body {
  color: light-dark(#222222, #EEEEEE);
  background: light-dark(#DFEEF9, #13222D);
}

light-dark() 関数を使用する際の注意点

light-dark()関数には、16 進値やrgb()などのカラー型の値しか指定できないことに注意が必要です。例えば、以下のようにlinear-gradient()などを指定した場合は無効になります。

:root {
  /* light-dark() を使用するために必要な記述 */
  color-scheme: light dark;
}

body {
  /* これは無効 */
  background: lignt-dark(linear-gradient(#FFF, #DDD), linear-gradient(#333, #555));
}

カラー型についての詳しい情報は、こちらをご参照ください。
<color> - CSS: カスケーディングスタイルシート | MDN

CSS でダークモード対応を実装する際のコツ

CSS変数(カスタムプロパティ)を活用する

ダークモード対応をする際、CSS 変数を使うことで効率的に実装を行うことができます。共通で使用する背景色やテキスト色などは CSS 変数で定義しておくことで、色の管理が一元化され、モードごとの調整が容易になります。

/* この :root 内に色の情報が集約される */
:root {
  color-scheme: light dark;
  --text-color: light-dark(#222, #eee);
  --body-bg-color: light-dark(#eef, #112);
  --content-bg-color: light-dark(#fff, #223);
}

body {
  color: var(--text-color); /* #222 or #eee */
  background: var(--body-bg-color); /* #eef or #112 */
}

.header {
  background: var(--content-bg-color); /* #fff or #223 */
}

.main {
  background: var(--content-bg-color); /* #fff or #223 */
}

.sidebar {
  background: var(--content-bg-color); /* #fff or #223 */
}

.footer {
  background: var(--content-bg-color); /* #fff or #223 */
}

See the Pen Untitled by YUTSUZO (@YUTSUZO) on CodePen.

CSS 変数(カスタムプロパティ)については、こちらの記事で詳しく解説しているので、よかったら参考にしてください。

透過を活用してライトモードとダークモードでスタイルを共用する

背景色やテキスト色を完全に切り替えるのではなく、透過を活用することで、共通のスタイルを維持しつつ両方のモードで違和感のない色味の表現が可能です。例えば、グレーアウトしたテキストや、淡い色の背景色などで効果的です。これにより、より少ない記述でダークモードへの対応が可能になります。

:root {
  color-scheme: light dark;
  --text-color: light-dark(#222, #eee);
  --body-bg-color: light-dark(#eef, #112);
  --content-bg-color: light-dark(#fff, #223);
}

body {
  color: var(--text-color); /* #222 or #eee */
  background: var(--body-bg-color); /* #eef or #112 */
}

.content {
  background: var(--content-bg-color); /* #fff or #223 */
}

/* グレーアウトしたテキスト */
.muted {
  color: rgb(from var(--text-color) r g b / 0.6);
}

/* 淡い色の背景色 */
.note {
  --item-color: #2080FF;
  border-left: solid 4px rgb(from var(--item-color) r g b / 0.3);
  background: rgb(from var(--item-color) r g b / 0.1);
}

See the Pen CSS Dark Mode Sample 02 by YUTSUZO (@YUTSUZO) on CodePen.

終わりに

ダークモード対応は、ユーザーの快適な閲覧体験を提供するために重要な要素です。@media (prefers-color-scheme: dark)light-dark() の活用に加え、CSS 変数や透明度を駆使することで、効率的で柔軟な実装が可能です。是非、この記事を参考にダークモード対応に挑戦してみてください!

参考