【Tailwind和訳】CORE CONCEPTS/Dark Mode
この記事について
この記事は、CORE CONCEPTS/Dark Modeの記事を和訳したものです。
記事内で使用する画像は、公式ドキュメント内の画像を引用して使用させていただいております。
ダークモード
Tailwind CSS を使用して、ダークモードでサイトのスタイルを設定します。
ダークモードは多くのオペレーティングシステムのファーストクラスの機能であるため、デフォルトのデザインに合わせてダークバージョンのウェブサイトをデザインすることがますます一般的になっています。
これをできるだけ簡単にするために、Tailwind には、ダークモードが有効になっているときにサイトのスタイルを変えることができるdark
バリアントが含まれています。
<div class="bg-white dark:bg-gray-800">
<h1 class="text-gray-900 dark:text-white">Dark mode is here!</h1>
<p class="text-gray-600 dark:text-gray-300">Lorem ipsum...</p>
</div>
ファイルサイズを考慮しているため、ダークモードバリアントはデフォルトで Tailwind で有効になっていないことに注意してください。
これを有効にするには、tailwind.config.js
ファイルのdarkMode
オプションをmedia
に設定します。
module.exports = {
darkMode: 'media',
// ...
}
これで、ユーザーのオペレーティングシステムでダークモードが有効になっている場合は常に、dark:{class}
クラスがプレフィックスなしのクラスよりも優先されます。media
戦略では、内部でprefers-color-scheme
メディア機能を使用しますが、ダークモードの手動切り替えをサポートする場合は、クラス」戦略を使用してより詳細に制御することもできます。
デフォルトでは、darkMode
が有効になっている場合、dark
バリアントは、テキストの色、背景色、境界線の色、グラデーション、プレースホルダーの色など、色に関連するクラスに対してのみ生成されます。
他のバリアントとのスタッキング
dark
バリアントは、responsiveバリアントとstate variants(ホバーやフォーカスなど)の両方と組み合わせることができます。
<button class="lg:dark:hover:bg-white ...">
<!-- ... -->
</button>
これが機能するためには、レスポンシブバリアントが最初に来て、次にdark
になり、次に状態バリアントが来る必要があります。
他のユーティリティを有効にする
他のユーティリティでdark
バリアントを有効にするには、有効にするユーティリティのバリアントリストにdark
を追加します。
module.exports = {
// ...
variants: {
extend: {
textOpacity: ['dark']
}
}
}
デフォルトでは、dark
バリアントは、backgroundColor
、borderColor
、gradientColorStops
、placeholderColor
、およびtextColor
に対して有効になっています。
ダークモードを手動で切り替える
オペレーティングシステムの設定に依存するのではなく、手動でダークモードを切り替えることをサポートする場合は、media
戦略の代わりにclass
戦略を使用します。
module.exports = {
darkMode: 'class',
// ...
}
現在、prefers-color-scheme
に基づいて適用されるdark:{class}
クラスの代わりに、HTML ツリーの前半にdark
クラスが存在する場合は常に適用されます。
<!-- ダークモードが有効になっていません -->
<html>
<body>
<!-- 白くなります -->
<div class="bg-white dark:bg-black">
<!-- ... -->
</div>
</body>
</html>
<!-- ダークモードが有効 -->
<html class="dark">
<body>
<!-- 黒くなります -->
<div class="bg-white dark:bg-black">
<!-- ... -->
</div>
</body>
</html>
dark
クラスをhtml
要素に追加する方法はあなた次第ですが、一般的なアプローチは、どこか(localStorage
など)から設定を読み取り、それに応じて DOM を更新する JS を使用することです。
ライトモード、ダークモードをサポートし、オペレーティングシステムの設定を尊重する方法の簡単な例を次に示します。
// ページの読み込み時またはテーマを変更するときは、FOUCを回避するために `head`にインラインを追加するのが最適です
if (
localStorage.theme === "dark" ||
(!("theme" in localStorage) && window.matchMedia("(prefers-color-scheme: dark)").matches)
) {
document.documentElement.classList.add("dark")
} else {
document.documentElement.classList.remove("dark")
}
// ユーザーが明示的にライトモードを選択するときはいつでも
localStorage.theme = "light"
// ユーザーが明示的にダークモードを選択したときはいつでも
localStorage.theme = "dark"
// ユーザーがOSの設定を尊重することを明示的に選択したときはいつでも
localStorage.removeItem("theme")
繰り返しになりますが、これを好きなように管理できます。サーバー側の設定をデータベースに保存し、サーバー上でクラスをレンダリングすることもできます。これは完全にあなた次第です。
特異性に関する考慮事項
class
戦略を使用する場合、セレクターに追加のクラスが含まれるため、ダークモードユーティリティの特異性は通常のユーティリティよりも高くなります。これは、特定の状況では、ユーティリティのいくつかの組み合わせの動作が、media
モードの場合とclass
モードの場合でわずかに異なる可能性があることを意味します。
たとえば、次の HTML について考えてみます。
<div class="text-black text-opacity-50 dark:text-white">
<!-- ... -->
</div>
media
戦略を使用する場合、dark:text-white
はtext-black
およびtext-opacity-50
と同じ特異性を持ちます。text-opacity-50
は、生成された CSS でdark:text-white
よりも後で定義されるため、白いテキストの不透明度は 50%になります。
class
戦略を使用する場合、dark:text-white
の特異性が高いため、より早く定義されても、実際にはtext-opacity-50
をオーバーライドし、不透明度を 1 にリセットします。したがって、class
ストラテジーを使用する場合は、ダークモードで不透明度を再指定する必要があります。
<div class="text-black text-opacity-50 dark:text-white dark:text-opacity-50">
<!-- ... -->
</div>
Discussion