シャープなSVGファビコンをアップロードしたのに、Safariで開くと小さくてぼやけたPNGが表示される——そんな経験はありませんか? その原因は、すべてのブラウザがまだSVGファビコンに対応しているわけではないからです。解決策は、SVGを優先しつつ、古いエンジン向けにPNGをフォールバックとして併用するハイブリッドなマークアップです。このガイドでは、正確なHTMLパターン、適切なファイルサイズ、そしてフォールバックが静かに失敗する落とし穴について詳しく解説します。
なぜSVGとPNGフォールバックなのか?
HTML Living Standardでは、異なるフォーマットを指す複数の<link rel='icon'>タグを宣言できます。WHATWG HTML仕様のrel='icon'によると、ブラウザはリストをスキャンし、認識できる最後のタグを選択します。この順序が鍵となります。つまり、SVGを最後に置くことでモダンブラウザがSVGを優先し、PNGを前に置くことでレガシーエンジンが適切にフォールバックします。
このパターンが重要なのは、一部のレンダラー(古いSafariビルド、アプリ内ウェブビュー、ニッチなモバイルブラウザなど)がSVGを完全に無視するためです。PNGが背後にないと、訪問者のタブは空白になってしまいます。
前提条件
- SVGファビコン1つ(理想的には2KB未満、正方形の
viewBoxを持つもの)。 - PNGフォールバック1つ以上:標準タブ用に32x32、狭いコンテキスト用に16x16。Apple Touch Iconを提供しない場合は180x180も追加。
- サイトの
<head>ブロックを編集できること。
クリーンなSVG書き出しが必要ですか? 基本はSVGファビコンデザインガイドをご覧ください。また、ファビコンパッケージジェネレーターを使えば、ワンクリックで完全なセットを出力でき、手作業を省けます。
ステップバイステップ:SVG + PNGスタックの構築
ステップ1:軽量なSVGを書き出す
アートワークを正方形のSVG(viewBox='0 0 100 100')として保存します。エディタのメタデータ、非表示レイヤー、埋め込まれたラスターフォールバックは削除してください。これらは目的を損ないます。1KBのSVGは、タブの鮮明さで15KBのPNGに勝ります。
ステップ2:PNGフォールバックを生成する
同じアートワークを32x32と16x16で書き出します。ロゴが透過を使用している場合、PNGが実際にアルファチャンネルを保持しているか確認してください。一部のエクスポーターは静かに平坦化します。favicon-32x32.pngおよびfavicon-16x16.pngとして保存します。
ステップ3:正しい順序でリンクタグを追加する
これらのタグを<head>内のpreconnectやpreloadヒントの前に配置します。順序が重要です:
<link rel='icon' type='image/png' sizes='32x32' href='/favicon-32x32.png'>
<link rel='icon' type='image/png' sizes='16x16' href='/favicon-16x16.png'>
<link rel='icon' type='image/svg+xml' href='/favicon.svg'>
ブラウザは上から下に反復処理し、サポートする最後の有効な一致を使用します。SVGを最後に置くことで、Chrome、Firefox、SafariはSVGを選択し、古いレンダラーはPNGで停止します。
ステップ4:真にレガシーなブラウザのためにICOを維持する
対象ユーザーにIE11や非常に古いEdgeビルドが含まれる場合は、先頭にICOを追加します:
<link rel='icon' type='image/x-icon' href='/favicon.ico'>
<link rel='icon' type='image/png' sizes='32x32' href='/favicon-32x32.png'>
<link rel='icon' type='image/svg+xml' href='/favicon.svg'>
モダンエンジンはICOを無視してSVGに直接スキップします。SVGやtypeタグ付きPNGを理解しないレガシーブラウザでも、何かは表示されます。
ステップ5:ダークモードバリアントを追加する(オプション)
SVGでは、media属性を使用してテーマごとに1ファイルを配信できます:
<link rel='icon' type='image/svg+xml' href='/favicon-light.svg' media='(prefers-color-scheme: light)'>
<link rel='icon' type='image/svg+xml' href='/favicon-dark.svg' media='(prefers-color-scheme: dark)'>
<link rel='icon' type='image/png' href='/favicon-32x32.png'>
末尾のPNGにより、テーマ認識がないブラウザでも空白の四角ではなく何かが表示されます。また、単一のSVG内に<style>ブロックを使用してprefers-color-schemeを直接埋め込むこともできます。これはより高度なアプローチですが、headマークアップを簡潔に保てます。
ステップ6:スタックを検証する
DevToolsを開き、Networkパネルを表示してリロードします。宣言したすべてのアイコンが一度リクエストされるはずです。PNGのみが読み込まれる場合、SVGパスが間違っているか、ファイルが有効なXMLではありません。SafariがPNGを無視する場合、サーバーが誤ったMIMEタイプで配信している可能性があります。自動検出に頼らず、サーバー設定でimage/pngを強制してください。Networkパネルでリクエストにカーソルを合わせると、配信されたMIMEを確認できます。
よくある落とし穴
- 順序の誤り。 SVGは最後でなければなりません。ブラウザは上から下にスキャンし、エンジンがサポートする最初のフォーマットで停止します。
type属性の欠落。type='image/svg+xml'がないと、一部のブラウザはファイルを一般的なリソースとして扱い、スキップします。- 白い背景のPNG。 ダークなブラウザテーマでは、白い四角のPNGが目立ちます。透過を使用するか、サイトの背景に合わせてください。
- キャッシュ。 デプロイ後、ブラウザは古いファビコンを数日間配信することがよくあります。PNGに
?v=2のようなバージョンクエリを追加して、更新を強制してください。 - XMLエラー。 ブラウザは解析エラーがあるSVGコンテンツを静かに無視します。デプロイ前にXMLバリデーターでファイルを検証してください。
- インラインウェブビュー。 一部の埋め込みウェブビューは
<link>タグを完全に無視し、ルートのリテラルな/favicon.icoのみを尊重します。
まとめ
SVG + PNGフォールバックパターンは実用的な妥協点です。サポートされている場所では鮮明でスケーラブルなアイコン、その他の場所では信頼性の高いラスターアイコンを提供します。3つのファイル、1つの<head>ブロック、JavaScriptは不要です。順序を正しくし、MIMEタイプを検証し、リリース前にChrome、Firefox、Safariでテストしてください。タブの表示が推測ゲームではなくなります。
ファイルを事前にビルドする必要がありますか? Mzu favicondlは、単一のアップロードから完全なSVG + マルチサイズPNG + ICOパッケージを書き出し、任意のプロジェクトにすぐにドロップできます。