0Pricing
React Academy · レッスン

システムのカラースキームの検出

prefers-color-schemeでユーザーのOSのダークモード設定を読み取り、変更時にReactの状態を更新します

「システムのカラースキームの検出」はCoddyKit上の無料React Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。

prefers-color-scheme メディアクエリ

prefers-color-scheme CSS メディアクエリは、ユーザーがオペレーティングシステムでダークテーマとライトテーマのどちらを使用するよう設定しているかを検出します。dark と light の 2 つの値を受け取ります。この設定はブラウザではなく、システム設定で OS レベルに設定されます。

メディアクエリによる CSS ダークモード

@media (prefers-color-scheme: dark) { ... } を使用すると、CSS だけでダークスタイルを適用できます。このブロック内で色、背景、境界線をダークパレットに合わせて上書きします。この方法では JavaScript は不要で、React がマウントされる前でも機能します。

JavaScript の window.matchMedia

JavaScript では、window.matchMedia('(prefers-color-scheme: dark)') が MediaQueryList オブジェクトを返します。これを使うと、React フックやイベントハンドラー内で現在のシステム設定をプログラムから読み取れます。これは CSS メディアクエリと JavaScript のロジックをつなぐ橋渡しとなります。

初期値の読み取り

MediaQueryList オブジェクトには、boolean 値を返す matches プロパティがあります。matches が true ならシステムはダークモードで、false ならライトモードです。通常はマウント時に 1 回読み取り、テーマの状態を初期化します。

システム設定の変更を監視する

ユーザーはいつでも OS のカラースキームを変更できます。動的に対応するには、mediaQuery.addEventListener('change', handler) を呼び出します。handler は更新された MediaQueryListEvent を受け取ります。イベントオブジェクトには、新しい設定を反映した matches boolean も含まれます。

usePrefersDarkMode フックの構築

すっきりした方法は、useSyncExternalStore を使用してカスタムフックを構築することです。このフックは mediaQuery.addEventListener を購読し、mediaQuery.matches を返すスナップショット関数を提供します。これにより、手動で状態を管理しなくても、外部のブラウザ API とフックの状態を同期できます。

クリーンアップ時の購読解除

コンポーネントのマウントが解除されるときは、メモリリークを防ぐためにイベントリスナーを削除する必要があります。useEffect のクリーンアップで mediaQuery.removeEventListener('change', handler) を呼び出します。useSyncExternalStore を使用する場合、subscribe 関数は同じ処理を行う購読解除関数を返す必要があります。

システム設定とユーザーによる上書き

システム設定とは、OS が報告する設定のことです。しかしユーザーは、OS がダークモードでもアプリはライトモードにするなど、アプリのテーマを独立して上書きしたい場合があります。アーキテクチャでは、システムのデフォルト設定と、localStorage に保存する明示的なユーザー設定を区別する必要があります。

DevTools でカラースキームをエミュレートする

Chrome DevTools では、OS の設定を変更せずにカラースキームの設定をエミュレートできます。DevTools を開き、Rendering タブに移動して、「Emulate CSS media feature prefers-color-scheme」ドロップダウンを探します。開発中に両方のテーマをすばやくテストするうえで非常に役立ちます。

デフォルトでユーザー設定を尊重する

優れたダークモード実装では、システム設定をデフォルトの開始点として読み取り、すぐに適用します。これにより、ユーザーのアクセシビリティ設定を尊重できます。アプリでユーザーが明示的にテーマを切り替えた後にだけ、別の上書き設定を保存して使用します。

システム設定に関する SSR の考慮事項

サーバー上には window.matchMedia が存在しません。サーバーでレンダリングする場合は、matchMedia を呼び出す前に typeof window !== 'undefined' で確認します。SSR アプリでは、ハイドレーションの不一致を避けるため、代わりに Cookie または HTTP ヘッダーからユーザー設定を読み取ります。

matchMedia API の確認

MediaQueryList オブジェクトのどのプロパティで、メディアクエリが現在一致しているかどうかを確認できますか。

レッスンのまとめ:システムのカラースキームの検出

prefers-color-scheme メディアクエリを使用すると、CSS と JavaScript の両方で OS のカラープリファレンスを取得できます。window.matchMedia で設定の読み取りと変更の監視を行い、イベントリスナーは必ずクリーンアップします。また、システムのデフォルト設定とユーザーによる上書きを区別します。Chrome DevTools のエミュレーションを使うと、両方のテーマをすばやくテストできます。

よくある質問

「システムのカラースキームの検出」レッスンは無料ですか?

はい。「システムのカラースキームの検出」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。

「システムのカラースキームの検出」で何を学びますか?

prefers-color-schemeでユーザーのOSのダークモード設定を読み取り、変更時にReactの状態を更新します ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

React Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「システムのカラースキームの検出」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このReact Academyレッスンでコードを書いて実行できますか?

はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. システムのカラースキームの検出
  2. テーマ切り替えのためのCSS変数
  3. テーマ状態のためのReact Context
  4. テーマの永続化とフラッシュの防止
← React Academyに戻る