반응형 카드
이 카드는 뷰포트가 아니라 컨테이너 너비를 읽기 때문에 사이드바에 있든 전체 너비 열에 있든 똑같이 동작합니다.
더 보기넓은 레이아웃
컨테이너 선택자와 이름, 유형, px·rem·em 폭 범위를 정하고 실시간 컨테이너를 끌어 컴포넌트가 자기 폭에 반응하는 모습을 확인합니다.
쿼리가 너비를 읽는 요소
소문자, 숫자, 하이픈
rem 컨테이너 쿼리의 em·rem은 컨테이너와 페이지의 글꼴 크기를 기준으로 계산됩니다. 미리보기는 둘 다 16px로 가정합니다.
이 카드는 뷰포트가 아니라 컨테이너 너비를 읽기 때문에 사이드바에 있든 전체 너비 열에 있든 똑같이 동작합니다.
더 보기넓은 레이아웃너비 560px
560px에서 카드가 넓은 레이아웃으로 바뀝니다.
.card-wrap {
container-type: inline-size;
container-name: card;
}
@container card (min-width: 30rem) {
/* Responsive component styles */
}CSS 컨테이너 쿼리 생성기는 컴포넌트가 뷰포트가 아니라 컨테이너 폭에 반응하도록 하는 두 가지, 곧 직접 입력한 선택자에 container-type과 container-name을 지정하는 규칙과 px·rem·em 단위의 최소·최대 폭이 들어간 이름 있는 @container 쿼리를 써 줍니다.
재사용 컴포넌트에 컨테이너 쿼리가 중요한 이유는, 좁은 사이드바에 놓인 카드와 넓은 메인 영역에 놓인 카드가 실제로 확보한 공간에 따라 레이아웃을 바꿀 수 있기 때문입니다. 뷰포트 미디어 쿼리로는 알 수 없는 정보입니다. 실시간 미리보기가 바로 그것을 보여 줍니다. 컨테이너 가장자리를 끌면 예제 카드가 직접 쓴 브레이크포인트에서 좁은 세로 배치와 넓은 가로 배치로 바뀌고, 눈금자가 그 위치를 표시합니다.
입력한 값은 브라우저 안에만 있습니다. 도구는 컨테이너 선택자를 검사하고, 예약된 이름과 조건 없는 쿼리를 거부하며, container-type: size로 컨테이너가 접히는 경우를 경고합니다. 쿼리는 폭만 다루고 스타일 쿼리와 높이 조건은 만들지 않습니다.
.card-wrap이나 #sidebar처럼 감싸는 요소의 선택자를 입력하고, card, sidebar처럼 영문 소문자·숫자·하이픈으로 된 32자 이하의 소문자 이름을 정합니다.
컨테이너 폭만 추적하려면 inline-size, 폭과 높이를 모두 추적하려면 size를 고릅니다. size가 일으키는 높이 접힘은 도구가 경고합니다.
최소 폭, 최대 폭 또는 둘 다 켜고 px, rem, em 중에서 고릅니다. 단위를 바꾸면 16px 기준으로 값을 환산해 브레이크포인트 위치가 유지됩니다.
실시간 컨테이너의 오른쪽 가장자리를 끌거나 방향키를 누릅니다. 실제 너비에서 켜짐·꺼짐 판정이 나타나고, 쿼리가 일치하면 예제 카드의 레이아웃이 바뀝니다.
컨테이너 규칙과 @container 블록을 복사하고 자리표시 주석을 컴포넌트 자식 요소의 스타일로 바꿔 넣습니다. 컨테이너 폭이 범위 안에 있는 동안 적용됩니다.
CSS Containment Module Level 3이 크기 컨테이너 쿼리를 정의합니다. 요소에 normal이 아닌 container-type이 있으면 쿼리 컨테이너가 되고, @container 규칙은 같은 이름을 가진 가장 가까운 조상 컨테이너를 기준으로 일치 여부를 판단합니다. 컨테이너는 자기 쿼리로 자신을 꾸밀 수 없고 후손만 영향을 받습니다.
container-name을 쓰면 가장 가까운 조상이 아니라 특정 조상을 지정할 수 있습니다. 이름이 없으면 이름과 상관없이 가장 가까운 컨테이너를 씁니다.
.card-wrap {
container-type: inline-size;
container-name: card;
}
@container card (min-width: 30rem) and (max-width: 60rem) {
/* Responsive component styles */
}inline-size는 인라인 축에만 격리를 적용해서 컨테이너 높이는 여전히 내용으로 계산됩니다. size는 두 축 모두에 적용해서 컨테이너가 자식으로 크기를 정할 수 없고, 높이를 지정하지 않으면 높이 0으로 접힙니다. 높이를 쿼리하지 않는다면 inline-size를 쓰세요.
어느 쪽이든 레이아웃·스타일·크기 격리가 함께 적용되므로, 컨테이너는 absolute와 fixed 후손의 기준 블록이 되고 자체 쌓임 맥락을 만듭니다.
이름은 영문 소문자로 시작하고 영문 소문자, 숫자, 하이픈이 31자까지 이어질 수 있으며, none, default, and, or, not과 initial, inherit, unset 같은 CSS 전역 키워드는 쓸 수 없습니다. 선택자는 중괄호와 세미콜론이 없고 모든 괄호와 따옴표가 닫힌 CSS 선택자 하나여야 하며, 그 위에 브라우저의 CSS.supports 검사를 한 번 더 합니다.
폭은 min-width, max-width 조건으로 쓰고 소수 둘째 자리까지 반올림하며, 최소가 최대보다 클 수 없습니다. 크기 조건이 없으면 규칙이 유효하지 않으므로 경계를 하나 이상 지정해야 합니다. 미리보기는 rem과 em을 16px로 계산합니다.
| 입력 | 규칙 |
|---|---|
| 선택자 | CSS 선택자 하나, 중괄호·세미콜론 없음, 120자 이하 |
| 이름 | 영문 소문자로 시작, 소문자·숫자·하이픈, 1~32자 |
| 유형 | inline-size 또는 size |
| 최소/최대 폭 | px는 0~3200, rem·em은 0~200, 한쪽만 비워도 되지만 둘 다는 안 됨 |
| 예약된 이름 | none, default, and, or, not, initial, inherit, unset, revert, revert-layer |
선택자 .card-wrap, 이름 card, 유형 inline-size, 최소 30rem, 최대 꺼짐.card-wrap {
container-type: inline-size;
container-name: card;
}
@container card (min-width: 30rem) {
/* Responsive component styles */
}도구를 처음 열었을 때의 기본 상태입니다. 30rem은 480px입니다.
선택자 .sidebar, 이름 sidebar, 유형 inline-size, 최소 20rem, 최대 40rem.sidebar {
container-type: inline-size;
container-name: sidebar;
}
@container sidebar (min-width: 20rem) and (max-width: 40rem) {
/* Responsive component styles */
}선택자 .pricing-tile, 이름 pricing, 유형 inline-size, 최소 360px.pricing-tile {
container-type: inline-size;
container-name: pricing;
}
@container pricing (min-width: 360px) {
/* Responsive component styles */
}선택자 #hero, 이름 hero, 유형 size, 최소 꺼짐, 최대 25em#hero {
container-type: size;
container-name: hero;
}
@container hero (max-width: 25em) {
/* Responsive component styles */
}size 유형에서는 컨테이너에 높이를 직접 지정하세요.
이름 default, 폭은 아무 값오류: card, sidebar-widget처럼 소문자 이름을 입력해 주세요대문자 이름과 none, and, or, not도 거부됩니다.
container-type과 바꾸려는 스타일을 같은 요소에 두면 효과가 없습니다. 컨테이너가 바뀌는 요소들의 부모가 되도록 컴포넌트를 감싸세요.
container-type: size에서는 요소가 내용으로 높이를 얻지 못합니다. 높이를 지정하지 않으면 높이 0으로 보입니다. 폭 기반 레이아웃에는 inline-size를 쓰세요.
격리 때문에 컨테이너가 fixed·absolute 후손의 기준 블록이 됩니다. 안쪽의 position: fixed 툴팁은 뷰포트가 아니라 컨테이너를 기준으로 배치됩니다.
30em 조건은 쿼리 컨테이너의 계산된 글꼴 크기를 기준으로 하고, 30rem은 루트 요소의 글꼴 크기를 기준으로 합니다. 어느 쪽도 컨테이너 너비에 상대적인 단위는 아닙니다. 컨테이너를 따라가는 크기가 필요하면 블록 안에서 cqw 같은 컨테이너 쿼리 단위를 쓰세요.
div 같은 포괄적인 선택자는 모든 div를 같은 이름의 컨테이너로 만들고 가장 가까운 것이 선택됩니다. 쿼리가 의도한 컨테이너에 닿도록 감싸는 요소에 구체적인 클래스를 쓰세요.
뷰포트가 아니라 조상 컨테이너의 크기를 기준으로 스타일을 적용하는 조건 규칙 @container입니다. 컴포넌트 하나가 어디에 놓이든 알아서 적응하게 해 줍니다.
감싸는 요소에 container-type: inline-size;를 쓰고 필요하면 container-name: card;를 더합니다. 그다음 @container card (min-width: 30rem) { ... }로 후손에 적용할 스타일을 씁니다. 도구가 입력한 선택자에 맞춰 두 부분을 모두 써 줍니다.
미디어 쿼리는 뷰포트나 기기를, 컨테이너 쿼리는 가장 가까운 일치하는 조상을 검사합니다. 페이지 전체 레이아웃에는 미디어 쿼리를, 여러 자리에 놓이는 컴포넌트에는 컨테이너 쿼리를 쓰세요.
크기 컨테이너 쿼리는 2023년 초까지 Chrome, Edge, Safari, Firefox 모두에 들어왔고 현재 버전에서 지원됩니다. 오래된 버전을 지원해야 한다면 호환성 표를 확인하세요.
em은 쿼리 컨테이너의 계산된 글꼴 크기, rem은 루트 요소의 글꼴 크기를 기준으로 하며 px는 고정됩니다. 도구는 셋 모두를 지원하고, 화면 경고에 적힌 대로 미리보기와 단위 환산에서는 em과 rem을 모두 16px로 계산합니다.
@container 규칙에는 쿼리 조건이 있어야 하고 이 도구는 폭 조건만 만듭니다. 최소, 최대 또는 둘 다 지정하세요. 이름만으로는 유효한 쿼리가 아닙니다.
container-type: size일 때만 가능하고, 이 도구는 폭 조건만 만듭니다. 높이 조건은 직접 추가하고 컨테이너 높이를 명시하세요.
마지막 업데이트: