火次果
火次果

暂无菜单项

首页/文章/技术文章/web前端/HTML5/
打开 MD 链接

picture 结构与样式:必须记住的三条规则

发布于 4天前
2

picture 元素经常被当成「带多个 src 的 img」来用,样式与尺寸照习惯写在最外层,结果大半不生效。理解它的三层结构之后,写法就不容易错。

屏幕上显示 HTML 代码,用于说明 picture 元素的结构与样式位置
边框、圆角、宽高都需要写在 img 上,picture 只是容器

规则一:picture 不产生盒子

picture 是纯粹的容器,自身不渲染框,宽度高度、边框、圆角、object-fit 都不作用在它身上。真正承载图像的是末尾的 img,样式一律写在那一层:

picture { display: block; }        /* 只做行内元素的流式修正 */

picture img {
  width: 100%;
  height: auto;
  border-radius: 8px;
  object-fit: cover;
}

给 picture 加边框、加背景图、加 max-width,样式表不会报错,页面上也没有变化。

规则二:source 自上而下匹配,命中即停

<picture>
  <source type="image/webp" media="(min-width: 900px)" srcset="wide.webp">
  <source type="image/webp" srcset="narrow.webp">
  <source media="(min-width: 900px)" srcset="wide.jpg">
  <img src="fallback.jpg" alt="封面">
</picture>

浏览器按顺序检查每个 source 的 media 与 type,第一个同时满足条件的 source 被采用,后面的不再检查。把宽屏条件写在窄屏之后,窄屏条件会永远先命中,宽屏资源拿不到。

规则三:sizes 写在 img 上

<img src="cover-800.jpg"
     srcset="cover-800.jpg 800w, cover-1600.jpg 1600w"
     sizes="(max-width: 700px) 100vw, 720px"
     alt="封面">

sizes 描述资源在版式中的实际宽度,属于最终被渲染的那张图。写在 source 上也能解析,但两处同时写且不一致时,调试会很难归因,统一写在 img 上。

四类无效写法

  • 给 picture 设 border、border-radius、box-shadow;
  • 给 source 加 class 或 id,期待 CSS 命中;
  • 在 source 上写 src 属性,真正生效的是 srcset;
  • 省略末尾 img,picture 不会渲染任何内容。

检查清单

  1. 样式选择器以 picture img 结尾;
  2. source 顺序按条件从严到宽排列;
  3. sizes 只出现一次且写在 img 上;
  4. 末尾 img 的 src 与 alt 都在。

常见问题(FAQ)

为什么要给 picture 设 display: block?
picture 默认是行内元素,内部的 img 也是行内盒,底部会出现基线间隙。把 picture 设为 block 可以消除该间隙。
picture 上可以加类选择器吗?
可以作为选择器的锚点使用,例如 picture img 这样命中内部图像。直接给 picture 本身写视觉样式则不会生效。
source 上写 src 属性有用吗?
没有作用。source 通过 srcset 提供候选资源,src 属性会被忽略。资源描述统一写在 srcset 上。
多个 source 都满足条件时用哪一个?
用第一个。source 按文档顺序检查,命中后立即停止,排在后面的条件即使更精确也不会被评估。
省略末尾 img 会怎样?
页面上不会显示任何图像。img 既是兜底也是实际渲染节点,属于 picture 结构中的必需部分。
picture元素sizes属性source标签图片结构样式作用域
支持作者
如果这篇内容对你有帮助,可以请作者喝杯咖啡
0 点赞
0 收藏
分享
0 讨论
反馈
0 / 600
细中粗
0 讨论
热门最新
总结
暂无总结
嗨,下午好!
所有的成功,都源自一个勇敢的开始
创作
社区
购物
会员
近期热门

暂无数据

火次果
火次果
首页
资迅中心
小店
AI导航
社区
所有的成功,都源自一个勇敢的开始
不辜负每一个勇敢的开始
关于FAQ协议
火次果 © 2026鲁ICP备2025164830号-1