因为现代浏览器(chrome 90+、firefox 84+等)完全忽略sizes属性,不据此选图;真正起作用的是文件实际像素尺寸、type匹配性、声明顺序及manifest.json或media查询。

为什么写了 sizes 浏览器却没按尺寸加载图标
因为现代浏览器(Chrome 90+、Firefox 84+、Safari 15+、Edge 90+)根本**不读取 sizes 属性做匹配决策**。它既不报错,也不据此选图——只是静默忽略。规范里虽有定义,但实现层面全跳过。真正起作用的是:href 指向的文件**实际像素尺寸**(从文件头解析)、type 是否匹配、声明顺序、是否配合 media 或 manifest.json。写 sizes="32x32" 却放了个 64×64 的 PNG,浏览器照样当 64×64 解析,可能模糊显示。
sizes 在不同 type 下的行为差异
sizes 不是万能开关,它和 type 强绑定,且效果完全不同:
-
type="image/x-icon":对.ico文件,sizes完全无效——.ico 本身可打包多尺寸,浏览器自动提取最适配的一个 -
type="image/png":必须写sizes,且值必须是精确字符串如"16x16"、"192x192";写成"16×16"(中文×)、"16px"、"32"都会导致整条<link>被跳过 -
type="image/svg+xml":可写sizes="any",但 Safari 不支持 SVG 作为rel="icon"加载;Chrome/Firefox 支持,但仅限基础标签页,不用于 PWA 启动图或 iOS 主屏
多个 <link rel="icon"> 并存时浏览器怎么选
浏览器不是“挑最优”,而是“取第一个能加载成功的”——后续即使尺寸更合适也直接丢弃。所以顺序非常关键:
- 把兼容性最强的放最前:
<link rel="icon" href="/favicon.ico" type="image/x-icon"> - PNG 高清图标往后排,按尺寸从小到大或按使用优先级排:
<link rel="icon" href="/favicon-32x32.png" type="image/png" sizes="32x32"> - 千万别把
.ico放最后——旧版 IE、某些安卓 WebView 只认第一个rel="icon",后面全无视 - Android PWA 场景下,即使 HTML 里写了
sizes="512x512",若没在manifest.json的icons数组里声明,安装后启动图仍是灰色默认图
iOS 和 Android 主屏幕图标根本不看 rel="icon"
这是最容易被忽视的兼容断层:
- iOS/macOS 完全忽略所有
rel="icon",只查rel="apple-touch-icon",且必须显式声明sizes(如sizes="180x180"),不能靠一个文件撑全场 - Android Chrome 主屏幕图标优先从
manifest.json的icons数组取;若无 manifest,则 fallback 到 HTML 中rel="icon"且sizes="192x192"的那一条——但前提是type="image/png"且文件真实尺寸确实是 192×192 - Windows 磁贴需额外加
rel="msapplication-TileImage",和sizes无关
真正稳的做法,是放弃让浏览器“猜”尺寸,改用文件名明确标注物理尺寸(如 favicon-16x16.png)、每个尺寸单独声明一条 <link>、补全 apple-touch-icon 和 manifest.json,再保留 .ico 兜底。浏览器对图标的解析逻辑比文档写得保守得多,手动对齐才是唯一可靠路径。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











