创建可适配主流浏览器的favicon集合

favicon

favicon的历史

Favicon 诞生于 1999 年微软发布的 Internet Explorer 5。最初,它是一个名为 favicon.ico 的文件,被简单地放置在网站的根目录下。浏览器识别 favicon 后,会将它显示在地址栏的左侧、收藏夹列表中以及标签页标题前,帮助用户快速识别不同的网站或网页。

随着 Web 技术的发展,为了解决传统 Favicon 的局限性,各种需要开发人员在 HTML <head> 中手动声明的图标标准层出不穷,导致网页头部代码变得越来越臃肿。不过此后,随着部分特定浏览器逐渐失去市场份额乃至淡出历史舞台,许多繁杂的专用标准也慢慢随之消失了。Andrey Sitnik 提出:2026年,对于 99% 的现代化网站,只需要准备 3 个文件就足够适配几乎所有的设备和场景了1

<link rel="icon" href="/favicon.ico" sizes="32x32">
<link rel="icon" href="/icon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="/apple-touch-icon.png"><!-- 180×180 -->

SVG favicon

SVG是一种基于XML的矢量图形格式。目前 SVG favicon 已经可以被2014年之后的 Firefox、2020年之后的 Chromium 内核浏览器、2025年之后的 Safari 浏览器支持2。相比传统位图 favicon,具有如下优点:

【节省带宽】作为矢量图形,浏览器只需解析极小的文本代码,就能将其完美无损地缩放到任意尺寸。这不仅显著节省带宽,也能完美适配任何像素密度的屏幕,避免了为高分屏提供小尺寸位图显示模糊、提供大尺寸位图拖慢载入速度的尴尬。

借助在线工具 SVGOMG 移除不重要的元数据、注释、隐藏元素,可以使 SVG 文件进一步变得更小、加载更快。

【动态样式】得益于内部支持嵌入原生 CSS 代码,SVG 可以动态调整图标的视觉细节。例如,通过改变描边粗细来模拟字体在不同视觉尺寸下的微调表现(Optical Size),或者直接读取系统的 prefers-color-scheme 状态,实现图标色彩在浅色与深色模式下的实时响应式切换

@media (prefers-color-scheme: light) { circle { fill: #666699; } }
@media (prefers-color-scheme: dark) { circle { fill: #ffffff; } }

【素材复用】得益于矢量图标可自由缩放的特性,SVG favicon 也可以作为通用的设计素材被复用到网页的UI设计中。

由于 Safari 不支持通过<img>标签引用 SVG 文件,通常的处理方式是改用<object>标签。

<object type="image/svg+xml" data="/favicon.svg"></object>

此时需特别注意,通过 <object> 标签引用的 SVG 文件与宿主网页整体对于 color-scheme 的声明必须匹配3。若网页声明支持亮暗主题切换,而 SVG 内部没有对应声明,在深色模式下,浏览器会将 SVG 内部原本透明的区域强行渲染为纯白或纯黑,产生大块牛皮癣式的色块 Bug。

<svg style="color-scheme: light dark;">
    <!-- 内部图形代码 -->
</svg>

桌面图标

当用户选择“添加到主屏幕”或安装 PWA(渐进式 Web 应用)时,图标需要脱离浏览器,在操作系统桌面上像一个原生 App 一样展示。

许多手机操作系统的启动器会强制统一桌面上所有图标的形状(如圆形、圆角矩形、水滴形等)。如果将传统的自由形状透明背景图标丢给桌面,系统可能将透明渲染成黑色,在暴力裁切时会剪掉部分主体,或者在周围垫上一圈难看的白色。

Android

PWA 是一种能让网页具备原生 App 般安装与离线使用体验的技术,其名称、图标等主要配置信息由放在网站根目录下的 webmanifest (manifest.json) 文件定义。Chrome 对 webmanifest 的特性支持最早最全。

图标尺寸

最初的规范要求提供 192x192 和 512x512 像素的两套高清 PNG。随着高分屏的发展,许多现代化网站开始提供更高解析度的 1024x1024 像素位图,导致单个图标的文件体积达到了数百 KB。可以在设计软件手动导出以上分辨率,也可以只导出最高分辨率,使用 RealFaviconGenerator 生成全尺寸图标包。

随着矢量图标支持的普及,一种更高效的选择是用一张仅几 KB 的 SVG 覆盖全部尺寸。在 Manifest 中声明 SVG 图标时,只需直接将其尺寸属性设为 "sizes": "any" 即可。

图标目的

在 webmanifest 中,可以为图标声明 purpose 属性,浏览器收藏夹与系统桌面图标的用途对应 anymaskable 两种不同的取值。

favicon 可遮罩图标 变色图标
背景 可透明 纯色 纯色或透明
边缘轮廓 可以不规则 填满正方形画布 填满正方形画布或透明
安全区 不需要 图标主体需位于直径为正方形边长80%的圆以内 图标主体需位于直径为正方形边长80%的圆以内
场景 收藏夹、标签栏、安装弹窗等 启动器、桌面 启动器、桌面
purpose any maskable monochrome

由于两者对于图标有不同的侧重要求,在配置 webmanifest 时,将单个图标同时标记为 "purpose": "any maskable" 是非常糟糕的体验。一种比较推荐的 Manifest 隔离声明:

"icons": [
    {
        "src": "/favicon.svg",
        "sizes": "any",
        "type": "image/svg+xml",
        "purpose": "any"
    },
    {
        "src": "/icon-maskable.svg",
        "sizes": "any",
        "type": "image/svg+xml",
        "purpose": "maskable"
    }
]

由于 purpose: anymaskable 对安全区域的要求截然不同(前者通常为主体撑满的“窄边距”,后者则需要为自适应裁切预留空间的“宽边距”),在实际工程中,我们通常有两种应对策略:一是在设计阶段就分别做好这两个版本的图标;二是仅导出一个窄边距大图,随后借助 maskable.app 等在线工具,将其一键缩放并填充背景,转化出适配遮罩的宽边距版本。

为了对接从 Android 13 开始引入的 Material You 的设计语言,webmanifest 也引入了由启动器控制染色的 monochrome purpose。通过 monochrome.fyi 在线工具,可以预览图标在 Material You 染色下的显示效果。

不过,受限于安卓定制系统的碎片化,许多浏览器并未完全适配 monochrome 的图标规范,即使在需要图标变色的场景仍会采用 maskable 规范来生成桌面图标。这里需要区分两组概念:

  1. monochromemaskable: · monochrome 图标支持跟随系统主题实时变色(类似自适应单色图标) · maskable 图标则不具备这一能力
  2. 桌面图标与 favicon: · 带媒体查询的响应式 SVG favicon 在浏览器标签页中可以随系统主题实时变色。 · 桌面图标则完全不同:即便你在 Manifest 中配置了带媒体查询的 SVG 图标,也仅会在用户点击“添加到主屏幕”时执行一次,之后便被永久固化。浅色模式下安装的图标永远锁定浅色样式,深色模式下安装的则永远锁定深色样式。

maskable purpose 的桌面图标,既无法像 monochrome 那样跟随主题实时变化,也无法像 favicon 那样在运行时重新评估媒体查询。遵循标准的系统,能适配就适配;无法适配的场景,去寻求标准之外的强行实现方法,是一件非常浪费精力的事,直接放弃就好。

iOS

声明方式

苹果在 iOS 生态早期便确立了专属的桌面图标获取方式,该语法严格只支持 PNG 位图格式

<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">

从 iOS 15.4 开始,苹果开始支持在桌面无 apple-touch-icon 标签时,自动读取 webmanifest 里的 icons 数组作为主屏幕图标。

但是,iOS 在读取 Manifest 时更倾向于选择 "purpose": "any" 的图标。该属性下通常是为 PC 端准备的透明背景图标,由于 iOS 主屏幕严禁透明像素,Safari 抓取后会自动用纯黑色填满透明区域,导致桌面图标出现突兀的黑边。

因此,即便在现代 iOS 环境下,仍强烈建议保留传统的 PNG 格式 apple-touch-icon 标签。这样可以在第一优先级直接满足 Safari 的图标嗅探,从根源上完美阻断因降级读取引发的黑边 Bug。

深色反转与液态玻璃效果

自 iOS 18 起,苹果推出了与 Android 类似的主屏幕图标智能适配功能,到了 iOS 26,系统更会自动施加一层液态玻璃 3D 光照和立体折射效果。

可惜 iOS 的 PWA 图标没有办法像原生 App 那样精细地分情况适配不同的图标外观。只能在设计阶段,保证图标是白底且界限分明的,没有添加阴影或羽化效果,PWA安装后就会被iOS自动抠图适配深色模式与染色模式,自动添加液态玻璃效果。当然,设计白底图标时,还是要同时考虑前景色与浅色、深色背景搭配的效果。

正在消失的Metro UI

在旧版 Windows 8.1 与 Windows 10 系统上,微软内置的 Edge Legacy 和 Internet Explorer 11 浏览器支持将网页作为磁贴固定到系统的开始屏幕上。虽然微软在 Win11 中摒弃了 Metro UI,但截止到2026年5月,Win10 仍然有20%多的遗留占有率4,继续适配磁贴也算是一种情怀了。

Win8.1 与 Win10 的 Metro 磁贴图标与背景色由放置在站点根目录的browserconfig.xml文件定义,这个文件不需要在网页head引用,因此不可使用其他名称。

<browserconfig>
    <msapplication>
        <tile>
            <square150x150logo src="/mstile-150x150.png"/>
            <TileColor>#da532c</TileColor>
        </tile>
    </msapplication>
</browserconfig>

另外,即使不建立browserconfig.xml,也可以在网页的 <head> 部分指定磁贴背景色,例如这段 <meta> 标签指定了磁贴的背景是灰色:

<meta name="msapplication-TileColor" content="#666699">