CSS containment와 @container

✒️ 2025-05-02 16:07 내용 수정


참고 자료 :
mdn web docs Using CSS containment, mdn web docs Using container size and style queries


containment


contain 속성

참고 자료 : mdn web docs css contain

속성값 설명
none 요소가 일반적으로 렌더 됨
contain에 의한 변화 없음
strict 모든 containment 규칙이 요소에 적용됨
content size를 제외한 모든 containment 규칙이 적용됨
size 자식 요소를 무시하고 요소 자체의 크기를 계산.
inline-size 자식 요소를 무시하고 요소의 크기를 계산.
layout 내부 요소의 레이아웃이 나머지 페이지의 레이아웃과
분리되어 서로 영향을 주지 않음.
style 요소와 자식 요소에 영향을 주는 속성들이 container 내부에만 영향을 줌.
CSS counter가 요소 내에서 변경되어
나머지 트리에 영향을 주는 경우를 방지할 때 사용.
paint 자식 요소들이 요소의 경계 밖으로 표시되지 않음
contain: none;
/* contain: size layout paint style; 과 동일 */
contain: strict;
contain: content;
contain: size;
contain: inline-size;
contain: layout;
contain: style;
contain: paint;
div {
	content: paint;
}

article {
	contain: size;
	contain-intrinsic-size: 100px 200px;
}

1. sizeinline-size

<div class="container">
	<header>
		<h2>contain: size</h2>
	</header>
	<div class="contents">
		<div class="box">
			<div class="child">
				<p>일반 설정</p>
				<!-- 생략 -->
			</div>
		</div>
		<div class="box box1">
			<div class="child">
				<p>contain:size</p>
				<!-- 생략 -->
			</div>
		</div>
	</div>
</div>
<div class="container">
	<header>
		<h2>contain: inline-size</h2>
	</header>
	<div class="contents">
		<div class="box">
			<div class="child">
				<p>일반 설정</p>
				<!-- 생략 -->
			</div>
		</div>
		<div class="box box2">
			<div class="child">
				<p>contain:inline-size</p>
				<!-- 생략 -->
			</div>
		</div>
	</div>
</div>
.child {
    background-color: rgba(0, 128, 96, 0.2);
    margin-top: 10px;
    padding: 5px;
}

.box1 {
	contain: size;
}

.box2 {
	contain: inline-size;
}

css_contain 1.png

2. layout

<div class="container">
	<header>
		<h2>contain: layout</h2>
	</header>
	<div class="contents">
		<div class="box">
			<div class="child">
				<p class="fixed-text">일반 설정</p>
				<!-- 생략 -->
			</div>
		</div>
		<div class="box box3">
			<div class="child">
				<p class="fixed-text">contain: layout</p>
				<!-- 생략 -->
			</div>
		</div>
	</div>
</div>
.box3 {
    contain: layout;
}

.fixed-text {
    padding: 3px;
    position: fixed;
    right: 5px;
    background-color: yellow;
    border: 1px solid orange;
}

.floated-text{
    float: right;
    padding: 3px;
    background-color: lightgreen;
    border: 1px solid green;
}

css_contain 2.png

3. paint

<div class="container">
	<header>
		<h2>contain: paint</h2>
	</header>
	<div class="contents">
		<div class="box">
			<div class="child">
				<p>일반 설정</p>
				<!-- 생략 -->
			</div>
		</div>
		<div class="box box4">
			<div class="child">
				<p>contain: paint</p>
				<!-- 생략 -->
			</div>
		</div>
	</div>
</div>
.box4 {
    height: 140px;
    contain: paint;
}

css_contain 3.png


content-visibility

속성값 설명
visible 기본 설정
요소의 컨텐츠가 평소처럼 배치 및 렌더됨
hidden 요소의 컨텐츠를 스킵
탭 이동이나 선택 및 포커스로도 접근 불가능
auto contain: content 설정처럼 동작
사용자와 연관된 컨텐츠라면 표시하고 아니면 숨김
hidden과 달리 탭 이동, 선택, 포커스로 접근 가능
<div class="container">
	<header>
		<h2>content-visibility: hidden</h2>
	</header>
	<div class="contents">
		<div class="box">
			<div class="child">
				<p>일반 설정</p>
				<p>요소의 컨텐츠 렌더 여부 설정</p>
			</div>
		</div>
		<div class="box box6">
			<div class="child">
				<p>content-visibility: hidden</p>
				<p>요소의 컨텐츠 렌더 여부 설정</p>
			</div>
		</div>
	</div>
</div>
.box6 {
    content-visibility: hidden;
}

css_contain 4.png


container 속성

참고 자료 : mdn web docs CSS container, mdn web docs CSS container-type

div {
/* container-name / container-type */
	container: my-box / size;
}

container-type 속성

속성값 설명
normal 기본값
container style queries에 적용되며 container size query에는 query container로 사용 X
size sizeinline-size 차원에 대한 query container 생성
inline-size inline 축에 대한 query container 생성
scroll-state scroll-state에 대한 query container 생성
요소의 크기는 독립적으로 계산되지 않음(containment 적용X)
div {
	container-type: inline-size;
}

.container {
	container-name: scroll-box;
	container-type: scroll-state;
}

@container

참고 자료 : mdn web docs CSS container queries, mdn web docs css @container

<div class="post">
	<div class="card">
		<h2>Card title</h2>
		<p>Card content</p>
	</div>
</div>
.post {
	width: 50%;
	padding: 10px;
	container-type: inline-size;
	border: 1px solid black;
}

/* .post의 최소 너비가 500px일 때 제목 색 변경 */
@container (min-width: 500px) {
	.card h2{
		color: red;
	}
}

css_container_query 1.png

css_container_query 2.png

.post {
	/* container : post / inline-size; */
	container-name: post;
	container-type: inline-size;
	border: 1px solid black;
}

/* container-name이 post인 container에 적용 */
@container post (min-width: 500px) {
	.card h2{
		color: red;
	}
}
단위 설명
cqw query container 너비의 1%
cqh query container 높이의 1%
cqi query container의 inline-size의 1%
cqb query container의 block-size의 1%
cqmin cqicqb 중 더 작은 값
cqmax cqicqb 중 더 큰 값
.post p{
	/* query container 폭의 50% */
	width: 50cqw;
	border: 1px solid red;
}

css_container_query 3.png