主要な概念
ダークモードでサイトをスタイルするためのバリアントの使用
ダークモードが多くのオペレーティングシステムの主要機能となった今、デフォルトのデザインに合わせてウェブサイトのダークバージョンを設計することがますます一般的になっています。
これをできるだけ簡単にするために、Tailwindにはdark
バリアントが含まれており、ダークモードが有効になっているときにサイトのスタイルを異なるように設定できます。
ライトモード
逆さまに書ける
ゼログラビティペンは、逆さまを含むあらゆる方向で書くことができます。宇宙空間でも使用できます。
ダークモード
逆さまに書ける
ゼログラビティペンは、逆さまを含むあらゆる方向で書くことができます。宇宙空間でも使用できます。
<div class="bg-white dark:bg-gray-800 rounded-lg px-6 py-8 ring shadow-xl ring-gray-900/5"> <div> <span class="inline-flex items-center justify-center rounded-md bg-indigo-500 p-2 shadow-lg"> <svg class="h-6 w-6 stroke-white" ...> <!-- ... --> </svg> </span> </div> <h3 class="text-gray-900 dark:text-white mt-5 text-base font-medium tracking-tight ">Writes upside-down</h3> <p class="text-gray-500 dark:text-gray-400 mt-2 text-sm "> The Zero Gravity Pen can be used to write in any orientation, including upside-down. It even works in outer space. </p></div>
デフォルトでは、これはprefers-color-scheme
CSSメディア機能を使用しますが、ダークバリアントをオーバーライドすることで、ダークモードの手動切り替えをサポートするサイトを構築することもできます。
ダークテーマをprefers-color-scheme
メディアクエリの代わりにCSSセレクターによって駆動したい場合は、dark
バリアントをオーバーライドしてカスタムセレクターを使用してください。
@import "tailwindcss";@custom-variant dark (&:where(.dark, .dark *));
これで、dark:*
ユーティリティはprefers-color-scheme
に基づいて適用される代わりに、HTMLツリーの前の方にdark
クラスが存在するたびに適用されるようになります。
<html class="dark"> <body> <div class="bg-white dark:bg-black"> <!-- ... --> </div> </body></html>
html
要素にdark
クラスをどのように追加するかはあなた次第ですが、一般的なアプローチは、class
属性を更新し、その設定をlocalStorage
のような場所に同期させるJavaScriptを使用することです。
ダークモードをアクティブにするためにクラスの代わりにデータ属性を使用するには、代わりに属性セレクターでdark
バリアントをオーバーライドするだけです。
@import "tailwindcss";@custom-variant dark (&:where([data-theme=dark], [data-theme=dark] *));
これで、ダークモードユーティリティは、data-theme
属性がツリーのどこかでdark
に設定されている場合に常に適用されるようになります。
<html data-theme="dark"> <body> <div class="bg-white dark:bg-black"> <!-- ... --> </div> </body></html>
ライトモード、ダークモード、およびシステムテーマをサポートする3方向のテーマ切り替えを構築するには、カスタムダークモードセレクターとwindow.matchMedia()
APIを使用して、システムテーマを検出し、必要に応じてhtml
要素を更新します。
ライトモード、ダークモード、そしてオペレーティングシステムの設定を尊重する方法の簡単な例を以下に示します。
// On page load or when changing themes, best to add inline in `head` to avoid FOUCdocument.documentElement.classList.toggle( "dark", localStorage.theme === "dark" || (!("theme" in localStorage) && window.matchMedia("(prefers-color-scheme: dark)").matches),);// Whenever the user explicitly chooses light modelocalStorage.theme = "light";// Whenever the user explicitly chooses dark modelocalStorage.theme = "dark";// Whenever the user explicitly chooses to respect the OS preferencelocalStorage.removeItem("theme");
繰り返しますが、これをどのように管理するかはあなた次第です。サーバー側のデータベースに設定を保存し、サーバーでクラスをレンダリングすることもできます。完全にあなた次第です。