Tailwindでサイトにダークモードを追加する
  ダークモードは単なるトレンドではなく、ユーザーの期待となっています。しかし、多くの開発者がその実装を複雑にしすぎています。Tailwind CSSを使えば、わずか数行のコードとフレームワークへの依存なしで、サイトにダークモードを追加できます。
このチュートリアルでは、自動ダークモード(システム設定の尊重)と手動切り替えの両方をユーザー設定の永続化とともにカバーします。Tailwindの組み込みdarkバリアントを使用して、どちらのアプローチも数分で実装する方法を学べます。
重要なポイント
- Tailwindの
dark:バリアントは最小限の設定でダークモードを有効にします - システム駆動型ダークモードはJavaScriptなしで自動的に動作します
 - 手動切り替えによりユーザーが表示設定をコントロールできます
 - localStorageはページ読み込み時のテーマのちらつきを防ぎます
 
Tailwind CSSでのダークモードの仕組み
dark:バリアントの説明
Tailwind CSSはdark:バリアントを提供し、ダークモードがアクティブな時に条件付きでスタイルを適用します。任意のユーティリティクラスにdark:を前置するだけで、ダークモードでの外観を定義できます:
<div class="bg-white dark:bg-gray-900">
  <h1 class="text-gray-900 dark:text-white">Hello World</h1>
  <p class="text-gray-600 dark:text-gray-400">
    This text adapts to your theme preference
  </p>
</div>
デフォルトでは、Tailwindはユーザーのシステム設定を検出するためにprefers-color-scheme CSSメディアクエリを使用します。設定は不要で、そのまま動作します。
システム駆動型ダークモード(自動)
prefers-color-schemeの使用
最もシンプルなダークモード実装にはJavaScriptが一切不要です。ユーザーのオペレーティングシステムがダークモードに設定されている場合、Tailwindは自動的にダークモードユーティリティを適用します:
<!-- このカードはライトモードでは白、ダークモードでは濃いグレーになります -->
<article class="bg-white dark:bg-gray-800 rounded-lg p-6 shadow-lg">
  <h2 class="text-xl font-bold text-gray-900 dark:text-white">
    Automatic Dark Mode
  </h2>
  <p class="mt-2 text-gray-600 dark:text-gray-300">
    This component respects your system theme preference
  </p>
</article>
このアプローチは即座に動作しますが、1つの制限があります:ユーザーがあなたのサイト専用でシステム設定を上書きできません。
Discover how at OpenReplay.com.
手動ダークモード切り替え
クラスベースの実装
ユーザーにコントロールを与えるには、親要素の.darkクラスを使用するようにTailwindを設定します。Tailwind CSS v3.4以降では、CSSに以下を追加します:
@import "tailwindcss";
/* For Tailwind CSS v4+ */
@custom-variant dark (&:where(.dark, .dark *));
Tailwindの以前のバージョン(v3.x)では、tailwind.config.jsで設定します:
module.exports = {
  darkMode: 'class',
  // ... rest of your config
}
これで、親要素にdarkクラスが存在する場合にダークモードがアクティブになります:
<html class="dark">
  <body>
    <div class="bg-white dark:bg-black">
      <!-- Dark mode is active -->
    </div>
  </body>
</html>
このJavaScriptでダークモードを切り替えます:
// Toggle dark mode
document.documentElement.classList.toggle('dark');
データ属性メソッド
一部の開発者はテーマ管理にデータ属性を好みます。data-themeを使用するようにTailwindを設定します:
@import "tailwindcss";
/* For Tailwind CSS v4+ */
@custom-variant dark (&:where([data-theme="dark"], [data-theme="dark"] *));
その後、属性を通してダークモードをコントロールします:
<html data-theme="dark">
  <body>
    <div class="bg-white dark:bg-black">
      <!-- Dark mode active when data-theme="dark" -->
    </div>
  </body>
</html>
ユーザー設定の永続化
localStorage実装
ユーザーはテーマの選択が持続することを期待します。システムデフォルトを尊重しながら設定を記憶する完全なソリューションは以下の通りです:
// Check for saved preference or default to system preference
function getThemePreference() {
  const savedTheme = localStorage.getItem('theme');
  if (savedTheme) {
    return savedTheme;
  }
  return window.matchMedia('(prefers-color-scheme: dark)').matches 
    ? 'dark' 
    : 'light';
}
// Apply theme on load
function applyTheme(theme) {
  if (theme === 'dark') {
    document.documentElement.classList.add('dark');
  } else {
    document.documentElement.classList.remove('dark');
  }
}
// Initialize theme
applyTheme(getThemePreference());
// Theme toggle function
function toggleTheme() {
  const currentTheme = document.documentElement.classList.contains('dark') 
    ? 'dark' 
    : 'light';
  const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
  
  applyTheme(newTheme);
  localStorage.setItem('theme', newTheme);
}
ページ読み込み時の間違ったテーマのちらつきを防ぐには、<head>にこのインラインスクリプトを追加します:
<script>
  // Prevent FOUC (Flash of Unstyled Content)
  if (localStorage.theme === 'dark' || 
      (!localStorage.theme && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
    document.documentElement.classList.add('dark');
  }
</script>
Tailwindでのダークモードのベストプラクティス
パフォーマンス: レイアウトシフトを防ぐため、テーマ検出スクリプトを<head>に配置します。上記のインラインスクリプトはページレンダリング前に実行されます。
アクセシビリティ: 両方のテーマで十分な色のコントラストを確保します。ダークモードは単に色を反転させるだけではありません。適切なコントラスト比で読みやすさを維持します(WCAG AA標準では通常のテキストに4.5:1を推奨)。
テスト: 開発中は常に両方のテーマをテストします。ブラウザのDevToolsを使用して、システム設定を変更せずにprefers-color-schemeを素早く切り替えます。
色の一貫性: Tailwindのカラーパレットを体系的に使用します。例えば、ライト背景にgray-100を使用する場合、ダークモードの同等品としてgray-800またはgray-900を検討します。
まとめ
Tailwind CSSでダークモードを実装するには最小限のコードと外部依存関係が不要です。システム駆動型または手動切り替えのどちらを選択しても、darkバリアントによりテーマ対応のスタイリングが簡単になります。シンプルさのために自動ダークモードから始めて、ユーザーが表示体験をより詳細にコントロールする必要がある場合に手動コントロールを追加しましょう。
FAQ
はい、ライト、ダーク、システムオプションを提供する3方向切り替えを実装できます。ユーザーの選択をlocalStorageに保存し、システムモードを選択したかどうかを確認してOS設定を尊重します。
簡単な調整にはCSSフィルターを使用するか、代替画像ソースを提供します。アイコンについては、SVGでcurrentColorを使用してテキスト色を継承するか、Tailwindユーティリティで不透明度調整を適用することを検討してください。
もちろんです。darkバリアントは、設定で定義されたカスタムカラーを含む任意のTailwindユーティリティで動作します。ダークモードで条件付きに適用するには、任意のクラスにdark:を前置するだけです。
最小限です。darkバリアントはCSSルールのみを追加し、JavaScriptのオーバーヘッドはありません。主な考慮事項は、ドキュメントヘッドの早い段階でテーマ検出スクリプトを読み込むことで、スタイル未適用コンテンツのちらつきを防ぐことです。
Gain Debugging Superpowers
Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers. Check our GitHub repo and join the thousands of developers in our community.