ico是支持多尺寸、多色深图像的容器格式,可内嵌16×16至256×256等图层供系统自动选取;png则为单尺寸单文件,需严格匹配type与sizes属性才能加载。

ICO 文件必须内含多图层,PNG 是单尺寸单文件
ICO 不是“一张图”,而是一个容器格式,可打包多个尺寸(如 16×16、32×32、48×48、256×256)和色深的位图。Windows 任务栏、旧版 IE、部分桌面环境只认 ICO 里的对应图层——比如没塞进 48×48,任务栏图标就模糊或 fallback;没塞 256×256,高分屏下可能拉伸。PNG 则严格一对一:一个 favicon-32x32.png 文件只含 32×32 像素,声明 sizes="32x32" 就只能用于匹配该尺寸场景。
PNG 必须写 type 和 sizes,ICO 可省略 sizes 但 type 不可少
现代浏览器(Chrome 90+、Firefox 84+、Edge 90+)对 rel="icon" 的校验非常严格:
-
type="image/x-icon"是 ICO 的硬性要求,漏掉就静默忽略 -
type="image/png"+sizes="32x32"必须同时存在且精确匹配——sizes="32x32"不能写成"32×32"(中文乘号)、"32px"或"32" -
sizes对 ICO 完全无效,浏览器自动提取内嵌图层;但对 PNG 是加载前提,不写或写错直接跳过整条<link>
跨平台适配能力完全不同
不同系统/上下文依赖的格式和尺寸差异极大,不能靠“一种格式打天下”:
- Windows 任务栏:只读
favicon.ico中的 48×48 和 256×256 图层,无视 PNG 的sizes - macOS Dock:优先找
type="image/png"+sizes="32x32"和"128x128",漏type就退到 ICO 里找(如果存在) - Android PWA 安装图标:完全不看
<link rel="icon">,只读manifest.json中icons数组的"192x192"和"512x512"PNG - iOS 主屏幕:只认
rel="apple-touch-icon",且需sizes="180x180"等固定尺寸 PNG
缓存与调试陷阱最常卡在这三处
图标不显示,90% 不是代码写错,而是被底层机制拦住:
- 浏览器对 favicon 强缓存(
max-age=31536000),改了 HTML 也看不到效果——必须清“网站数据”或用隐身窗口验证 - 本地开发用
file://协议时,Chrome 直接禁用 favicon 加载,必须起 HTTP 服务(如npx serve) - 服务器返回 200 但
Content-Type错了:.ico 必须是image/x-icon,.png 必须是image/png;Nginx/Apache 若未配置 MIME 类型,就静默失败
favicon.ico 仍是兜底关键——它不挑浏览器、不依赖 sizes、能覆盖 Windows/macOS/书签等基础场景;而 PNG 是为高清屏和特定上下文补位,不是替代。两者不是二选一,是分工协作。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











