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.