CSS容器查询

基本语法

/* 1. 在父元素上定义容器 */ .card-wrapper { container-type: inline-size; } /* 2. 命名容器 */ .sidebar { container-type: inline-size; container-name: sidebar; /* 简写: */ container: sidebar / inline-size; } /* 3. 在容器内查询 */ @container (min-width: 400px) { .card { display: grid; grid-template-columns: 1fr 2fr; } } /* 4. 查询命名容器 */ @container sidebar (min-width: 300px) { .widget { flex-direction: row; } }

实际示例 — 响应式卡片

.card-grid { container-type: inline-size; } .card { /* 默认:垂直堆叠布局 */ display: grid; grid-template-rows: auto 1fr auto; gap: 12px; padding: 16px; } /* 容器足够宽时:水平并排 */ @container (min-width: 480px) { .card { grid-template-columns: 200px 1fr; grid-template-rows: auto auto; align-items: start; } .card__image { grid-row: 1 / -1; height: 100%; object-fit: cover; } } @container (min-width: 700px) { .card__title { font-size: 1.5rem; } }

container-type 值

描述
inline-size基于容器的行内尺寸查询(水平书写模式下为宽度)
size同时基于行内和块级尺寸查询
normal无约束,但可命名(用于样式查询)

容器查询 vs 媒体查询

方面媒体查询容器查询
基于视口宽度/高度容器元素大小
可复用组件困难——依赖布局上下文简单——组件自适应容器
侧栏 vs 主内容每个上下文需不同类名一个类名,自动适应
浏览器支持100%90%+(Chrome 105+、FF 110+、Safari 16+)