container-type: size 用于启用对容器宽高两个维度的查询(如 @container (min-height: 200px)),适用于模态框、画布、仪表盘等需双维度适配的场景,但兼容性要求高(chrome 110+/firefox 119+/safari 17.4+),且容器须有稳定尺寸上下文。

size 关键字在容器查询中不能直接“获取”实时尺寸值,它只是告诉浏览器:这个容器的 width 和 height 都可用于后续的 @container 查询条件。真正起作用的是查询规则本身,而不是“读取”数值。
如果你期望像 JS 里调用 clientWidth 那样拿到一个可计算、可赋值的数字,CSS 没有这种能力——它只做条件匹配与样式应用。
container-type: size 的实际用途是什么?
- 它启用对容器 宽高两个维度 的查询(比如
@container (min-height: 200px)),而inline-size只响应宽度变化。 - 适用于卡片、弹窗、侧边栏等需要同时依据宽高调整布局的组件(例如:高度不足时隐藏副标题,宽度不足时折叠图标)。
- 注意:不是所有浏览器都支持
size;Chrome 110+、Firefox 119+、Safari 17.4+ 才完整支持,旧版本会降级为忽略该规则。
常见错误现象:
- 写了
container-type: size,但@container (min-height: 100px)不生效 → 检查浏览器版本,或改用inline-size+ 宽度逻辑兜底。 - 在 flex 或 grid 子项上直接设
container-type→ 失效,因为容器必须是有明确尺寸上下文的块级元素(如设置了width、max-width或flex-basis)。
为什么多数移动端场景其实该用 inline-size?
- 移动端布局绝大多数依赖宽度断点(列数切换、文字换行、图片缩放),高度变化不可控(用户滚动、键盘弹出、动态内容加载都会扰动容器高度)。
-
inline-size更轻量、兼容性更好(Safari 16.4 就已支持),且避免因高度抖动触发频繁重绘。 - 示例:一个横向滚动的推荐卡片流,父容器设
container-type: inline-size,子卡片用@container (min-width: 320px)控制单卡宽度,比用size更稳定。
使用场景对比:
PigX UI Pro 前端开发指南 - Vue 3 + TypeScript + Element Plus。当用户提到 PigX UI、PigX 前端、lgb-mgui 项目、Vue 3 企业级后台开发、Element Plus 后台开发时使用此技能。
-
inline-size:网格布局、卡片列表、导航栏折叠/展开、字体随容器宽度缩放 -
size:模态框内表单(需判断是否够高显示全部字段)、画布容器(宽高比约束下的自适应渲染)、仪表盘 widget(根据可用空间决定展示指标数量)
容器尺寸不是“实时读取”,而是“条件触发”
CSS 不提供 width: container-width 这类绑定语法。所谓“实时”,本质是:
- 浏览器在布局阶段检测容器尺寸
- 匹配到满足条件的
@container规则 - 应用对应样式(仅此而已)
这意味着:
- 无法用它做数学计算(比如
calc(100% - container-width)不合法) - 无法与其他 CSS 变量联动(
--container-w: ???无解) - 如果容器尺寸靠 JS 动态改变(如 resizeObserver 调整 width),CSS 会响应,但没有回调、无事件、不暴露数值
容易踩的坑:
- 误以为加了
container-type: size就能用height做媒体查询替代方案 → 实际仍需配合 JS 判断复杂逻辑 - 在未设置
width/height的空 div 上设容器类型 → 尺寸为 0,所有查询失效 - 忘记给容器加
contain: layout style(非必需但能提升性能,尤其嵌套深时)
size 是个精确但小众的开关,它打开的是双维度响应能力,不是数据接口。真要“获取尺寸”,JS 的 getBoundingClientRect() 或 ResizeObserver 仍是唯一可靠路径;CSS 容器查询的价值,在于把这部分逻辑声明式地交给样式层管理——前提是,你清楚它管什么、不管什么。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










