图片

固定像素宽度的图片在手机上常会溢出屏幕或压扁变形。响应式图片的目标有两个:随容器缩放不破版、按屏幕选择合适的清晰度不浪费流量。本节从 max-width、srcset/picture、背景图三个层面讲解自适应手段。

让图片跟随容器缩放

一条规则即可覆盖绝大多数 <img> 场景:

img { max-width: 100%; height: auto; }
  • max-width: 100%:图片宽度不超过父容器,容器窄就等比缩小。
  • height: auto:按原始宽高比自动计算高度,避免拉伸变形。
<img src="photo.jpg" alt="风景照" style="width:300px">
<img src="photo.jpg" alt="风景照" style="width:100%">

效果:第二张图无论容器多宽都等比填满。注意用 100% 固定宽度会“只缩不放”,小图放进大容器会被强行放大而变糊,所以优先使用 max-width。

高清屏与多尺寸:srcset

同一张图,希望手机加载小图省流量、高分屏加载大图更清晰,用 srcset 声明候选图:

<img src="photo-800.jpg"
     srcset="photo-400.jpg 400w, photo-800.jpg 800w, photo-1200.jpg 1200w"
     sizes="(max-width: 600px) 100vw, 50vw"
     alt="风景照">
  • 400w / 800w / 1200w:候选图片的真实宽度。
  • sizes:告诉浏览器图片实际将显示多宽。
  • 浏览器综合视口宽度、显示尺寸与网速挑选最合适的一张,无需写任何 JS。

按终端换图:picture 标签

需要“手机竖图、桌面横图”这种不同裁切时,用 <picture> 配合媒体查询换源:

<picture>
  <source media="(max-width: 600px)" srcset="photo-mobile.jpg">
  <img src="photo-desktop.jpg" alt="风景照">
</picture>

效果:宽度不超过 600px 时加载竖版小图,否则加载横版大图。<picture> 只负责“换源”,最终仍由 img 负责显示与缩放,img 上的 alt 等属性依然生效。

背景图的响应式

CSS 背景图片用 background-size 控制铺放方式:

.banner {
    background: url("banner.jpg") center / cover no-repeat;
}
  • cover:图片铺满整个容器,超出的部分被裁掉。
  • contain:完整显示整张图片,容器比例不符时会留白。

需要背景图随容器伸缩时,cover/contain 远比固定像素值稳健。

小结

响应式图片有三条路:img 上加 max-width:100% 与 height:auto 作通用兜底;srcset/sizes 与 picture 按屏幕选图以省流量保清晰;背景图交给 background-size 的 cover/contain。三者各司其职,组合即可覆盖几乎全部图片场景。

笔记加载中…