ダークモードの対応をする方法について調べたことをメモ。
ダークモードの切り替え設定
まずCSSの設定を試す前に、ダークモードの切り替え設定を確認してみます。
Windowsの場合、スタートメニュー > 設定 > 個人用設定 > 色 > モードを選ぶ から設定できます。
Macの場合はOSのバージョンによって異なるので、詳しくは公式サイトをご確認ください。
prefers-color-scheme
まずはprefers-color-schemeです。
prefers-color-schemeはメディア特性で、ユーザーがダークモードを設定しているかが判別できます。
対応ブラウザはこちらで、主要なブラウザで特に問題なくサポートされています。
使い方は以下の通りで、メディアクエリ内にダークモード時のスタイルを指定します。
body { color: black; background-color: white; } @media (prefers-color-scheme: dark) { body { color: white; background-color: black; } }
これでダークモードに切り替えると、背景が黒色で表示されました。
prefers-color-schemeのデモページ
以下のように変数(カスタムプロパティ)で管理しておくとよさそうです。
:root { --text-color-base: black; --bg-color-base: white; } @media (prefers-color-scheme: dark) { :root { --text-color-base: white; --bg-color-base: black; } } body { color: var(--text-color-base); background-color: var(--bg-color-base); }
light-dark()
次にlight-dark()です。
light-dark()は第一引数がライトモード時の色、第二引数がダークモードの色を取り、ユーザーの設定またはサイト側の設定に応じてどちらかの色を返します。
対応ブラウザはこちらで主要なブラウザでサポートされていますが、
chromeがバージョン123(2024年3月)、Safariがバージョン17.5(2024年5月)、Firefoxがバージョン120(2024年11月)と比較的最近サポートされたところなので、対応範囲によっては注意が必要そうです。
使い方としては色を設定する箇所でlight-dark()を使えばよいのですが、その際に合わせてcolor-schemeを設定しておく必要があります。
color-schemeはどのモードを使用するかを明示することができ、以下の場合はユーザーの設定に合わせたモードでの表示になります。
:root { color-scheme: light dark; } body { color: light-dark(black, white); background-color: light-dark(white, black); }
prefers-color-schemeの時と同様に、変数で管理しておくとよさそうです。
:root { color-scheme: light dark; --text-color-base: light-dark(black, white); --bg-color-base: light-dark(white, black); } body { color: var(--text-color-base); background-color: var(--bg-color-base); }
color-schemeはユーザーの設定を上書きできるので、以下のようにライトモードやダークモード用のclassを用意することもできます。
:root { color-scheme: light dark; --text-color-base: light-dark(black, white); --bg-color-base: light-dark(white, black); } body { color: var(--text-color-base); background-color: var(--bg-color-base); } body.is-light { color-scheme: light; } body.is-dark { color-scheme: dark; }
例として、ボタンクリックでモードの切り替えをできるようにしてみます。
<button id="change" type="button">切り替え</button>
ユーザーの設定はmatchMedia()を使って判別できます。
// ページアクセス時 const isDarkMode = window.matchMedia("(prefers-color-scheme: dark)").matches; if(isDarkMode) { document.body.classList.add('is-dark'); document.getElementById('change').innerText = 'ライトモードに切り替え'; } else { document.body.classList.add('is-light'); document.getElementById('change').innerText = 'ダークモードに切り替え'; } // 切り替えボタンクリック時 document.getElementById('change').addEventListener('click', function() { if(document.body.classList.contains('is-light')) { document.body.classList.remove('is-light'); document.body.classList.add('is-dark'); document.getElementById('change').innerText = 'ライトモードに切り替え'; } else { document.body.classList.remove('is-dark'); document.body.classList.add('is-light'); document.getElementById('change').innerText = 'ダークモードに切り替え'; } });
これでボタンクリックでライトモードとダークモードの切り替えができました。
light-dark()のデモページ3
コメントが承認されるまで時間がかかります。