为什么我的srcset图片在移动端显示模糊?
我在给图片组件设置srcset和sizes时遇到了问题,移动端设备明明匹配了小图,但显示还是模糊。
场景是卡片组件里的封面图,用CSS设置了最大宽度600px,图片宽度100%。我按照文档写了:
<img
srcset="small.jpg 480w, medium.jpg 800w, large.jpg 1200w"
sizes="(max-width: 600px) 100vw, 600px"
src="medium.jpg"
alt="示例图">
对应的CSS是这样的:
.card {
max-width: 600px;
}
.card img {
width: 100%;
height: auto;
}
但在iPhone 12(屏幕宽度390px)上却加载了medium.jpg(800w),缩放后图片反而模糊了。试过调整sizes的媒体查询条件,但效果不明显,哪里设置有问题?
这样小屏设备就会正确选small.jpg了。
sizes的计算上。浏览器会根据
sizes属性告诉它:“这张图片在页面中实际显示的宽度是多少”,然后它会根据这个值和srcset中图片的宽度进行像素密度比对,选择“最合适的”图片。你写的:
意思是:
如果视口宽度 <= 600px,图片宽度 = 100vw(也就是视口的宽度)
否则,图片宽度 = 600px
iPhone 12 的视口是 390px,所以会走第一个分支,图片宽度是 390px。
但你给的图片 srcset 是:
浏览器会根据显示宽度(390px)去匹配 srcset 中最合适的图片宽度,理论上 small.jpg(480w)是更合适的。
但你现在实际加载的是 medium.jpg(800w),说明浏览器选择了错误的图片。问题出在没有告诉浏览器图片的显示密度(x倍屏)。
你可以这样改:
改成:
或者保留 w 描述符,但加上 sizes 的实际 display size:
再加 CSS 强制 img 不要拉伸过度:
试试看,复制过去试试,应该能改善模糊问题。