Menu

HTML Favicon:用 link rel=icon 添加网站图标

favicon 是浏览器标签页上的小图标。学习添加它的 link 标签、需要提供哪些文件和尺寸(ICO、SVG、PNG、apple-touch-icon)、如何制作 SVG 或 emoji 图标、如何用 JavaScript 修改它,以及为什么旧图标总是不消失。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

如何添加 favicon

把图标保存到网站上,然后在 <head> 中用 <link rel="icon"> 标签指向它:

<link rel="icon" href="/favicon.ico">

对于一个基础网站,这就是全部答案。href 可以指向 .ico、.png 或 .svg 文件。下面的示例把 SVG 作为 data URI 直接写进 href,所以不需要单独的文件。嵌在另一个页面里的预览无法修改你的浏览器标签页,所以脚本在一个模拟标签页里画出同一个图标,并显示三种尺寸:

在 16 像素下,只够放一个粗体字母或一个简单形状,细节都会消失。先按最小尺寸设计图标。把 fill='%232563eb' 改成别的颜色(%23 是 URL 编码后的 #),每个副本都会随之更新。

需要提供哪些文件

浏览器、手机和应用启动器会寻找不同的图标。下面这一小组文件就能全部覆盖:

<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">
<link rel="manifest" href="/manifest.webmanifest">
文件尺寸用途
favicon.ico32×32浏览器标签页,以及只会查找 /favicon.ico 的工具
icon.svg任意(矢量)在 Chrome、Edge 和 Firefox 中,让标签页图标在任何屏幕密度下都清晰
apple-touch-icon.png180×180有人把你的网站添加到 iPhone 或 iPad 主屏幕时显示的图标
manifest 图标192×192 和 512×512 PNGAndroid 主屏幕和已安装的 Web 应用

页面没有图标链接时,大多数浏览器也会自动向网站根目录请求 /favicon.ico,所以在那里放一个 favicon.ico 是很实用的默认做法。sizes 属性告诉浏览器每个文件的尺寸,让它挑选最合适的一个。请用 rel="icon";旧的 rel="shortcut icon" 之所以还能用,只是因为浏览器会忽略多出来的那个词。

emoji favicon

做原型或个人页面时,用 emoji 能快速做出一个 favicon。把它放进 SVG 的 <text> 元素里:

%F0%9F%8D%AA 是 URL 编码后的饼干 emoji。emoji 由操作系统的 emoji 字体绘制,所以在 Windows、macOS 和 Android 上看起来各不相同;对于正式产品,专门设计的图标是更好的选择。

跟随深色模式的图标

SVG favicon 可以自带 CSS,包括 prefers-color-scheme 媒体查询,所以浏览器使用深色主题时,深色图标可以变成浅色:

<!-- icon.svg -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
  <style>
    circle { fill: #111827; }
    @media (prefers-color-scheme: dark) { circle { fill: #f9fafb; } }
  </style>
  <circle cx="16" cy="16" r="14"/>
</svg>

用 JavaScript 修改 favicon

网站会用变化的 favicon 显示通知小红点或状态颜色。在 <canvas> 上画出新图标,再把链接的 href 设为画布图像:

在 Chrome 或 Firefox 的真实页面中,每次设置 href,标签页图标都会改变,时机和这里预览图片的变化完全一样。

常见错误

  • 路径错误。 href="favicon.ico" 是相对于当前页面的,所以在 /blog/post 上会失效。请用根路径:href="/favicon.ico"。
  • 以为更新会立即显示。 浏览器会牢牢缓存 favicon。替换图标后,清除缓存重新加载,或者修改 URL(/favicon.ico?v=2)。
  • 把细节丰富的标志缩小到 16 像素。 把它简化:一个字母或一个形状,对比要强烈。
  • 只提供 SVG。 同时保留 ICO 或 PNG,供不支持 SVG favicon 的浏览器使用,并为 iOS 加上 apple-touch-icon。
  • 把链接放在 <body> 里。 把它和 title 标签及其他元数据一起放在 <head> 中。

常见问题

HTML 中怎么添加 favicon?

把图标文件放到网站上,然后在 <head> 中加上 <link rel="icon" href="/favicon.ico">(也可以是 PNG 或 SVG 的路径)。浏览器就会在标签页、书签和历史记录中显示它。

favicon 应该是多大尺寸?

为标签页提供一个 32×32 的 favicon.ico(或 PNG),一个可以缩放到任意尺寸的 SVG,以及一个 180×180 的 PNG apple-touch-icon,用于 iPhone 主屏幕。带 manifest 的 Web 应用还要列出 192×192 和 512×512 的 PNG。

为什么我的 favicon 不显示?

常见原因是 href 中的路径写错、<link> 不在 <head> 里,或者浏览器还在显示缓存的旧图标。直接打开图标的 URL 检查路径,然后清除缓存重新加载,或者在 URL 后面加上版本号,例如 ?v=2。

可以用 SVG 或 PNG 作为 favicon 吗?

可以。使用 <link rel="icon" href="/icon.svg" type="image/svg+xml"> 或 <link rel="icon" href="/icon.png" type="image/png">。SVG 在 Chrome、Edge 和 Firefox 中有效;同时保留一个 ICO 或 PNG,供不支持 SVG 的浏览器使用。

需要写 rel="shortcut icon" 吗?

不需要。rel="icon" 才是标准写法。shortcut 这个词是旧版 Internet Explorer 的遗留物,在现代浏览器中没有任何作用。

可以用 emoji 作为 favicon 吗?

可以,把它包在 SVG 里即可:一个 SVG data URI,其中的 <text> 元素包含这个 emoji。做原型时很方便,但 emoji 在不同操作系统上看起来不一样。

Coddy 编程语言插图

和 Coddy 一起学编程

开始