Favicon 2026 完整规范:从 16×16 到 PWA Maskable、SVG 暗色自适应、缓存陷阱与跨浏览器兼容一篇讲完

· 约 5 分钟 🌐 Favicon 生成器

favicon 看似一张小图标,但 2026 年的现代站点至少要面对 6 种屏幕场景(浏览器标签栏 / Windows 任务栏 / iOS 主屏 / Android 主屏 / Android PWA 启动画面 / Play Store 列表大图),4 类规范(W3C Web App Manifest / Apple Human Interface Guidelines / Google Material Adaptive Icons / Microsoft Application Tiles),以及一个让人抓狂的浏览器缓存机制——很多团队上线半年才发现自己的 PWA 在 Android 上是个白色方块。这篇把每个场景要的文件、HTML 写法、暗色适配、缓存陷阱一次性讲清。

2026 年现代站点的 favicon 全套清单

按”最简 / 推荐 / 全套”三档:

档次文件HTML 行数用例
最简/favicon.ico0–1 行内部系统、个人 demo、原型站
推荐+ favicon.svg + apple-touch-icon.png3 行大多数对外公开的官网 / 博客
全套+ icon-192.png + icon-512.png + maskable-512.png + site.webmanifest5–6 行PWA、要上架 Play Store、需要 iOS / Android 桌面图标

直接把 favicon-generator 工具的 ZIP 解压到根目录就是”全套”,不想要哪个直接删文件 + 删对应 link 即可。

各家规范的差异速查

厂商 / 规范关键文件关键尺寸必有字段
浏览器通用(W3C / WHATWG)favicon.ico / favicon.svg16 / 32 / 48 / 任意矢量<link rel="icon">
Apple iOSapple-touch-icon.png180×180<link rel="apple-touch-icon">
Google Android Chromesite.webmanifesticons[]192 + 512,含 purpose: "any"purpose: "maskable"<link rel="manifest">
Google Play Store(PWA 上架)maskable-512.png512×512,主体在中央 60% 圆形内manifest 含 purpose: "maskable"
Microsoft Edge / Windows Tilebrowserconfig.xml(已过时)现代 Edge 跟 Chrome 同步,不需要再做

2026 年可以不做的:Safari pinned tab mask-icon(Safari 17 弃用)、apple-touch-icon-precomposed(iOS 7 后无效)、Microsoft Tile XML(IE / 老 Edge 时代产物)。这些过去文章里常被列入”全套”,2026 年砍掉对 SEO 和兼容性都没影响。

SVG favicon + 暗色模式:5 行搞定

写 SVG 时给主体加 class,嵌一段媒体查询:

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
  <style>
    .fg { fill: #111 }
    @media (prefers-color-scheme: dark) { .fg { fill: #fff } }
  </style>
  <path class="fg" d="M..."/>
</svg>

浏览器看 OS 主题自动切换 fill。注意

  • 只支持 Chrome 80+ / Firefox 105+ / Safari 16.4+(2023 年起);老浏览器看到的是 fill: #111 默认色,再不行就回落到 <link rel="icon" href="/favicon.ico">
  • SVG 里不要@import 加外部 CSS、不要引外部字体——浏览器加载 favicon 不会处理外部资源
  • Favicon 生成器透传原始 SVG,你写好的样式上线后保留

HTML <head> 的正确顺序

<link rel="icon" type="image/svg+xml" href="/favicon.svg?v=2026-05-26">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png?v=2026-05-26">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16.png?v=2026-05-26">
<link rel="icon" sizes="any" href="/favicon.ico?v=2026-05-26">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png?v=2026-05-26">
<link rel="manifest" href="/site.webmanifest?v=2026-05-26">

几个非典型坑

  1. rel="shortcut icon" 是 IE 时代写法,已废弃但不报错——2026 年新站直接写 rel="icon",不用再加 shortcut
  2. <link rel="icon" sizes="any"> 是给 ICO 这种容器格式用的,表示”内部有多种尺寸、浏览器自己挑”;写具体 sizes 没坏处但 any 更标准
  3. SVG 必须放第一行——浏览器按 link 出现顺序优先级选,第一个能解析的就用,把 SVG 放后面会被前面的 PNG 优先取
  4. apple-touch-icon 不写也行——iOS Safari 会自动请求 /apple-touch-icon.png,但写了更可控(特别是 CDN 部署时路径不在根目录)

“改了 favicon 浏览器不更新”完整诊断流程

1. 隐身窗口能看到新图吗?
   ├── 能 → 是你自己浏览器的本地缓存
   │       → 清浏览器缓存 / 给所有 link 加 ?v=xxx 防下次又卡
   └── 不能 ──┐

2. 直接 curl https://yoursite.com/favicon.ico 看响应
   ├── 拿到旧字节 → CDN / 反代缓存
   │       → 后台手动 purge /favicon.ico 和 /favicon.svg
   └── 拿到新字节 ──┐

3. 是不是文件名 / 路径错了?
   ├── 检查 <link href> 拼写、检查文件确实在根目录
   └── 检查 .ico / .svg / .webmanifest 的 MIME type
       (Nginx default_type 默认 octet-stream,favicon 必须显式配)

最容易忽略的是第 3 步的 MIME type

location ~* \.(ico)$ { add_header Content-Type "image/x-icon"; }
location ~* \.(svg)$ { add_header Content-Type "image/svg+xml"; }
location ~* \.(webmanifest)$ { add_header Content-Type "application/manifest+json"; }

manifest 配错 MIME 是 PWA 上架失败最高频原因,前端看着一切正常但 Lighthouse 直接红牌。

上线前 30 秒 checklist

  • favicon.ico / favicon.svg / apple-touch-icon.png / icon-192.png / icon-512.png / maskable-512.png / site.webmanifest 全在根目录
  • 所有 <link href>?v=日期 防缓存
  • manifest 的 name / short_name / theme_color / background_color 改成自己的,不是默认占位
  • SVG favicon 里写了 prefers-color-scheme: dark 暗色适配(如果站点支持暗色)
  • CDN 配好 .ico / .svg / .webmanifest 的 MIME type
  • Lighthouse PWA 审核全绿(特别看 “Provides a valid apple-touch-icon” 和 “Manifest has a maskable icon”)
  • 隐身窗口 + 手机 Safari + 手机 Chrome 三种环境各验证一次

Favicon 是网站给所有客户端(浏览器 / iOS / Android / Windows / 各家 IM 抓预览)的”封面图”——做对了一劳永逸,做错了一年后才发现各种隐性问题。一份 ZIP + 几行 link,半小时搞定 SEO 和品牌一致性。

❓ 常见问题

2026 年一个现代站点究竟要准备哪些图标文件?最简和"全套"分别是什么?

最简(个人博客 / 内部系统够用):(1) /favicon.ico —— 16/32/48 多尺寸合一,浏览器自动从根目录抓;(2) HTML 写一行 <link rel="icon" href="/favicon.ico"> 就行——大多数浏览器即使不写也会自己去根目录请求 /favicon.ico,所以最简到极致就是"一个 ico 文件丢根目录"。全套(要分享到社交平台、要做 PWA、要 iOS 加桌面):(a) favicon.ico(16/32/48)—— 浏览器标签栏、Windows 任务栏;(b) favicon.svg —— 现代浏览器优先,矢量 + 暗色自适应;(c) apple-touch-icon.png(180×180)—— iOS Safari "添加到主屏幕";(d) icon-192.png + icon-512.png —— Android PWA 桌面 + 启动画面;(e) maskable-512.png(20% safe zone)—— Android 自适应图标,Play Store 上架硬性要求;(f) site.webmanifest —— PWA 元数据,含 name / short_name / theme_color / background_color / icons[]还需要:Open Graph 图片(1200×630)走 og-preview 类工具单独做,不算 favicon 范畴。

PWA 上架 Google Play Store 时,maskable icon 跟普通 icon 究竟有什么区别?

Maskable 是为了 Android 自适应图标(Adaptive Icon,Android 8.0 引入)。系统会用一个统一形状(圆形 / 圆角方 / 水滴 / 心形等,由各厂商主题决定)去遮罩应用图标,所以图标内容必须缩到中央安全区里、背景必须非透明,否则边缘被裁掉就漏白边或漏出后面的桌面壁纸。Maskable 规格:(1) 画布 512×512;(2) safe zone 是中央直径 80% 的圆形区域(也就是 102.4px 的边距留白,对应 W3C 推荐"内容缩到 60% + 20% safe zone padding"的工程口径);(3) 背景必须填色——本工具透明输入时自动改用白底;(4) 在 site.webmanifesticons[]purpose: "maskable",可以跟普通 icon 用同一个 PNG 但 purpose 不同,也可以分两张。vs 普通 icon:普通 icon 是"完整图标整张显示",不会被裁;maskable 是"中央 60% 是真正的可见内容、外圈 20% 是安全裕量"——同一张图当 maskable 用会显得小,所以大多数情况是单独出一张专门给 maskable 的(主体放大 + 加纯色背景)。普通官网不上架 Play Store 不勾也行;要 PWA + 上架就必须勾。

SVG favicon 怎么写才能跟随浏览器暗色模式自动切换?老浏览器怎么回落?

SVG favicon 的暗色自适应靠在 SVG 内部嵌 CSS 媒体查询做法:在 SVG 源码里给主体元素加 class,然后用 @media (prefers-color-scheme: dark) 改 fill。例:``<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><style>.fg { fill: #111 } @media (prefers-color-scheme: dark) { .fg { fill: #fff } }</style><path class="fg" d="..."/></svg>`浏览器支持:Chrome 80+ / Edge 80+ / Firefox 41+(媒体查询从 Firefox 105+)/ Safari 9+(媒体查询从 Safari 16.4,2023 春);这些版本会看 OS 主题切换 favicon 颜色。老浏览器回落:HTML <head>同时写两行<link rel="icon" type="image/svg+xml" href="/favicon.svg"><link rel="icon" sizes="any" href="/favicon.ico">`——支持 SVG 的浏览器用第一行,不支持的(含 IE 全系列、老 Android stock 浏览器)自动回落到第二行 ICO。不需要 JS 判断,浏览器自己挑。实务建议:写 SVG 时主体颜色不要写死成黑 / 白,统一用变量 + 媒体查询;本工具透传 SVG 源码不修改,所以你 SVG 里写好的暗色样式上线后会保留。

HTML <head> 里 favicon 相关的 <link rel> 应该按什么顺序写?各种 rel 值有什么区别?

推荐顺序(从现代到老):``<link rel="icon" type="image/svg+xml" href="/favicon.svg"><link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png"><link rel="icon" type="image/png" sizes="16x16" href="/favicon-16.png"><link rel="icon" sizes="any" href="/favicon.ico"><link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"><link rel="manifest" href="/site.webmanifest">`各 rel 值含义:(1) rel="icon" —— 标准浏览器图标,浏览器按顺序挑第一个能用的;同 rel 多行时 type 和 sizes 帮浏览器决定用哪张。(2) rel="shortcut icon" —— 已废弃但仍兼容的 IE 时代老写法,等价于 rel="icon";现代站点写 rel="icon" 就行,不需要再加 shortcut icon。(3) rel="apple-touch-icon" —— iOS Safari 专用,"添加到主屏幕"时取这张;不写时 iOS 会自动找 /apple-touch-icon.png(根目录)兜底,但显式写更稳。(4) rel="apple-touch-icon-precomposed" —— iOS 6 之前用,告诉 iOS 不要给图标加圆角和高光特效;iOS 7+ 全部图标都"平面化",这个 rel 几乎无用,可以不写。(5) rel="mask-icon" —— Safari pinned tab(钉住的标签)专用,需要单色 SVG + color="#xxx" 属性;2024 年 Safari 17 已弃用,2026 年新站可以不写。(6) rel="manifest" —— PWA 配置清单,里面的 icons[]` 数组接管 Android / Chrome 的 PWA 安装场景,优先级高于单独的 link rel="icon"

改了 favicon.ico 推上线,浏览器还显示旧的——这到底是缓存哪一层,怎么强制全网更新?

favicon 是浏览器最激进缓存的资源之一,跟普通图片完全不在一个生命周期上——HTML / CSS / JS 改了一刷新就生效,favicon 通常 1–7 天才会自动更新。缓存层叠:(1) 浏览器磁盘缓存 —— 主要凶手,按 URL 永久缓存直到下次手动清;(2) 浏览器内存缓存 —— 短期;(3) CDN / 反代缓存 —— Cloudflare 默认 favicon.ico 缓存 4 小时(Edge)+ 1 个月(Browser),强 cache-control;(4) OS 级缓存 —— Windows 系统也会缓存任务栏 / 桌面快捷方式的 favicon,改了网站 favicon 还要在 Windows 资源管理器看到新图标,得清掉 %LocalAppData%\IconCache.db强制更新的正确姿势(按顺序生效快慢):(a) 改 URL(最有效) —— <link rel="icon" href="/favicon.ico?v=2026-05-26">,URL 变了缓存失效,访客下次访问立刻拿新图;每次发版改 ?v= 后缀即可。(b) 改文件名 —— 改成 favicon-v2.ico 再改 HTML 引用,比 query 参数更稳(部分 CDN 会忽略 query 参数)。(c) CDN purge —— Cloudflare / 阿里云 / 腾讯云后台手动 purge /favicon.ico/favicon.svg;如果用了 <link rel> 的 query 参数版本,purge /favicon.ico* 通配。(d) 设短 Cache-Control —— Nginx 给 favicon 加 Cache-Control: public, max-age=86400(1 天)而不是 30 天,平衡更新速度和命中率。自测:开隐身窗口看新版、清整个浏览器缓存再开普通窗口看是否同步——隐身能看到新的、普通看不到,就是浏览器缓存;两个都看不到,是 CDN / 服务端没更新。别做的:(x) 拼 Ctrl+Shift+R 硬刷新——只清当前页面,favicon 是按域名缓存的,刷再多次也不会换;(y) 删 cookies——和 favicon 无关。

🌐 打开 Favicon 生成器 一张图打包 favicon.ico + Apple Touch + Android 192/512 + PWA Maskable + manifest + HTML 片段