ウェブサイトをダークモードに対応するときに気をつけること

少し前にこのブログをリニューアルして、一緒に「ダークモードの対応」も行いました。
1つのサイトレベルでダークモードを対応したのは初めてだったので、具体的な実装方法や気をつけたことをメモしておきます。
ダークモードの対応方法
メディアクエリのprefers-color-schemeを使えば、ダークモードやライトモード時のCSSを指定できます。
@media (prefers-color-scheme: dark){
ダークモード時のCSS
}
@media (prefers-color-scheme: light){
ライトモード時のCSS
}全ての記述をメディアクエリで分けると管理が大変になるので、CSS変数と組み合わせて、ダークモード時のみCSS変数内の色を変えるようにするのがベターです。
:root{
--c-primary: #0076b5;
--c-secondary: #17C2C7;
--c-background-base: #F7F9FB;
--c-background-primary: #FFF;
--c-background-secondary: #F0F2F5;
--c-text-base: #555;
--c-text-lighter: #676767;
--c-text-link: #0076b5;
}
@media (prefers-color-scheme: dark) {
:root{
--c-primary: #EBCB1A;
--c-secondary: #FF178D;
--c-background-base: #2B2B2B;
--c-background-primary: #313131;
--c-background-secondary: #242424;
--c-text-base: #EAEAEA;
--c-text-lighter: #B7B7B7;
--c-text-link: #0076b5;
}
}あとは色を設定するときはCSS変数を使うようにすれば、ダークモードに対応したサイトが作れます。
対応としてはこれだけなので、すでにCSS変数を使って管理しているサイトなどはかなりラクに対応できますね。
SCSSの変数に慣れている場合
自分の場合CSS変数よりSCSS変数の方に慣れていたので、色をラクに記述できるような関数を用意しました。
// color用のmap
$colors: (
primary: var(--c-primary),
secondary: var(--c-secondary),
bg_base: var(--c-background-base),
bg_primary: var(--c-background-primary),
bg_secondary: var(--c-background-secondary),
t_base: var(--c-text-base),
t_light: var(--c-text-lighter),
t_link: var(--c-text-link)
);
// color(変数名);で色を取得できるようにする
@function color($colorName) {
@return map-get($colors, $colorName);
}CSS変数だとvar(--c-primary)と入力する必要があり、まだ慣れていないのですが、これを使えばcolor(primary)で取得できます。
完全に好みの問題になりますが、マップに入れておけば下記でclassの生成もできるので、個人で使う分には何かと便利です。
@each $colorName, $color in $colors {
//.color_変数名 のclassを生成
.color_#{$colorName} {
color: $color;
}
//.bg_変数名 のclassを生成
.bg_#{$colorName} {
background: $color;
}
}この辺りはルールをきちんと決めておかないと後で面倒なことになりそうですし、複数人でコーディングをする場合はもっときちんとしたルールが必要そうです。
多少面倒でもCSS変数を使っておいた方が、Chrome開発者ツールから変数の確認もできますし、そろそろCSS変数をフル活用する方向で考えた方がいいかもしれません。
ダークモードのデザインで注意すること
コントラスト比
ダークモードに限りませんが、ライトモードとダークモードの2つのカラーパターンを作るとなると、コントラスト比に注意をしないと片方が基準を満たさない場合があります。
コントラスト比の計算方法はWCAG 2.0に載っています。
デザインを作るときはContrast Checkerというサービスを使えば、問題ないかどうか分かります。
使い方は簡単で、「FOREGROUND」に文字色、「BACKGROUND」に背景色の文字コードを入力するだけです。
装飾の問題
基本的に文字色を黒から白に、背景色を白から黒に変えればダークモード対応が済みそうだと思いがちですが、記事内の装飾を見ていくと、ただ反転させるだけではうまくいかないケースも出てきます。
特にシャドウなどにもCSS変数を使ってしまっていると、ダークモードにしたときにシャドウが白色になってしまいます。
このようにライトモードとダークモードで同じ色でもいい場合があるので、その場合は変数は使わず直接指定をすることもあります。



CSSだけで画像の比率を保ってトリミングできる「object-fit」
SourceTreeの外部Diff / MergeツールをKaleidoscopeに設定する
Visual Studio Codeでパス補完機能を細かく設定して自分好みにできる拡張機能「Path Autocomplete」
スライドを簡単に実装できるJavaScriptライブラリ「Swiper」
iTerm2でさらに細かい機能の設定ができる環境設定の「Advanced」タブ
Visual Studio CodeでCSVの編集を見やすく行う拡張機能「Edit csv」
CSSで1行で簡単にスムーススクロールを実装できる「scroll-behavior」プロパティ
Visual Studio Codeで対応する括弧に色を付けて見やすくする環境設定
Vue CLIでGA4を導入する方法
MacのKeynoteにハイライトされた状態でコードを貼り付ける方法
AirPodsで片耳を外しても再生が止まらないようにする方法
iTerm2でマウスやトラックパッドの操作を設定できる環境設定の「Pointer」タブ
DeepLで「インターネット接続に問題があります」と表示されて翻訳できないときに確認すること
Ulyssesの「第2のエディタ」表示を使って2つのシートを横並びに表示する
1Passwordの開発者向け機能(SSH Agent / Environments / 1Password CLI / Developer Watchtower)
Default Folder Xで保存ダイアログ内のファイルリストにフォーカスする方法
Obsidianで整理した知識をAnkiで定着させる方法
Figma × Keyboard Maestroでどこまで効率化できる?
マウス操作の完成度が高いウインドウリサイズアプリ「Magnet」
Macで複数ディスプレイを使っている場合に便利な設定集
AppCleanerでMacアプリを関連ファイルごと完全に削除する
操作に没頭できる!Firefox版 Arcのようなブラウザ「Zen Browser」
chezmoi(シェモア)で始めるdotfiles管理
GitHubの通知を見逃さない!通知に特化したアプリ「Gitify」