不能。@include retina() 仅在编译时静态生成媒体查询,不感知运行时dpr,也不自动加载图片;必须确保@2x/@3x文件真实存在、路径正确、命名规范,且显式设置background-size和background-position等属性。

SCSS中用 @include retina() 生成多分辨率媒体查询是否真能自动适配?
不能。@include retina() 只是在编译时静态输出几组 @media 规则,它不感知运行时设备像素比(dpr),也不加载图片——真正起效的是浏览器根据媒体查询匹配后应用的 CSS 规则。如果你没提供 image@2x.png 文件,或者路径拼错,生成的媒体查询就是空转。
常见错误现象:background-image 在 Retina 屏下仍是模糊的,检查开发者工具发现高分查询被命中,但请求返回 404;或虽有图但尺寸没设对,导致拉伸变形。
- 必须确保高分图文件真实存在,且命名严格遵循
xxx@2x.png/xxx@3x.png规范(除非你手动传入完整路径) -
retina()的第三个参数(如cover)只控制background-size,不会自动加background-position: center,得自己补 - 如果项目用 Webpack/Vite,注意静态资源路径是否经 loader 处理过——
@include retina("img/logo.png")编译后路径可能和实际部署路径不一致
@include retina() 的参数顺序和默认行为容易踩哪些坑?
不同版本的 _retina.scss 参数顺序不统一:有的是 ($path, $ratio, $size, $position),有的把 $size 放第三位但默认值是 auto,结果编译出来没设 background-size,图就平铺或拉伸。
实操建议:
- 始终显式传入
cover或contain,别依赖默认值 - 若需居中裁剪,额外写
background-position: center—— mixin 不会帮你加 - 传入
$ratio: 2时,它只生成@2x查询;传3才会同时输出@2x和@3x媒体查询(取决于具体实现) - 避免混用
retina-bg()和retina():前者常是简化版,可能漏掉no-repeat或background-origin
为什么直接写 image-set() 比用 retina() mixin 更可控?
image-set() 是 CSS 原生能力,浏览器运行时按 dpr 动态选源,无需预生成媒体查询,也不依赖文件命名规则。而 retina() mixin 输出的是静态 CSS,一旦编译完成就固定了。
适用场景对比:
- 用
image-set():适合现代项目(Safari 15.4+/Chrome 89+),尤其当图源路径复杂、或需支持非标准命名(如logo-2x.webp)时 - 用
retina()mixin:适合需兼容老浏览器(如 IE11)、或构建流程不允许运行时 JS 干预的纯静态站点 - 注意:
image-set()中的1x/2x是密度描述符,不是文件名,所以url("logo.png") 1x完全合法
示例(直接写 CSS,不走 mixin):
.logo {
background-image: image-set(
url("logo.png") 1x,
url("logo@2x.png") 2x,
url("logo@3x.png") 3x
);
background-size: cover;
background-position: center;
background-repeat: no-repeat;
}
批量处理时,如何避免每个 class 都重复写 @include retina()?
可以封装一层自定义 mixin,把公共逻辑收口,比如强制加 center、no-repeat,并统一处理 @2x 路径前缀。
关键点:
- 不要在封装 mixin 里硬编码
@2x后缀——有些项目用-2x或_hd,应通过参数传入 - 如果用
asset-url()(如 Rails/SassC),注意它和retina()的路径解析可能冲突,优先用原生url() - 批量替换旧代码时,grep
background-image: url(比依赖 class 名更可靠——很多背景图是内联 style 或 JS 注入的,SCSS mixin 根本覆盖不到
一个最小可用封装示例:
@mixin bg-retina($path, $ratio: 2, $size: cover) {
background-image: url($path);
background-size: $size;
background-position: center;
background-repeat: no-repeat;
@if $ratio >= 2 {
@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
background-image: url("#{str-replace($path, '.png', '@2x.png')}");
background-size: $size;
}
}
}
真正麻烦的从来不是写几行 mixin,而是确保每张图都有对应高分版本、路径可访问、且容器本身宽高比稳定——否则 cover 一裁,关键内容就没了。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











