前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库HTML srcset sizes responsive image selection
CSS响应式设计

图片的 srcset 和 sizes 怎样让浏览器选合适的文件?

使用宽度描述符时,srcset 列出各候选图片的源宽度,例如 400w、800w;sizes 告诉浏览器在不同媒体条件下图片预计占多少 CSS 宽度。浏览器结合显示宽度、设备像素密度等因素选择候选文件。sizes 不是让图片实际变宽的 CSS,实际布局尺寸仍需由样式控制。

前端进阶之旅 · 一题精讲更新于 2026.09.29
CSS#响应式设计
先看核心答案读代码示例
理解线索

浏览器按显示宽度与密度挑候选

  1. srcset宽度描述符标候选文件自身像素宽度,不是 CSS 宽
  2. sizes告诉浏览器图片预计占多少布局宽度以挑文件
  3. 源宽度显示尺寸仍由 CSS 决定,报错 sizes 可能多下载

它是选资源的显示宽度提示,真实布局宽度仍由 CSS 决定。

核心回答

先记住这个答案

宽度型 srcset 描述的是候选文件本身的像素宽度,sizes 描述图片预计在布局中占多少 CSS 像素。浏览器据此结合设备像素密度选择下载哪个文件,而真正的显示宽度仍由 CSS 决定。若 sizes 错报为 100vw,但图片实际只占侧栏,浏览器可能下载过大的资源。

  • srcset 的 w 是源图宽度
  • sizes 描述预计 CSS 显示宽度
  • 实际显示宽度仍由 CSS 决定
  • 浏览器决定最终候选

新闻卡片在两种布局中的显示宽度

新闻列表手机上图片占满卡片,桌面三列卡片每张约占视口三分之一。给图片提供 400、800、1200 像素宽的资源,在 sizes 中声明窄屏用 100vw、宽屏约 33vw。浏览器在下载前可据此选择合适资源;如果漏写 sizes,宽度描述符场景会按默认显示宽度估计,可能下载比实际所需更大的图。实际 CSS 列宽、间距也要与声明尽量一致。

三列卡片挑选不同图片资源HTML
<img
  src="/card-800.jpg"
  srcset="/card-400.jpg 400w, /card-800.jpg 800w, /card-1200.jpg 1200w"
  sizes="(max-width: 600px) 100vw, 33vw"
  alt="作者正在演示产品原型"
  width="800" height="600">

浏览器先读取 sizes 中第一个匹配的媒体条件,得到预计渲染显示宽度;再把 CSS 像素宽度与像素密度等因素结合,挑选合适的 srcset 候选。 示例里的 sizes="(max-width: 600px) 100vw, 33vw" 是估计:窄屏占满视口,宽屏约占三分之一。若页面两侧还有间距,实际宽度比 100vw 小;写得过大可能浪费资源,写得过小可能在高密度屏上发糊。用浏览器开发工具核对元素实际 CSS 宽度与最终 currentSrc,再调整 sizes,比只按设计稿宽度填写更稳。

浏览器按显示宽度与密度挑候选

候选选择由浏览器决定,不保证总是严格挑到数学上最近的文件;缓存和网络策略也可能参与。宽度描述符要写资源固有宽度,不能把显示宽度冒充为源宽度。width 和 height 属性还可提供宽高比,减少图片加载时的布局跳动。

假设桌面卡片实际宽 320 CSS 像素,屏幕密度为 2,浏览器大致需要约 640 像素宽的文件;若 sizes 却声称它占满 1200px 视口,就可能选到远大于需要的资源。缩放窗口时看 Network 中实际下载的候选,还要记住浏览器缓存可能让第二次测试看起来没有重新选图。sizes 描述布局估计,不负责把图片本身画成那个宽度。

回答前,多想一步

容易答错的地方

把 sizes 当作图片实际 CSS 宽度
它是选资源的显示宽度提示,真实布局宽度仍由 CSS 决定。
在 400w 写的是显示宽度
400w 表示该候选文件的固有像素宽度,应与资源本身一致。
试着用自己的话回答

面试官还会怎么问?

只有密度不同的同图,能用 1x、2x 吗?

可以。密度描述符适合同一显示尺寸下的不同清晰度候选。

为什么浏览器没选最小的图?

它还考虑预期显示宽度、设备密度、缓存等条件,不只比较文件列表顺序。

sizes 顺序重要吗?

重要。浏览器采用第一个匹配的条件,因此更具体的窄屏条件应放在前面,最后给默认显示宽度。

从一道题,走向一组知识

把知识连起来

响应式设计

怎样在 DevTools 中系统测试响应式页面?

可在 Network 面板确认不同视口实际下载了哪张候选图。

响应式设计

移动页面为什么需要 viewport meta?它与 vw 有什么关系?

viewport meta 影响移动布局视口,从而影响 sizes 中的视口宽度估计。

参考资料

  • CSS:响应式设计参考资料

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 新闻卡片在两种布局中的显示宽度
  3. 浏览器按显示宽度与密度挑候选
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑