Safariでダークモードを賢く使いこなす:CSS、JavaScript、Match Media API駆使のテクニック

2024-05-20

CSS、macOS、SafariでOSがダークモードかどうかを検出する方法

CSS prefers-color メディアクエリを使用して、ユーザーがシステム設定で предпочитает темную цветовую схемуを選択しているかどうかを検出できます。これは、最もシンプルで直感的な方法ですが、Safari 15.5以降でのみサポートされています。

@media (prefers-color: dark) {
  /* ダークモードのスタイル */
}

@media (prefers-color: light) {
  /* ライトモードのスタイル */
}

利点:

  • シンプルで直感的
  • 追加のライブラリ不要
  • Safari 15.5以降でのみサポート

JavaScriptとdocument.body.classListを使用する

document.body.classList プロパティを使用して、CSSクラスの存在を確認することで、OSがダークモードかどうかを検出できます。この方法は、すべての主要なブラウザで動作しますが、macOS 以外のオペレーティングシステムでは誤検知が発生する可能性があります。

const isDarkMode = document.body.classList.contains('dark-mode');

if (isDarkMode) {
  // ダークモードのスタイルを適用
} else {
  // ライトモードのスタイルを適用
}
  • ほとんどのブラウザで動作
  • macOS以外のオペレーティングシステムでは誤検知が発生する可能性がある

Match Media APIを使用して、prefers-color メディアクエリに変更を検出するリスナーを作成することで、OSがダークモードかどうかを検出できます。この方法は、すべての主要なブラウザで動作し、誤検知の可能性が低くなりますが、他の方法と比べて複雑です。

const prefersColorQuery = window.matchMedia('(prefers-color: dark)');

prefersColorQuery.addEventListener('change', (event) => {
  if (event.matches) {
    // ダークモードのスタイルを適用
  } else {
    // ライトモードのスタイルを適用
  }
});
  • すべての主要なブラウザで動作
  • 誤検知の可能性が低い
  • 他の方法と比べて複雑

最適な方法を選択する

使用する方法は、要件と優先順位によって異なります。

  • シンプルで直感的な方法が必要な場合: CSS prefers-color メディアクエリを使用します (ただし、Safari 15.5以降でのみサポート)。
  • すべての主要なブラウザで動作する必要がある場合: JavaScriptとdocument.body.classListを使用します (ただし、macOS以外のオペレーティングシステムでは誤検知が発生する可能性があります)。
  • 誤検知の可能性を低く抑え、すべての主要なブラウザで動作する必要がある場合: Match Media APIを使用します (ただし、他の方法と比べて複雑)。

その他の注意点

  • ユーザーがブラウザ設定でダークモードを無効にしても、OSがダークモードの場合は検出される可能性があります。
  • 一部のWebサイトは、独自のダークモード設定を提供している場合があります。



    CSS prefers-color メディアクエリを使用する

    body {
      transition: background-color 0.3s ease;
    }
    
    @media (prefers-color: dark) {
      body {
        background-color: #333;
        color: #fff;
      }
    }
    
    @media (prefers-color: light) {
      body {
        background-color: #fff;
        color: #333;
      }
    }
    

    このコードは、ユーザーがシステム設定でダークモードを選択している場合、背景色を黒(#333)、文字色を白(#fff)に設定します。ライトモードの場合は、背景色を白(#fff)、文字色を黒(#333)に設定します。

    const isDarkMode = document.body.classList.contains('dark-mode');
    
    if (isDarkMode) {
      // ダークモードのスタイルを適用
      document.body.style.backgroundColor = '#333';
      document.body.style.color = '#fff';
    } else {
      // ライトモードのスタイルを適用
      document.body.style.backgroundColor = '#fff';
      document.body.style.color = '#333';
    }
    

    このコードは、document.body.classList プロパティを使用して、CSSクラス dark-mode の存在を確認します。クラスが存在する場合、ダークモードのスタイルを適用します。存在しない場合は、ライトモードのスタイルを適用します。

    Match Media APIを使用する

    const prefersColorQuery = window.matchMedia('(prefers-color: dark)');
    
    prefersColorQuery.addEventListener('change', (event) => {
      if (event.matches) {
        // ダークモードのスタイルを適用
        document.body.style.backgroundColor = '#333';
        document.body.style.color = '#fff';
      } else {
        // ライトモードのスタイルを適用
        document.body.style.backgroundColor = '#fff';
        document.body.style.color = '#333';
      }
    });
    

    このコードは、Match Media APIを使用して、prefers-color メディアクエリに変更を検出するリスナーを作成します。リスナーが起動されると、event.matches プロパティを使用して、ユーザーがシステム設定でダークモードを選択しているかどうかを確認します。選択している場合は、ダークモードのスタイルを適用します。選択していない場合は、ライトモードのスタイルを適用します。

    注意事項

    • 上記のコードはあくまでサンプルであり、必要に応じて変更する必要があります。
    • WebサイトのスタイルシートやJavaScriptコードにこれらのコードを統合する必要があります。



    CSS、macOS、SafariでOSがダークモードかどうかを検出するその他の方法

    環境変数を使用する

    macOS Mojave以降では、WK_ 外観 環境変数が使用できます。この変数は、light または dark のいずれかに設定されます。

    const isDarkMode = process.env.WK_APPEARANCE === 'dark';
    
    if (isDarkMode) {
      // ダークモードのスタイルを適用
    } else {
      // ライトモードのスタイルを適用
    }
    
      • macOS Mojave以降でのみサポート
      • Webブラウザ以外で実行する場合に動作しない可能性があります

      ネイティブモジュールを使用する

      Electronなどのネイティブモジュールを使用して、オペレーティングシステムのダークモード設定にアクセスできます。これは、複雑なWebアプリケーションの場合に役立つ場合があります。

      • 高度な制御が可能
      • 設定が複雑

      OS固有のAPIを使用する

      macOSには、NSAppearanceCurrentEffectiveMode 関数など、OSがダークモードかどうかを検出するために使用できるOS固有のAPIがいくつかあります。これらのAPIは、Objective-CまたはSwiftで記述されています。

      • macOSで高精度な検出が可能
      • 開発が複雑
      • macOS Mojave以降でのみサポートされるシンプルな方法が必要な場合: 環境変数を使用します。
      • 複雑なWebアプリケーションで高精度な検出が必要な場合: ネイティブモジュールを使用します。
      • macOSで高精度な検出が必要な場合: OS固有のAPIを使用します。

          css macos safari


          知っておきたい絶対配置の代替案:グリッドレイアウトとフレックスボックス

          答え: 一概に「良い」か「悪い」とは言えません。状況によって適切な使い方が異なるためです。絶対配置とは?絶対配置は、要素を他の要素の相対的な位置ではなく、ページ上の固定された位置に配置するCSSプロパティです。絶対配置を使用する利点複雑なレイアウトを簡単に作成できる...


          クラス名変更、スタイルシート編集、アニメーションまで!JavaScriptでできるCSS操作のすべて

          styleプロパティを使うこれは最も基本的な方法です。要素のstyleプロパティに直接アクセスし、プロパティ名と値を指定することで、CSSの値を変更できます。この例では、#my-element要素のカラーを赤、フォントサイズを20pxに設定しています。...


          魅力的なサイトデザインを実現!CSSでSVGを疑似要素::beforeや::afterに活用する方法

          CSS疑似要素 ::before や ::after は、要素のコンテンツの前後にテキストや画像を追加することができます。従来、テキストや画像ファイルのみを使用できましたが、近年ではSVG画像も使用できるようになりました。メリット高度なデザイン表現: SVGはベクター画像形式なので、サイズ変更しても画質が劣化せず、複雑な形状やアニメーションも表現できます。...


          HTML、CSS、Flexboxで実現!要素の簡単中央揃え・左右揃え

          このチュートリアルでは、HTML、CSS、Flexbox を使って、Flexbox コンテナー内の要素を中央揃えと左右揃えにする方法を説明します。Flexbox は、Web ページのレイアウトを簡単かつ柔軟に作成するための強力なツールです。...


          Tailwind CSS フッターにニュースレターサインアップフォームを追加する

          方法 1: position: fixed を使用する最もシンプルな方法は、position: fixedプロパティを使用してフッターを固定することです。 以下の CSS コードを追加します。このコードは、フッターを常にブラウザウィンドウの下部に配置し、画面幅全体に広げます。...