UI/UXを向上させるダークモード実装テクニック

はじめに

こんにちは、だいせんせーです。
最近は当たり前のように「ダークモード」がついてるサイトが増えてきましたよね。
この宮崎クリエイターズブログにもダークモードが搭載されています。
正直、ちょっとカッコいいし、夜に見ると目にやさしいです。
そこで「自分のサイトでもサクッと導入できるんじゃ?」と思って、実装してみました。

ダークモードとは、アプリケーションやウェブサイトの背景色を暗色(主に黒や濃いグレー)に設定し、文字などの情報を明るい色で表示するユーザーインターフェース(UI)の配色スタイルのことです。
もともとは開発者向けのエディタやターミナルなどで採用されていた配色ですが、近年では目の疲労を軽減する効果や、バッテリー消費を抑えられるという理由から、一般ユーザー向けのサービスにも広く導入されるようになりました。

実際にやってみる

ここでは「実際にやってみたコツ」を中心にまとめます。

まずはCSSだけで

最初に試したのはこれです。
prefers-color-schemeを使って、OSの設定に従わせるやり方です。

@media (prefers-color-scheme: dark) {
  body {
    background: #0b0b0b;
    color: #f5f5f5;
  }
}

これを書くだけで、ユーザーがPCやスマホをダークモードにしていたら、自動でサイトもダークになります。一番お手軽な入口です。

2. 切り替えボタンをつける

でも「常にダークがいい人」もいれば「明るい方が好きな人」もいます。
なので切り替えスイッチをつけると親切です。
ボタンを押したらライトダークが切り替わって、その設定を保存する流れです。


  const key = 'theme';
  const root = document.documentElement;
  const saved = localStorage.getItem(key);
  // 初期テーマを決める
  if (saved) {
    root.dataset.theme = saved;
  } else {
    root.dataset.theme = matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
  }
  // クリックで切り替え
  document.getElementById('themeToggle').addEventListener('click', () => {
    root.dataset.theme = root.dataset.theme === 'dark' ? 'light' : 'dark';
    localStorage.setItem(key, root.dataset.theme);
  });

CSS側はこんな感じに「変数」で色を管理すると楽です。

:root[data-theme="light"] {
  --bg: #ffffff;
  --fg: #111111;
}
:root[data-theme="dark"] {
  --bg: #0b0b0b;
  --fg: #f5f5f5;
}
body {
  background: var(--bg);
  color: var(--fg);
}
beforeafter

PHPを使ってサーバーで初期化もできる

自分は普段PHPを書いているので、ついでにCookieを使った方法も試してみました。
ユーザーが選んだテーマをCookieに保存しておけば、ページを開いた瞬間からそのテーマで出せます。

<meta name="theme-color" content="#ffffff" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#0b0b0b" media="(prefers-color-scheme: dark)">

こうしておくと、ページ読み込み直後の「ライト→ダークに切り替わるチラつき」を防げます。ちょっとした工夫ですが、UXがぐっとよくなります。

4. 実装するときのちょっとしたTips

やってみて「これは気をつけたいな」と思ったポイントをまとめると…

1. コントラストはしっかり
暗い背景に薄い文字を置くと、思った以上に読みにくくなります。
特にグレー系の文字は要注意です。
WCAG AAくらいを意識すると安心です。

2. 画像・ロゴの扱い
白背景前提で作られたロゴは、ダーク背景では浮いて見えます。
SVGなら fill=”currentColor” を使うと、テーマに応じて色を変えられて便利です。
それが難しければ、ダーク用のロゴを別に用意して切り替えるのも手です。

3. モバイルの通知バーも忘れずに
スマホで見たとき、通知バー(ブラウザ上部の色)がライト用のままだと統一感が崩れます。以下のように<meta>を<head> に仕込んでおくと解決です。

<meta name="theme-color" content="#ffffff" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#0b0b0b" media="(prefers-color-scheme: dark)">

4. 切り替えアニメーションは控えめに
背景や文字色がスッと変わるくらいで十分です。
派手にアニメーションさせると逆に読みづらくなります。

有名サイトのダークモード事例

「実際どうやってるの?」と思って観察した例をいくつか紹介します。

X(旧Twitter)

  • デフォルトはOSに追従
  • 設定画面で「ライト / ダーク / 自動」から選べる
  • ダークにも「Dim(濃いグレー)」と「Lights Out(完全ブラック)」の2種類あり、細かいニーズに対応している。
beforeafter

GitHub

  • ログイン後の設定で「ライト / ダーク / システム」選択可能
  • ダークでもコントラストのバランスが秀逸で、コードブロックの可読性をしっかり確保
  • アイコンやロゴもテーマごとに最適化されていて参考になります
beforeafter

YouTube

  • OSに追従しつつ、メニューから個別に選べる
  • 背景は真っ黒ではなくダークグレーで、長時間見ても目が疲れにくい工夫
  • サムネイルや色付きUIとのコントラストが強調され、動画が映えます
beforeafter

Slack

  • 完全なカスタムテーマ機能もあり
  • 「ライト / ダーク」だけでなく、ユーザーが細かく色を設定できるのが特徴
  • 企業ブランドやチームカラーを取り込みやすいです

beforeafter

どのサービスも「単に背景を黒くした」ではなく、文字色・UI要素・ブランドカラーとの相性まで調整しています。
実装の時はこのあたりを参考にすると、より完成度が高いダークモードになるはずです。

まとめ

まずはCSSだけでも十分対応可能 → 最低限のダークモードは一瞬で導入できます。
トグル+保存でカスタマイズ性アップ → ユーザーが自分好みに選べるのは大きな利点です。
PHPと組み合わせると完成度が高める → 初期表示から自然にテーマを反映できます。
「思ったより簡単にできる!」というのが正直な感想です。

この記事を気に入ったら