你有一个 logo、一张截图或一个 SVG 图标。把它丢进在线 favicon 转换器,得到一个装满图标的 ZIP 包。部署上线后,浏览器标签页却依然显示一个空白方块。转换本身没问题,问题出在实现环节。

这篇文章会讲清楚转换器实际做了什么、如何在不破坏图标体系的前提下使用它,以及常见的坑都藏在哪儿。

在线 favicon 转换器到底生成什么

好的转换器不只是缩放图片。它接收一张源图,输出一组文件,对应浏览器和操作系统所期望的各个图标位置。

典型输出包括:

如果转换器只给你一个 ICO 文件,那它没干完活。剩下的你得手动补。

上手:选对源文件

源图比转换器本身更重要。一张 200×200 的白底 JPG 只会生成模糊、带白框的图标。一张 1024×1024 的透明背景 PNG 才能让转换器干净地降采样。

矢量源方面,如果转换器支持,SVG 是最佳输入。SVG 可以缩放到任意输出尺寸而不产生插值伪影。如果你只有位图 logo,上传前先导出最大且最清晰的版本。

源图的三条规则:

  1. 正方形画布。 把 logo 填充到 1:1 比例。非正方形的输入会被拉伸或加黑边。
  2. 透明背景。 除非你特意想要一个实色方块,否则去掉背景。如果你手头只有一张平面 JPG,可以参考如何制作透明背景 favicon。
  3. 简洁的图形。 完整的文字商标在 16×16 下无法辨认。先提取符号或字母组合。

源图干净了,转换这一步就简单了。

关键功能要点

不是每个在线转换器都一样。差别在你下载 ZIP 之后才会显现。

多尺寸 ICO 输出

ICO 格式是一个容器,不是单张图片。合格的转换器会把 16、32、48 像素的帧打包进一个文件,这样 Windows 任务栏、浏览器标签页和书签栏各自选取合适的分辨率。单帧 ICO 会迫使浏览器降采样,边缘就会发虚。

Manifest 和 HTML 生成

转换器应该输出可直接粘贴的 <head> 块和 site.webmanifest。手写这些是大多数开发者引入拼写错误的地方。rel='icon' 的规范本身很短,但周边的标签(Apple Touch、maskable、theme-color)很容易写错。

深色模式感知

有些转换器现在会生成带 prefers-color-scheme 媒体查询的 SVG,浏览器处于深色模式时图标会自动反色。这是可选项,但如果你的图标是深色配浅色背景,就很有用。没有它,黑色图标会在深色标签栏里消失。

敏感 logo 不走服务器

如果你要转换的是未发布的品牌标识,先确认工具是在客户端处理图片还是上传到服务器。客户端转换能把源文件留在你自己的机器上。

打造干净图标体系的实用技巧

转换器把文件交给你之后,几个小习惯就能避免大部分 favicon 问题。

下面是转换器应该生成的最小 <head> 块,已按带版本号的文件名做了调整:

<link rel='icon' type='image/svg+xml' href='/favicon.svg?v=3'>
<link rel='icon' type='image/png' sizes='32x32' href='/favicon-32.png?v=3'>
<link rel='icon' type='image/png' sizes='16x16' href='/favicon-16.png?v=3'>
<link rel='apple-touch-icon' sizes='180x180' href='/apple-touch-icon.png?v=3'>
<link rel='manifest' href='/site.webmanifest'>

如果你的转换器输出的东西和这个差不多,那就没问题。如果只输出一行,你就得自己补齐。

什么时候不该用转换器

在线转换器适合一次性的图标集。但如果你需要每次部署都自动重新生成图标,或者源文件是频繁变动的实时设计 token,它就不合适了。

这些情况下,用构建步骤工具或在本地运行同样转换的脚本更可靠。输出结果完全一样,区别在于可复现性。

不过对于一次性项目,在线 favicon 转换器省掉了繁琐的部分——缩放、打包 ICO 容器、编写 manifest——留下真正需要人来做的事:选一个在 16 像素下依然清晰可辨的标识。