container queries 不适用于折叠屏多栏布局,因其仅响应父容器尺寸而非视口级折叠状态;应使用 viewport-segments 媒体查询(如 vertical-viewport-segments: 2)配合 @supports 检测,并辅以 js 防抖监听,同时为折叠态单独设置回退样式。

Container Queries 不能直接用于折叠屏多栏布局
折叠屏展开后的屏幕尺寸变化,属于视口级响应,container queries 对它完全无效。它只响应父容器的尺寸,不感知设备物理形态或系统报告的折叠状态。很多开发者误以为用 @container (min-width: 800px) 就能适配 Mate X 展开态(1136×2690 px),结果在真机上根本触发不了——因为目标元素的父容器可能被设为 width: 100% 或未设明确尺寸,导致容器查询始终 fallback 到默认样式。
折叠屏多栏布局该用 viewport-segments 媒体查询
HarmonyOS 和 Chrome 119+ 支持的 vertical-viewport-segments 和 horizontal-viewport-segments 才是正确检测折叠态的 CSS 方式。比如 Mate X 展开时水平方向是单视口,但悬停态下会报告 horizontal-viewport-segments: 2;Pocket 2 展开态竖屏下则是 vertical-viewport-segments: 2。
- 必须配合
@supports (vertical-viewport-segments: 2)做特性检测,旧浏览器直接忽略整条规则 - 不要混用
max-width和vertical-viewport-segments:前者是像素逻辑,后者是硬件分屏逻辑,叠加后行为不可预测 - 实际写法示例:
@supports (vertical-viewport-segments: 2) { .layout-grid { grid-template-columns: 1fr 300px; } } - 注意 Safari 目前(iOS 17.5 / macOS 14.4)仍不支持 viewport-segments,需降级到
@media (min-width: 1024px)+isFoldableJS 检测双保险
为什么不能只靠 media query + width 断点
单纯用 @media (min-width: 1024px) 会把平板、笔记本甚至部分大屏手机都卷进来,但它们根本没有铰链和分屏能力。更麻烦的是 Pocket 系列:折叠态无外屏,展开态竖屏分辨率是 363×860 vp,按宽度算才 363px,远低于常规断点,却需要启用双栏——这时仅靠 width 判断必然失效。
- 必须结合 JS 的
window.matchMedia查询vertical-viewport-segments状态,再动态加类 - 服务端无法获取折叠状态,所有判断必须在客户端完成
- 某些折叠动画过程中(如从悬停态向展开态过渡),
segments值会短暂为 1,需防抖处理避免样式闪动
Grid 多栏在折叠态下容易塌陷的坑
展开态用 grid-template-columns: 1fr 300px 很自然,但折叠态若没显式重置,子项可能因 minmax() 或 fr 计算异常而高度归零或错位。这不是 bug,是 Grid 在窄容器中对 fr 单元的收缩策略所致。
- 必须为折叠态单独写回退规则,例如:
@media (max-width: 480px) { .layout-grid { grid-template-columns: 1fr; } } - 别在同一个选择器里混用
fr和固定值(如200px 1fr),小屏下fr可能缩到 0,导致内容不可见 - 给 grid 容器设
min-height: 0,否则某些嵌套场景下 flex 子项会继承父容器最小高度,干扰 Grid 行高计算
vertical-viewport-segments 可能返回 1 或 2,取决于设备当前角度和系统版本。这个中间态没有统一标准,必须实机测试,不能只靠模拟器。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











