"Media query 가 'viewport 가 얼마나 커?' 물어. Container query 가 '*이* 부모가 얼마나 커?' 물어. 그 단일 전환이 component 를 실제로 재사용 가능하게 만들어."
Container query 가 해결하는 문제
아름다운 카드 component 짓는다. 홈페이지의 풀 너비에서 멋져. 같은 카드를 280px 사이드바에 넣어 — 이미지가 너무 크고, 텍스트가 이상하게 wrap, CTA 버튼이 fit 안 됨. 카드가 viewport 때문이 아니라 컨테이너 때문에 깨짐.
Container query 전엔, 유일한 fix 가 "사이드바 variant" CSS 적기 또는 viewport media query 의존 (같은 viewport 가 카드를 두 다른 컨텍스트에 호스팅하면 실패). Container query 가 component 로 하여금 "나 얼마나 넓게 렌더 중?" 묻고 적응 — 주변 무관.
두 단계 패턴
Container query 가 항상 두 조각 포함:
- 쿼리될 부모에 containment 컨텍스트 선언.
container-type사용. - 그 컨테이너를 자손 안에서 쿼리 —
@container사용.
1 단계: container-type
container-type: inline-size— 컨테이너의 inline 크기 쿼리 (LTR 의 너비). 가장 흔함. 컨테이너 크기가 자기 너비로 결정; 자손이 그 너비 쿼리 가능.container-type: size— inline 과 block 둘 다 쿼리 (너비 AND 높이). 컨테이너 크기가 self-determining 됨 — 자식 크기에 안 맞춰짐, 조심해, 컨테이너가 collapse 할 수 있어.container-type: normal— 컨테이너 아님, 쿼리 불가 (기본).
거의 항상 inline-size 사용. size 는 특화된 케이스 (알려진 고정 높이 컨테이너) 용.
2 단계: @container
자손 안에서, 가장 가까운 containment 컨텍스트 쿼리:
명료성 위해 컨테이너 명명
Component 가 컨테이너 중첩할 때, 명명이 모호함 피함. 아니면 @container 가 container type 가진 가장 가까운 ancestor 쿼리:
Container query unit: cqw, cqh, cqi, cqb
vw 와 vh 가 viewport unit 인 것처럼, container query unit 이 컨테이너 기준 측정:
cqw— 컨테이너 너비의 1%.cqh— 컨테이너 높이의 1%.cqi— 컨테이너 inline 크기의 1% (= LTR 의 cqw).cqb— 컨테이너 block 크기의 1% (= 수평 writing-mode 의 cqh).cqmin,cqmax— cqi 와 cqb 의 min/max.
이게 viewport 가 아니라 컨테이너 기준으로 sizing 하게 — component 를 진짜 self-contained 로 만듦.
주의: Container type 이 layout 행동 바꿈
container-type: inline-size 가 containment 컨텍스트 설정, layout 이 컨테이너와 상호작용하는 방식에 영향. 구체적으로, 컨테이너가 absolute positioned 자손의 containing block 이 되고, 특정 layout 최적화 적용. 보통 보이지 않음; 가끔 미묘한 layout 변화 봄. Fix 는 layout 에 다른 영향 안 주는 wrapper 에 container-type 적용.
브라우저 지원
Container query 가 baseline 2023, 모든 주요 브라우저 (Chrome, Edge, Safari, Firefox) 지원. cq* unit 도 baseline. 2026 년에 polyfill 필요 없음.
Container query vs media query 쓸 때
- Media query: 페이지 레벨 구조. "데스크톱 너비에서 사이드바 보임." 사이트 전역 패턴. 사용자 선호.
- Container query: component 레벨 적응. "컨테이너가 > 400px 일 때 카드가 stack 에서 horizontal layout 으로 전환."
대부분 실제 앱이 둘 다 사용. 페이지 셸이 viewport 에 응답 (media query); 안의 카드가 컨테이너에 응답 (container query).