根本原因是图源未适配设备像素比(dpr),须同时使用@2x/@3x图、复合媒体查询(-webkit-min-device-pixel-ratio与min-resolution并存)及显式background-size(如750px auto),三者缺一不可。

移动端背景图模糊,不是 background-size 写得不对,而是图源没匹配设备像素比(DPR)。换 @2x/@3x 图 + 正确 media query + 显式 background-size,三者缺一不可。
为什么只写 background-size: cover 还是糊
因为 cover 只控制缩放逻辑,不改变图源分辨率。1x 图在 iPhone 14(DPR=3)上被拉伸 3 倍渲染,浏览器用插值算法填充物理像素,结果就是毛边、发虚、文字边缘糊成一片。哪怕你设了 background-size: 750px auto,只要图还是 bg.jpg,照样糊。
- 常见错误现象:开发时在 Chrome 模拟器里看着清楚,真机 Safari 一打开就糊
- 根本原因:CSS 像素和物理像素不等价,
background-image不响应 DPR 变化 -
background-size必须配合高倍图使用才有意义;单设它等于给一张低清图“用力拉伸”
必须同时命中两个 media query 才能覆盖主流浏览器
只写 @media (min-resolution: 2dppx) 会漏掉 iOS 9–12 的 Safari;只写 @media (-webkit-min-device-pixel-ratio: 2) 在新版 Chrome/Firefox/Edge 中可能失效。必须用逗号分隔的复合条件:
.hero {
background-image: url('bg.jpg');
}
@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 2dppx) {
.hero {
background-image: url('bg@2x.jpg');
background-size: 750px auto; /* 显式声明,不能省 */
}
}
@media (-webkit-min-device-pixel-ratio: 3), (min-resolution: 3dppx) {
.hero {
background-image: url('bg@3x.jpg');
background-size: 1125px auto;
}
}
- 顺序不能颠倒:
1x规则必须放在最前,作为默认 fallback - 避免用
resolution: 192dpi这类单位——换算易错,部分 Android 浏览器不识别 - 三个文件名(
bg.jpg/bg@2x.jpg/bg@3x.jpg)路径、扩展名、大小写必须完全一致
background-size 的取值要匹配设计稿原始宽高
如果设计稿是 750px 宽,切图也按此基准出图,那么 background-size 就该设为具体像素值,而不是百分比或 cover:
-
background-size: 750px auto—— 推荐,等比缩放,关键内容不偏移 -
background-size: 100% 100%—— 仅限超大原图或 SVG,普通位图会强制拉伸失真 -
background-size: cover—— 和高倍图混用时风险高:裁剪点在不同 DPR 下计算不一致,容易切掉按钮或文案 - 别忘了加
background-position: center和background-repeat: no-repeat
上线后还是糊?先查这三件事
写了 media query、准备了 @2x 图,但真机访问仍是 bg.jpg,问题往往卡在构建或部署环节:
- Vite/Webpack 默认会过滤带
@的文件名(误判为 PostCSS 插件语法),需检查构建产物里是否存在bg@2x.jpg - 某些 CDN 或 Nginx 配置禁止
@符号,返回 404,但控制台不报错,只静默 fallback 到 1x 图 - 图片路径层级出错:比如 CSS 里写
url('../images/bg@2x.jpg'),但实际文件在assets/images/,导致加载失败
最稳的验证方式:在 Safari 真机调试中,右键「检查元素」→ 查看 computed 样式里的 background-image URL,确认加载的是哪张图。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











