鮮明なSVGファビコンを本番環境にデプロイし、タブを更新すると、Chromeではシャープに表示されます。同じサイトをSafariで開くと、空のドキュメントアイコンが表示されます。原因はSVGではなく、背後に欠落したフォールバックチェーンがあることです。
ファビコンのフォールバック戦略とは、複数のアイコンファイルとHTML linkタグを階層的に組み合わせた仕組みです。これにより、すべてのブラウザ、タブ、デバイスで認識可能な画像が表示されるようになります。単一のフォーマットに依存せず、複数のアイコンをシーケンスとして提供します。ブラウザは最初の一致を試み、何かが機能するまでフォールバックし続けます。
ファビコンのフォールバック戦略とは?
これは、<head>内に配置された複数のアイコンフォーマットの意図的な順序と、それらのタグが参照するファイルの組み合わせです。各層は、よりシンプルなものでは対応できないギャップを埋めるために存在します。たとえば、古いブラウザはSVGをスキップし、レチナディスプレイのタブは16×16のPNGをぼやけさせ、モバイルのホーム画面はラスターのICOを拒否します。戦略とは、その失敗が起きる前に「もしこのファイルが失敗したら?」という問いに答えるものです。
ブラウザにフォールバックチェーンが必要な理由
単一のアイコンフォーマットがすべての表示面をカバーできるわけではありません。SVGはスケーラブルですが、すべてのレガシーブラウザがリクエストするわけではありません。PNGはほぼどこでも動作しますが、複数の解像度をバンドルできません。ICOはレガシーなコンテナフォーマットであり、ブラウザは依然として/favicon.icoに問い合わせを行います。そしてICOは、HTMLヒントなしにすべてのデスクトップブラウザが理解できる唯一のフォーマットです。
フォーマット以外にも、アイコンはさまざまな場所に表示されます。ブラウザタブ、ブックマークバー、ピン留めタブ、モバイルホーム画面、新規タブページのショートカット、Google検索の結果、PWAインストールダイアログなどです。各表示面には独自のサイズ要件、カラールール、ファイルフォーマットの好みがあります。戦略とは、これらすべてに対応するものであり、16×16のタブだけに対応するものではありません。
ブラウザの選択ロジック
HTML仕様は、<link rel='icon'>タグからアイコンを選択する方法を定義しています。ブラウザはリストを順に走査し、type、sizes、media属性に基づいて最適な一致を選択します。何も一致しない場合、WHATWG link relation specに記載されているレガシーな/favicon.icoリクエストにフォールバックします。
これに続く2つの実用的なルールがあります。
- 順序が重要です。最も機能豊富なファイル(SVG)を先頭に配置し、機能が劣るファイルを後に配置します。ブラウザはタグを順に処理し、無効なタグに遭遇した場合にのみ次へ進みます。
type属性はヒントであり、ゲートではありません。ブラウザがimage/svg+xmlを解析できない場合、諦めるのではなく次のアイコンをリクエストします。
レジリエントなスタックの構築
完全な戦略には通常4つの層が含まれます。それぞれが前の層では埋められないギャップをカバーします。
1. モダンブラウザ向け:SVG(オプションでダークモードのメディアクエリ付き)
SVGはレチナディスプレイで完璧にスケールし、ファイル内部でprefers-color-schemeメディアクエリをサポートします。<head>の先頭に配置することで、対応しているブラウザが即座にそれをピックアップします。
2. ユニバーサル:32×32および96×96のPNG
PNGはSVGを無視するブラウザのセーフティネットです。32×32(タブおよびブックマーク用)と96×96(高密度ディスプレイおよびGoogleが推奨する最小サイズ用)の両方を提供することで、ほとんどのデスクトップシナリオをカバーできます。サイジングの判断についての詳細は、Favicon Sizes Guideを参照してください。
3. レガシー:16、32、48をまとめたICO
多くのブラウザは依然として、linkタグの有無に関わらずサイトのルートから/favicon.icoを自動リクエストします。複数解像度をまとめたICOファイルは、この暗黙のリクエストを満たし、ログに記録されるであろうコンソールの404を回避します。フォーマットの詳細はICO file format guideで解説しています。
4. プラットフォーム固有:Apple Touch、マニフェスト、Safariピン留めタブ
iOSのホーム画面は透明度なしの180×180 PNGを望みます。Androidは192と512のマニフェストエントリを求めます。Safariのピン留めタブはモノクロのSVGを望みます。これらはフォールバックチェーンを置き換えるものではなく、拡張するものです。
最小限のHTMLパターン
<link rel='icon' href='/icon.svg' type='image/svg+xml'>
<link rel='icon' href='/icon-96.png' sizes='96x96' type='image/png'>
<link rel='icon' href='/icon-32.png' sizes='32x32' type='image/png'>
<link rel='icon' href='/favicon.ico' sizes='any'>
<link rel='apple-touch-icon' href='/apple-touch-icon.png'>
<link rel='mask-icon' href='/safari-pinned.svg' color='#000000'>
意図的な順序に注目してください。最初にSVG(モダンブラウザ)、次にPNG(ユニバーサル)、最後にICO(レガシーのキャッチオール)です。各タグは、前のタグが無視された場合でも優雅に劣化します。
よくある間違い
- ICOファイルを省略する。一部のブラウザはlinkタグの有無に関わらず
/favicon.icoに問い合わせを行います。 - 1つのPNGサイズしか提供しない。16×16のPNGはレチナタブでぼやけて見え、Googleが推奨する最小サイズを下回ります。
- 順序を逆にする。PNGをSVGの前に置くと、Chromeが喜んでSVGを使うはずなのに、ラスターファイルを強制的にロードさせてしまいます。
- キャッシュバスターを忘れる。古いブラウザはファビコンを積極的にキャッシュします。標準的なクエリ文字列のテクニックについては、favicon cache-busting guideを参照してください。
チェーンの検証
戦略は検証してこそ価値があります。DevToolsを開き、ネットワークパネルでimgでフィルタリングして、各ブラウザが実際に希望するファイルをリクエストしていることを確認します。Mzu favicondlのようなツールを使えば、デプロイされたサイトを調査し、検出されたすべてのアイコン(SVG、PNG、ICO、マニフェスト、Apple Touch)を一覧表示できます。これにより、ユーザーが気づく前に欠落した層を発見できます。
目標は、1つのブラウザで完璧に動作することではありません。すべてのブラウザで、すべての表示面で、毎回認識可能なアイコンが表示されることです。それが真のフォールバック戦略がもたらすものです。