flex布局需配合媒体查询等才能响应横屏,单靠flex-direction或100vh会失效;@media (orientation: landscape)因逻辑宽高比判断易失灵,须配viewport元标签及更可靠断点如(max-height: 480px) and (min-width: 640px)。

Flex布局本身不自动响应横屏,必须配合媒体查询、动态单位和方向控制才能真正适配——单靠flex-direction或100vh会翻车。
为什么@media (orientation: landscape)经常不生效
它只看“逻辑宽高比”,不是物理旋转;地址栏未收起、折叠屏半展开、viewport写错都会让它失效。
-
<meta name="viewport" content="width=device-width">必须存在,写width=375这类固定值就直接废掉整个媒体查询 - iOS Safari 15+快速旋转可能跳过触发,Android Chrome v79+只读初始方向,后续旋转不更新
- 稳妥写法是组合断点:
@media (orientation: landscape) and (min-aspect-ratio: 1280/720)或更推荐@media (max-height: 480px) and (min-width: 640px)——后者直击横屏时高度骤减的真实瓶颈
flex-direction不会随横屏自动切换
CSS不会因为你转了手机就把column改成row,必须显式声明。
- 默认竖屏用
flex-direction: column,横屏切row:@media (orientation: landscape) { .container { flex-direction: row; } } - 但注意:横屏时
100vh只剩约390px(iPhone 14),内容常被截断;改用min-height: 100dvh,并加overflow-y: auto - 如果子项高度不一致,
row方向下align-items: center会因基线不同显得错位——这时别硬调align-content,先统一子项高度或换display: grid
横向滚动导航在横屏下容易崩,怎么稳住
横屏时容器宽度暴增,white-space: nowrap可能让项目挤成一条线,flex-shrink: 0又导致溢出失控。
- 关键改两处:
flex-wrap: wrap替代nowrap,再用gap控制间距(别用margin-right) - 项目设
flex: 0 0 calc(50% - 8px)(双列)或flex: 0 0 calc(33.333% - 8px)(三列),gap: 16px自动处理间隙 - 横屏时若需保持单行滚动,加
max-width: 100vw防容器撑爆,同时overflow-x: auto必须保留
真正容易被忽略的是:横屏下visualViewport.height在键盘收起瞬间有几十毫秒延迟,JS读取可能拿到旧值;flex-basis在iOS Safari和Android WebView中解析不一致,真机上务必检查computed样式,别信模拟器。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











