かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

favicon をダークモード対応したい

webサイトやwebサービスでタブとかに表示される faviconfavicon もダークモード対応ができるらしいのでやってみたのメモ

faviconSVG にする

昔から .ico みたいなファイル作ってたけど、最近では SVG もサポートされているらしい。SVG は内部にスタイルシートを持てるのでダークモード用のメディアクエリを埋め込んでしまえばダークモード対応された favicon になるみたい。簡単だ…

HTML の <head> 内の favicon の指定を SVG にする

<link rel="icon" type="image/svg+xml" href="/favicon.svg">

type="image/svg+xml" で指定する

SVG 内にダークモード対応の CSS を追加する

ダークモード用のスタイルは prefers-color-scheme: dark というメディアクエリ内に記述すれば OK

<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<style>
.bg { fill: white; }
.icon { fill: #323333; }
@media (prefers-color-scheme: dark) {
  .bg { fill: #323333; }
  .icon { fill: white; }
}
</style>
<path class="bg" d="M15 16H1C0.45 16 0 … 15 16Z" fill="white"/>
<path class="icon" d="M5.92 11.67L5 … 65L6.92 7.09Z" fill="323333"/>
</svg>

これで Chrome でタブを開いた状態で dark mode / light mode を切り替えると favicon の色が切り替わるようになりました!
₍ ᐢ. ̫ .ᐢ ₎ やったね!!

Safarifavicon が表示されない問題

2022年9月時点で SafariSVG favicon がサポートされてないらしい… なんでや….
SVG favicons - Can I use
cf. SVG favicons | Can I use... Support tables for HTML5, CSS3, etc

pngfavicon を併記したら Safari でも favicon が表示された

<head>
  <link rel="icon" type="image/svg+xml" href="/favicon.svg">
  <link rel="icon" type="image/png" href="/favicon.png">
</head>

どうやら対応してない <link> は無視してくれるっぽい
Safari では favicon.png が表示され、Chrome では favicon.svg が表示された

.icofavicon を併記すると SVGfavicon が効かなくなる

.ico なファイルで favicon を指定していると SVG が表示されなくなった

<head>
  <link rel="icon" type="image/svg+xml" href="/favicon.svg">
  <link rel="icon" href="/favicon.ico">
</head>

どちらの指定を先にしても Chromefavicon.svg が無視され favicon.ico が表示されるようになってしまいました…

終えてみて

Chrome でダークモード対応した favicon を作るのは思った以上に簡単だった
Safari 対応が結構罠。Safari SVG favicons 対応してほしい…

モバイルでブックマークした際の apple-touch-icon, manifest.json に関しては今回スコープ外として省略しているので、モバイルブラウザでまだ罠がありそうな気もします…

おわり


[参考]