标签不感知屏幕方向,需用 css 媒体查询 orientation: landscape/portrait 配合 的 media 属性实现横竖图切换,语法必须为冒号分隔,且 为必需降级 fallback。

picture 标签本身不感知屏幕方向,必须配合媒体查询
直接写 <picture></picture> 不会自动识别横屏/竖屏——它只响应 CSS 媒体查询。真正的方向判断靠 orientation: landscape 或 orientation: portrait,不是 JS 事件或设备 API。
常见错误是把 <source></source> 的 media 属性写成 screen and (orientation=landscape)(用了等号),实际必须用冒号:screen and (orientation: landscape)。
- 所有
<source></source>必须放在<picture></picture>开始处,<img>是 fallback,不能省略 - 浏览器按
<source></source>顺序匹配,第一个满足media条件的生效,后续忽略 - 注意:iOS Safari 对
orientation查询支持稳定,但某些 Android WebView 旧版本可能返回错误值(比如旋转时延迟触发或卡在初始状态)
横竖图切换的实际 HTML 结构怎么写
假设你有两张图:hero-landscape.jpg(宽图)和 hero-portrait.jpg(竖图),都放在 images/ 目录下:
<picture><source media="(orientation: landscape)" srcset="images/hero-landscape.jpg"><source media="(orientation: portrait)" srcset="images/hero-portrait.jpg"> @@##@@ </source></source></picture>
<img src="images/hero-portrait.jpg" alt="hero"> 的 src 不参与媒体匹配,仅作降级;它的 alt 必须有意义,不能留空。
- 如果只提供一种格式(如仅 WebP),记得加
type="image/webp"到对应<source></source> - 不要混用
width/height属性和 CSS 尺寸控制——<img>的 intrinsic size 会影响布局流,建议统一用 CSS 控制宽高 - 测试时手动旋转手机或用 Chrome DevTools 的「Toggle device toolbar」+「Rotate」按钮,别只靠 resize 窗口(桌面浏览器不触发 orientation 变化)
为什么有时横屏没切到横图?排查这三点
最常踩的坑不是语法错,而是环境或逻辑问题:
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
-
viewportmeta 缺失或写错:<meta name="viewport" content="width=device-width, initial-scale=1">必须存在,否则 iOS 可能禁用 orientation 查询 - 页面已滚动或有 fixed 元素干扰了 viewport 行为,导致 orientation 检测失效(尤其在微信内置浏览器中)
- 图片路径 404 或 CORS 问题——浏览器静默失败,回退到
<img>,你以为没切换,其实是加载失败
打开 DevTools 的 Network 面板,过滤图片请求,确认实际加载的是哪张。
需要响应式 + 方向双重判断时怎么组合 media
比如「只在横屏且宽度 ≥768px 时用横图」,就把条件连写:
<source media="(orientation: landscape) and (min-width: 768px)" srcset="images/hero-lg-landscape.jpg"></source>
注意括号必须完整包裹每个子条件,and 前后要有空格。
- 避免嵌套太深:
(orientation: landscape) and (min-width: 768px) and (min-resolution: 2dppx)可行,但维护性下降,建议拆成独立<source></source>并控制顺序 - 不要用
max-device-width替代min-width——device-width 是设备物理宽度,和 orientation 耦合后行为不可靠 - orientation 查询无法在打印媒体(
@media print)中生效,别指望它用于 PDF 导出场景
orientation 是离散状态,切换瞬间可能有短暂空白或闪动,如果对体验要求高,得配合 JS 监听 resize 或 orientationchange 做预加载或过渡动画——但那是另一层复杂度了。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










