CSS 포함 모듈 레벨 3

W3C 작업 초안,

이 문서에 대한 추가 정보
이 버전:
https://www.w3.org/TR/2022/WD-css-contain-3-20220818/
최신 공개 버전:
https://www.w3.org/TR/css-contain-3/
편집자 초안:
https://drafts.csswg.org/css-contain-3/
이전 버전:
역사:
https://www.w3.org/standards/history/css-contain-3
테스트 스위트:
https://test.csswg.org/harness/results/css-contain-1_dev/
피드백:
CSSWG 이슈 저장소
명세 내 인라인
편집자:
Tab Atkins (Google)
Florian Rivoal (Bloomberg 대리)
Miriam E. Suzanne (초청 전문가)
이 명세에 대한 편집 제안:
GitHub 편집

개요

이 CSS 모듈은 contain 속성에 대해 설명하며, 이 속성은 요소의 하위 트리가 페이지의 나머지 부분과 독립적임을 나타냅니다. 적절히 사용하면 사용자 에이전트가 강력한 최적화를 수행할 수 있습니다.

CSS는 구조화된 문서(예: HTML, XML)의 렌더링을 화면, 종이 등에서 기술하기 위한 언어입니다.

이 문서의 상태

이 섹션은 문서가 출판된 시점에서의 상태를 설명합니다. 현재 W3C 출판물 목록과 이 기술 보고서의 최신 개정본은 W3C 기술 보고서 인덱스 https://www.w3.org/TR/에서 확인할 수 있습니다.

이 문서는 CSS 작업 그룹에서 작업 초안으로 권고 트랙을 사용하여 출판되었습니다. 작업 초안으로 출판되었다고 해서 W3C 및 회원의 지지를 의미하지는 않습니다.

이 문서는 초안 문서이며, 언제든지 다른 문서에 의해 업데이트, 교체 또는 폐기될 수 있습니다. 진행 중인 작업 외의 용도로 이 문서를 인용하는 것은 적절하지 않습니다.

피드백은 GitHub에 이슈 등록(권장) 시 명세 코드 “css-contain”을 제목에 포함하여 “[css-contain] …코멘트 요약…” 형식으로 보내주세요. 모든 이슈와 코멘트는 아카이브됩니다. 또는 (아카이브됨) 공개 메일링 리스트 www-style@w3.org로 피드백을 보낼 수 있습니다.

이 문서는 2021년 11월 2일 W3C 프로세스 문서에 따라 관리됩니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 작성되었습니다. W3C는 그룹의 산출물 관련 공개 특허 공개 목록을 유지합니다; 해당 페이지에는 특허 공개 방법에 대한 안내도 포함되어 있습니다. 개인이 본인이 보유한 특허가 필수 청구항을 포함한다고 판단되면 W3C 특허 정책 6절에 따라 정보를 공개해야 합니다.

1. 소개

이것은 CSS 포함 2단계와의 차이 명세입니다. 현재는 탐색적 작업 초안입니다. 구현을 진행 중이라면 2단계를 참조로 사용하시기 바랍니다. 이 초안이 CR 단계에 도달하면 2단계 텍스트를 이 문서에 병합할 예정입니다.

1.1. 모듈 상호작용

이 문서는 이전 명세에 없던 새로운 기능을 정의합니다. 또한 안정화되면 [CSS-CONTAIN-1]을 대체하고 우선하도록 목표합니다.

1.2. 값 정의

이 명세는 CSS2[CSS2] 속성 정의 규칙과 값 정의 문법[CSS-VALUES-3]에서 따릅니다. 이 명세에서 정의되지 않은 값 타입은 CSS Values & Units [CSS-VALUES-3]에서 정의됩니다. 다른 CSS 모듈과 조합될 경우 이 값 타입의 정의가 확장될 수 있습니다.

각 속성별 값 외에도, 이 명세에서 정의된 모든 속성은 CSS 전역 키워드도 속성 값으로 허용합니다. 가독성을 위해 명시적으로 반복하지 않았습니다.

2. 강한 포함: contain 속성

CSS 포함 2 § 2 강한 포함: contain 속성

이름: contain
새 값: layout || style || paint || [ size | inline-size ]
inline-size
이 값은 요소에 inline-size containment을 활성화합니다. 이는 inline-size주 상자의 내용에 직접적으로 의존하지 않게 합니다.

참고: 간접적인 의존성은 여전히 있을 수 있습니다. 자세한 내용은 § 3.1 인라인-크기 포함을 참조하세요.

3. 포함 유형

CSS 포함 2 § 3 포함 유형

3.1. 인라인-크기 포함

요소에 inline-size containment을 적용하면 size containment인라인 축 크기 지정에 적용됩니다. 즉, 인라인 축 내재 크기는 해당 요소에 내용이 없는 것처럼 결정됩니다. 그러나 내용은 상자의 블록 축 내재 크기에는 기존대로 영향을 주며, 상자는 분할(fragment)도 블록 축에서 정상적으로 허용됩니다.

참고: 경우에 따라 상자의 블록 축 내재 크기가 부모 포맷팅 컨텍스트의 레이아웃에 영향을 줄 수 있는데, 이는 상자의 인라인 크기에도 영향을 줄 수 있습니다(예: 조상 요소에 스크롤바가 생기는 등). 이로 인해 상자의 인라인 크기가 자체 내용에 의존하게 됩니다. 만약 변경된 인라인 크기로 인해 블록 크기가 달라지면, 새 블록 크기가 부모 포맷팅 컨텍스트에 추가 영향을 줄 수 있으나, 이전에 문제가 되었던 레이아웃으로 되돌아가지는 않습니다.

예를 들어, 스크롤바가 나타나면, 이후 블록 크기가 작아져서 스크롤바가 필요 없어져도 스크롤바는 제거되지 않습니다; 또는 상자의 논리적 높이가 아래 위치의 플로트와 충돌하여 아래로 내려가 더 넓은 인라인 공간을 갖게 되어 짧아져서 더 이상 충돌하지 않아도, 상자는 이전에 문제였던 크기와 위치로 다시 올라가지 않습니다.

따라서 inline-size containment이 상자의 내용이 인라인 크기인라인 축 내재 크기를 통해 직접적으로 영향을 주는 것을 방지하지만, 인라인 크기는 내용이 블록 크기에 미치는 영향으로 인해 간접적으로 의존할 수 있습니다.

일반적으로 요소의 인라인 크기와 블록 크기 관계는 예측하기 어렵고 단조롭지 않습니다. 블록 크기는 인라인 크기가 바뀔 때 임의로 위아래로 이동할 수 있습니다. 무한 반복은 레이아웃이 이전(문제였던) 상태로 되돌아가지 않도록 보장함으로써 방지됩니다. 즉, 레이아웃은 항상 "앞으로"만 이동합니다. 현재 CSS 레이아웃 명세가 이러한 규칙을 내포하고 있다고 생각하지만, 만약 그렇지 않은 부분이 있다면, CSSWG에 알려주세요 오류를 수정할 수 있도록 하겠습니다.

다음은 플로트 배치가 블록 크기가 인라인 크기에 의존하게 만드는 예시입니다:
<section style="width: 200px; border: solid; display: flow-root;">
  <div style="float: left; width: 50px; height: 80px; background: blue;"></div>
  <div style="float: right; width: 50px; height: 80px; background: blue;"></div>
  <div style="float: left; width: 160px; height: 80px; background: navy;"></div>

  <article style="border: solid orangered; display: flow-root; min-width: min-content">
    <div style="background: orange; aspect-ratio: 1/1;">
      Article
    </div>
  </article>
</section>
Article

블록 레이아웃 알고리즘은 먼저 플로팅 박스를 배치합니다. 첫 번째와 두 번째 박스는 컨테이너의 좌우 모서리에 위치하게 되고, 세 번째 박스는 사이에 들어갈 수 없을 만큼 너무 넓어서 아래로 밀려납니다.

그 다음에 article이 레이아웃됩니다. 이 요소는 display: flow-root이기 때문에, 어떤 float과도 겹칠 수 없으며, 따라서 자신의 크기와 위치를 결정할 때 float 요소들을 반드시 고려해야 합니다.

레이아웃 엔진은 먼저 article을 컨테이너의 상단에 맞추려고 시도하며, 그 결과 100px의 너비가 나오고, 이는 min-content size를 충분히 수용할 수 있을 만큼 넓습니다. 하지만 자식 요소의 aspect-ratio 때문에, article100px 높이가 되어 80px 아래에 있는 세 번째 float과 겹치게 되므로, 이 레이아웃 기회는 폐기됩니다.

그 다음 article을 세 번째 float의 상단에 맞추어, 오른쪽의 좁은 40px 너비 공간에 배치하려고 시도합니다. 하지만 articlemin-width 때문에 세 번째 float 옆의 40px 너비 공간에 들어갈 수 없으므로, 이 요소 역시 아래로 이동하여 모든 float 박스 아래에 200px 정사각형을 형성합니다.

Article

article에서 min-width를 제거하거나, 또는 article이나 headerinline-size containment를 추가하면 (min-width: min-content가 0으로 계산됨), article은 마지막 float div 옆에 40px 정사각형으로 들어가게 됩니다 (일부 내용이 오버플로우될 수 있음).

이 시점에서 article의 너비와 높이(40px씩)가 다시 처음 고려했던 공간, 즉 컨테이너 상단에 맞춰 들어갑니다. 그러나 박스는 이전 위치로 되돌아가지 않습니다, 왜냐하면 레이아웃 엔진은 이미 해당 위치가 잘못된 레이아웃을 초래한다는 사실을 알고 있기 때문입니다.

요소에 inline-size containment를 부여해도, 다음 중 하나라도 해당되면 아무 효과가 없습니다:

4. 컨테이너 쿼리

미디어 쿼리는 문서가 표시되는 사용자 에이전트나 디바이스 환경 (예: 뷰포트 크기 또는 사용자 환경설정)과 같은 측면을 질의할 수 있는 방법을 제공하지만, 컨테이너 쿼리는 문서 내 요소의 측면 (예: 박스 크기나 계산된 스타일)을 테스트할 수 있게 해줍니다.

기본적으로 모든 요소는 컨테이너 스타일 쿼리 목적에서 쿼리 컨테이너이며, 컨테이너 사이즈 쿼리에 대해 추가 쿼리 타입을 container-type 속성 (또는 container 단축 속성)을 지정하여 쿼리 컨테이너로 설정할 수 있습니다. 쿼리 컨테이너의 shadow 포함 자손에 적용되는 스타일 규칙은 @container 조건부 그룹 규칙을 사용하여 해당 컨테이너를 질의하여 조건부로 적용할 수 있습니다.

예를 들어, 메인 콘텐츠 영역과 사이드바를 컨테이너로 정의한 다음, 컨테이너의 크기에 따라 수직 레이아웃에서 수평 레이아웃으로 변경되는 .media-object를 설명할 수 있습니다:
main, aside {
  container: my-layout / inline-size;
}

.media-object {
  display: grid;
  grid-template: 'img' auto 'content' auto / 100%;
}

@container my-layout (inline-size > 45em) {
  .media-object {
    grid-template: 'img content' auto / auto 1fr;
  }
}

메인과 사이드바 영역의 미디어 오브젝트들은 각각 자신의 컨테이너 컨텍스트에 반응합니다.

선택자가 의사 요소(pseudo element)를 포함할 경우, 쿼리 컨테이너는 shadow 포함 포괄 조상을 통해 최종 기원 요소에 대해 설정할 수 있습니다.

다음과 같은 점이 있습니다:
::before 선택자가 생성 요소의 크기를 질의하는 예:
<style>
  #container {
    width: 100px;
    container-type: inline-size;
  }
  @container (inline-size < 150px) {
    #inner::before {
      content: "BEFORE";
    }
  }
</style>
<div id=container>
  <span id=inner></span>
</div>
::slotted() 선택자를 사용한 shadow host 자식 스타일링에서 shadow 트리 내의 컨테이너를 질의하는 예:
<div id=host style="width:200px">
  <template shadowroot=open>
    <style>
      #container {
        width: 100px;
        container-type: inline-size;
      }
      @container (inline-size < 150px) {
        ::slotted(span) {
          color: green;
        }
      }
    </style>
    <div id=container>
      <slot />
    </div>
  </template>
  <span id=slotted>Green</span>
</div>

4.1. 쿼리 컨테이너 생성: container-type 속성

이름: container-type
값: normal || [ size | inline-size ]
초기값: normal
적용 대상: 모든 요소
상속됨: 아니오
백분율: 해당 없음
계산값: 키워드 normal 또는 size, inline-size 중 하나 이상
정식 순서: 문법에 따름
애니메이션 타입: 애니메이션 불가

container-type 속성은 해당 요소를 쿼리 컨테이너로 지정하여 컨테이너 쿼리 중 명시적 포함이 필요한 쿼리(예: 컨테이너 사이즈 쿼리) 목적에 사용합니다. 이는 자손을 스타일링하는 스타일 규칙이 해당 컨테이너의 크기 및 레이아웃 측면을 질의하고 그에 따라 반응할 수 있도록 해줍니다.

별도의 언급이 없는 한, 모든 요소는 명시적 포함이 필요하지 않은 컨테이너 쿼리(예: 컨테이너 스타일 쿼리) 목적에서는 쿼리 컨테이너입니다. container-type 지정과 관계없습니다.

값의 의미는 다음과 같습니다:

size
쿼리 컨테이너컨테이너 사이즈 쿼리 대상으로 지정하며, 인라인블록 축 모두에 적용됩니다. 레이아웃 포함, 스타일 포함, 사이즈 포함principal box에 적용됩니다.
inline-size
쿼리 컨테이너컨테이너 사이즈 쿼리 대상으로 지정하며, 해당 컨테이너의 인라인 축에 적용됩니다. 레이아웃 포함, 스타일 포함, 인라인-크기 포함principal box에 적용됩니다.
normal
해당 요소는 어떤 쿼리 컨테이너도 아니며, 컨테이너 사이즈 쿼리의 대상이 아닙니다. 다만, 컨테이너 스타일 쿼리쿼리 컨테이너 역할은 유지됩니다.
예시: 컨테이너 반응형 타이포그래피를 생성하여 font-size, line-height 등 타이포그래피 관련 속성을 컨테이너 크기에 따라 조절할 수 있습니다:
aside, main {
  container-type: inline-size;
}

h2 { font-size: 1.2em; }

@container (width > 40em) {
  h2 { font-size: 1.5em; }
}

질의 조건에서 사용된 40em 값은 해당 계산값 기준으로 관련 font-size가 적용된 쿼리 컨테이너에 상대적입니다.

컨테이너는 질의에 사용할 계산된 스타일 값도 노출할 수 있습니다. 여러 속성의 동작을 전환할 때 유용할 수 있습니다:
section {
  container-type: style;
}

@container (--cards: small) {
  article {
    border: thin solid silver;
    border-radius: 0.5em;
    padding: 1em;
  }
}

4.2. 쿼리 컨테이너 이름 지정: container-name 속성

이름: container-name
값: none | <custom-ident>+
초기값: none
적용 대상: 모든 요소
상속됨: 아니오
백분율: 해당 없음
계산값: 키워드 none 또는 식별자의 순서 있는 리스트
정식 순서: 문법에 따름
애니메이션 타입: 애니메이션 불가

container-name 속성은 쿼리 컨테이너 이름 리스트를 지정합니다. 이 이름들은 @container 규칙에서 어떤 쿼리 컨테이너를 대상으로 할지 필터링하는 데 사용할 수 있습니다.

none
쿼리 컨테이너쿼리 컨테이너 이름을 갖지 않습니다.
<custom-ident>
쿼리 컨테이너 이름식별자로 지정합니다. none, and, not, or 키워드는 <custom-ident>로 사용될 수 없습니다.
경우에 따라 특정 컨테이너의 속성을 질의하고 싶을 때가 있습니다. 가장 가까운 조상 컨테이너가 아니더라도 말입니다. 예를 들어, 메인 콘텐츠 영역의 높이와 더 안쪽의 인라인 컨테이너의 너비를 질의할 수 있습니다.
main {
  container-type: size;
  container-name: my-page-layout;
}

.my-component {
  container-type: inline-size;
  container-name: my-component-library;
}

@container my-page-layout (block-size > 12em) {
  .card { margin-block: 2em; }
}

@container my-component-library (inline-size > 30em) {
  .card { margin-inline: 2em; }
}

4.3. 이름이 지정된 컨테이너 생성: container 단축 속성

이름: container
값: <'container-name'> [ / <'container-type'> ]?
초기값: 개별 속성 참조
적용 대상: 개별 속성 참조
상속됨: 개별 속성 참조
백분율: 개별 속성 참조
계산값: 개별 속성 참조
애니메이션 타입: 개별 속성 참조
정식 순서: 문법에 따름

container 단축 속성container-typecontainer-name을 동시에 설정합니다. <'container-type'>이 생략되면, 해당 속성은 초기값으로 재설정됩니다.

단축 문법을 사용하여 container-typecontainer-name을 동시에 정의할 수 있습니다:
main {
  container: my-layout / size;
}

.grid-item {
  container: my-component / inline-size;
}

4.4. 컨테이너 쿼리: @container 규칙

@container 규칙은 조건부 그룹 규칙이며, 조건은 컨테이너 쿼리로, 이는 컨테이너 사이즈 쿼리 및/또는 컨테이너 스타일 쿼리의 불리언 조합입니다. <stylesheet> 블록 내에 선언된 스타일은 필터링되어, 해당 컨테이너 쿼리가 해당 요소의 쿼리 컨테이너에 대해 참일 때만 적용됩니다.

@container 규칙의 문법은 다음과 같습니다:

@container [ <container-name> ]? <container-condition> {
  <stylesheet>
}

각 용어의 정의:

<container-name> = <custom-ident>
<container-condition> = not <query-in-parens>
                      | <query-in-parens> [ [ and <query-in-parens> ]* | [ or <query-in-parens> ]* ]
<query-in-parens>     = ( <container-condition> )
                      | ( <size-feature> )
                      | style( <style-query> )
                      | <general-enclosed>

<style-query>         = <style-condition> | <style-feature>
<style-condition>     = not <style-in-parens>
                      | <style-in-parens> [ [ and <style-in-parens> ]* | [ or <style-in-parens> ]* ]
<style-in-parens>     = ( <style-condition> )
                      | ( <style-feature> )
                      | <general-enclosed>

none, and, not, or 키워드는 위의 <custom-ident>로 사용할 수 없습니다.

각 요소에 대해, 질의에 사용될 쿼리 컨테이너는 해당 요소의 조상 쿼리 컨테이너<container-condition> 내 모든 컨테이너 기능에 대해 유효한 쿼리 컨테이너로 설정된 것 중에서 선택됩니다. 선택적 <container-name>쿼리 컨테이너들 중 이름이 일치하는 쿼리 컨테이너 이름을 가진 컨테이너만 고려하도록 필터링합니다.

적격 쿼리 컨테이너가 요소에 대해 선택되면, <container-condition> 내의 각 컨테이너 기능이 해당 쿼리 컨테이너에 대해 평가됩니다. 조상 중 적격 쿼리 컨테이너가 없으면, 해당 요소의 컨테이너 쿼리unknown으로 간주됩니다.

미디어 쿼리와 마찬가지로, 여러 조건을 하나의 쿼리 리스트로 연결할 수 있습니다:
@container card (inline-size > 30em) and style(--responsive: true) {
  /* styles */
}

위 스타일은 "card"라는 이름의 조상 컨테이너가 inline-sizestyle 조건을 모두 만족할 때만 적용됩니다.

여러 중첩된 컨테이너 쿼리 내부의 요소에 정의된 스타일 규칙은, 해당 요소에 대해 모든 감싸는 컨테이너 쿼리가 참일 때 적용됩니다.

참고: 중첩된 컨테이너 쿼리는 서로 다른 컨테이너를 기준으로 평가될 수 있으므로, 개별 <container-condition>을 하나의 쿼리로 합치는 것이 항상 가능한 것은 아닙니다.

하나의 컨테이너 쿼리에서 여러 컨테이너를 질의할 수는 없지만, 중첩 쿼리를 통해 이를 구현할 수 있습니다:
@container card (inline-size > 30em) {
  @container style(--responsive: true) {
    /* styles */
  }
}

위의 스타일은 "card"라는 이름의 조상 컨테이너가 inline-size 조건을 만족하고, style 조건을 만족하는 또 다른 조상 컨테이너가 있을 때만 적용됩니다.

글로벌, 이름 정의 at-rule (@keyframes, @font-face, @layer 등) 이 컨테이너 쿼리 내에 정의될 경우, 해당 컨테이너 쿼리 조건에 의해 제한되지 않습니다.

4.5. 애니메이션 컨테이너

컨테이너 쿼리의 평가 변경은 스타일 변경 이벤트의 일부여야 하며, 그 변경이 애니메이션 효과에 의해 발생했더라도 마찬가지입니다.

형제 요소의 트랜지션이 컨테이너의 크기에 간접적으로 영향을 주어 스타일 변경 이벤트를 트리거할 수 있습니다:
main {
  display: flex;
  width: 300px;
}

#container {
  container-type: inline-size;
  flex: 1;
}

/* 해결된 너비는 처음에는 200px이지만, #sibling에서 트랜지션이 진행됨에 따라 변경됩니다. */
#inner {
  transition: 1s background-color;
  background-color: tomato;
}

/* 이 컨테이너 쿼리가 적용되기 시작하거나 중단될 때, #inner의 background-color에 트랜지션이 시작되어야 합니다. */
@container (width <= 150px) {
  #inner {
    background-color: skyblue;
  }
}

#sibling {
  width: 100px;
  transition: width 1s;
}

#sibling:hover {
  width: 200px;
}
<main>
  <div id=container>
    <div id=inner>이너</div>
  </div>
  <div id=sibling>형제</div>
</main>

container query length 단위로 인해 발생한 계산된 값의 변경도 스타일 변경 이벤트의 일부가 되어야 합니다.

5. 컨테이너 기능

컨테이너 기능쿼리 컨테이너의 특정 측면을 쿼리합니다.

5.1. 크기 컨테이너 기능

컨테이너 크기 쿼리쿼리 컨테이너principal box의 크기를 쿼리할 수 있게 합니다. 이는 개별 크기 기능 (<size-feature>)의 불리언 조합이며, 각각 쿼리 컨테이너의 단일, 특정 차원 기능을 쿼리합니다. <size-feature>의 문법은 미디어 기능과 동일합니다: 기능 이름, 비교자, 값. [mediaqueries-5] 크기 기능크기 쿼리로 결합하는 불리언 문법과 논리는 CSS 기능 쿼리와 동일합니다. (@supports 참조. [CSS-CONDITIONAL-3])

쿼리 컨테이너principal box를 가지고 있지 않거나, principal box가 layout containment box가 아니거나, 쿼리 컨테이너가 관련 축에서 컨테이너 크기 쿼리를 지원하지 않는 경우, 크기 기능의 평가 결과는 알 수 없습니다.

상대 길이 단위 (컨테이너 쿼리 길이 단위 포함) 컨테이너 쿼리 조건에서 계산된 값을 기준으로 쿼리 컨테이너에서 평가됩니다.

참고: 이는 미디어 쿼리에서 상대 단위가 처리되는 방식과 다릅니다.

예를 들어, 서로 다른 font-size를 가진 쿼리 컨테이너em 기반 쿼리를 각자의 폰트 사이즈를 기준으로 평가합니다:
aside, main {
  container-type: inline-size;
}

aside { font-size: 16px; }
main { font-size: 24px; }

@container (width > 40em) {
  h2 { font-size: 1.5em; }
}

쿼리 조건에 사용된 40em 값은 해당 계산된 값font-size를 기준으로 각각의 쿼리 컨테이너에서 상대적으로 평가됩니다:

5.1.1. 너비: width 기능

이름: width
대상: @container
값: <length>
타입: range

width 컨테이너 기능너비쿼리 컨테이너content box에서 쿼리합니다.

5.1.2. 높이: height 기능

이름: height
대상: @container
값: <length>
타입: range

height 컨테이너 기능높이쿼리 컨테이너content box에서 쿼리합니다.

5.1.3. 인라인 크기: inline-size 기능

이름: inline-size
대상: @container
값: <length>
타입: range

inline-size 컨테이너 기능크기쿼리 컨테이너content box에서 쿼리하며, 쿼리 컨테이너인라인 축을 기준으로 합니다.

5.1.4. 블록 크기: block-size 기능

이름: block-size
대상: @container
값: <length>
타입: range

block-size 컨테이너 기능크기쿼리 컨테이너content box에서 쿼리하며, 쿼리 컨테이너블록 축을 기준으로 합니다.

5.1.5. 종횡비: aspect-ratio 기능

이름: aspect-ratio
대상: @container
값: <ratio>
타입: range

aspect-ratio 컨테이너 기능width 컨테이너 기능의 값과 height 컨테이너 기능의 값의 비율로 정의됩니다.

5.1.6. 방향성: orientation 기능

이름: orientation
대상: @container
값: portrait | landscape
타입: discrete
portrait
orientation 컨테이너 특성portrait이며, height 컨테이너 특성의 값이 width 컨테이너 특성의 값보다 크거나 같을 때 입니다.
landscape
그 외의 경우 orientationlandscape입니다.

5.2. 스타일 컨테이너 특성

컨테이너 스타일 쿼리computed valuequery container에서 조회할 수 있게 합니다. 이는 개별적인 스타일 특성 (<style-feature>)의 불리언 조합이며, 각각은 query container의 단일, 특정 프로퍼티를 조회합니다. <style-feature>의 문법은 declaration과 동일합니다. [CSS-SYNTAX-3] 쿼리는 주어진 프로퍼티의 computed valuequery container에서 주어진 값과 일치하면 true가 되고, (값도 computed되어 query container 기준으로 평가됨) 프로퍼티나 값이 잘못되었거나 지원되지 않으면 unknown, 그 외는 false입니다. 스타일 특성스타일 쿼리로 불리언 결합하는 문법과 논리는 CSS feature queries와 동일합니다. (@supports 참고. [CSS-CONDITIONAL-3])

스타일 특성shorthand property를 조회한다면, 각 longhand propertycomputed value가 일치하면 true, 그렇지 않으면 false입니다.

cascade 의존 키워드 (예: revertrevert-layer)는 스타일 특성 값으로는 유효하지 않으며, 컨테이너 스타일 쿼리를 false로 만듭니다.

참고: 나머지 cascade에 의존하지 않는 CSS-wide 키워드computed되어 query container 기준으로 평가됩니다. 다른 값들과 동일하게 처리됩니다.

6. 컨테이너 상대 길이: cqw, cqh, cqi, cqb, cqmin, cqmax 단위

컨테이너 쿼리 길이 단위query container의 치수를 기준으로 하는 상대 길이를 지정합니다. 컨테이너 쿼리 길이 단위를 사용하면 컴포넌트를 더 쉽게 다른 query container로 옮길 수 있습니다.

컨테이너 쿼리 길이 단위는 다음과 같습니다:

컨테이너 단위 요약 (정보용)
단위 기준
cqw query containerwidth의 1%
cqh query containerheight의 1%
cqi query containerinline size의 1%
cqb query containerblock size의 1%
cqmin cqi 또는 cqb 중 더 작은 값
cqmax cqi 또는 cqb 중 더 큰 값

각 요소에 대해 컨테이너 쿼리 길이 단위는 해당 축(또는 축들)에 대해 컨테이너 크기 쿼리로 평가됩니다. 각 축에 대한 query container는 해당 축에 대해 컨테이너 크기 쿼리를 허용하는 가장 가까운 상위 컨테이너입니다. 적합한 query container가 없다면, 해당 축에 대해 작은 뷰포트 크기를 사용합니다.

참고: 어떤 경우에는 동일한 요소의 cqicqb 단위가 서로 다른 query container 기준으로 평가될 수 있습니다. 마찬가지로 cqmincqmax 단위는 cqicqb의 더 크거나 작은 값을 나타내며, 이 차원이 서로 다른 query container에서 올 수도 있습니다.

자식 요소는 부모에 지정된 상대 값 자체를 상속하지 않고, computed value를 상속합니다.

작성자는 컨테이너 쿼리 길이 단위가 적절한 query container 기준으로 적용되도록, 동일한 container-type을 사용하는 컨테이너 쿼리 내부에서 사용할 수 있습니다. 커스텀 폴백 값은 컨테이너 쿼리 외부에서 정의할 수 있습니다:
/* 폴백 값은 containment에 의존하지 않음 */
h2 { font-size: 1.2em; }

@container (inline-size >= 0px) {
  /* inline-size 컨테이너가 있을 때만 적용됨 */
  h2 { font-size: calc(1.2em + 1cqi); }
}

7. API

7.1. CSSContainerRule 인터페이스

CSSContainerRule 인터페이스는 @container 룰을 나타냅니다.

[Exposed=Window]
interface CSSContainerRule : CSSConditionRule {
};
conditionText of type CSSOMString (CSSContainerRule 전용 정의, CSSConditionRule의 attribute)
CSSConditionRule의 부모 룰에 정의된 conditionText attribute는, getter로 얻었을 때 지정된 조건을 반환해야 하며, 어떠한 논리적 단순화 없이 반환되어야 합니다. 반환된 조건은 명세를 준수하는 모든 구현(미래 확장까지 포함하여 <general-enclosed> 확장 메커니즘을 구현한 경우도 포함) 에서 지정된 조건과 동일한 결과를 평가해야 합니다. 즉, 토큰 스트림의 단순화(공백을 하나로 줄이거나, 선택적으로 생략 가능한 경우 생략 등)는 허용되지만, 논리적 단순화(불필요한 괄호 제거, 결과 평가에 기반한 단순화 등)는 허용되지 않습니다.

CSSContainerRule에 대한 CSSOM API 추가 [Issue #7033]

Container Queries는 matchContainer 메서드를 가져야 합니다. 이는 matchMedia()MediaQueryList 인터페이스를 모델로 하지만, Window가 아니라 Element에 적용됩니다. 레이아웃 크기를 측정할 때 resizeObserver와 유사하게 동작하지만, 추가적인 Container Query 문법 및 기능을 제공합니다. [Issue #6205]

8. 요소의 콘텐츠 전체 숨기기: content-visibility 프로퍼티

CSS Containment 2 § 4 요소의 콘텐츠 전체 숨기기: content-visibility 프로퍼티

9. 프라이버시 및 보안 고려사항

CSS Containment 2 § 5 프라이버시 및 보안 고려사항

부록 A. 변경사항

이 부록은 정보용입니다.

2021년 12월 21일 첫 공개 작업 초안 이후 변경사항

2021년 12월 21일 첫 공개 작업 초안 이후 주요 변경사항은 다음과 같습니다:

CSS Containment Level 2와의 변경점

CSS Containment 2 §  변경사항

감사의 글

다음의 코멘트와 이전 작업이 이 명세에 기여했습니다: Adam Argyle, Amelia Bellamy-Royds, Anders Hartvoll Ruud, Brian Kardell, Chris Coyier, Christopher Kirk-Nielsen, David Herron, Elika J. Etemad (fantasai), Eric Portis, Ethan Marcotte, Geoff Graham, Gregory Wild-Smith, Ian Kilpatrick, Jen Simmons, Kenneth Rohde Christiansen, L. David Baron, Lea Verou, Martin Auswöger, Martine Dowden, Mike Riethmuller, Morten Stenshorne, Nicole Sullivan, Rune Lillesveen, Scott Jehl Scott Kellum, Stacy Kvernmo, Theresa O’Connor, Una Kravets, 그리고 많은 분들이 이 명세에 기여했습니다.

준수성

문서 규약

준수 요구사항은 설명적 단언과 RFC 2119 용어의 조합으로 표현됩니다. 이 문서의 규범적인 부분에서 “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL”이라는 핵심 단어는 RFC 2119에 설명된 대로 해석되어야 합니다. 그러나 가독성을 위해, 이 단어들은 이 규격에서 모두 대문자로 표시되지 않습니다.

이 규격의 모든 텍스트는 명시적으로 비규범적임으로 표시된 섹션, 예시, 노트를 제외하고는 규범적입니다. [RFC2119]

이 규격의 예시는 “예를 들어”라는 단어로 시작하거나 class="example"로 규범적 텍스트와 구분되어 나타납니다. 예시:

이것은 정보 제공용 예시입니다.

정보성 노트는 “참고”라는 단어로 시작하며 class="note"로 규범적 텍스트와 구분되어 표시됩니다. 예:

참고: 이것은 정보 제공용 노트입니다.

권고사항은 규범적 섹션 중 특별한 주의를 유도하도록 스타일링되며, <strong class="advisement">로 규범적 텍스트와 구분되어 표시됩니다. 예: UA는 접근 가능한 대체 수단을 반드시 제공해야 합니다.

준수 클래스

이 규격에 대한 준수는 세 가지 준수 클래스로 정의됩니다:

스타일 시트
CSS 스타일 시트.
렌더러
UA는 스타일 시트의 의미를 해석하고 이를 사용하는 문서를 렌더링합니다.
저작 도구
UA는 스타일 시트를 작성합니다.

스타일 시트가 이 규격을 준수하려면, 이 모듈에 정의된 문법을 사용하는 모든 구문이 일반 CSS 문법 및 이 모듈의 각 기능에 대한 개별 문법에 따라 유효해야 합니다.

렌더러가 이 규격을 준수하려면, 적절한 규격에 정의된 대로 스타일 시트를 해석하는 것 외에, 이 규격에 정의된 모든 기능을 올바르게 파싱하고 문서를 그에 따라 렌더링해야 합니다. 단, UA가 디바이스의 한계로 인해 문서를 올바르게 렌더링하지 못하는 경우 준수하지 않는 것으로 간주하지 않습니다. (예: UA는 모노크롬 모니터에서 색상을 렌더링할 필요가 없습니다.)

저작 도구가 이 규격을 준수하려면, 일반 CSS 문법 및 이 모듈의 각 기능에 대한 개별 문법에 맞게 구문적으로 올바른 스타일 시트를 작성하고, 이 모듈에서 설명된 스타일 시트의 모든 다른 준수 요구사항도 충족해야 합니다.

부분 구현

저작자가 미래 호환성 구문 분석 규칙을 활용해 폴백 값을 지정할 수 있도록, CSS 렌더러는 반드시 지원 가능한 수준이 없는 at-rule, 속성, 속성값, 키워드, 기타 구문 구조를 적절히 무시하여 유효하지 않은 것으로 처리해야 합니다. 특히, UA는 하나의 다중 값 속성 선언에서 지원되지 않는 구성 값만 선택적으로 무시하고 지원되는 값만 적용해서는 안 됩니다. 어떤 값이 유효하지 않은 것으로 간주되면(지원되지 않는 값이어야 함), CSS에서는 전체 선언을 무시해야 합니다.

불안정 및 독점 기능의 구현

향후 안정적인 CSS 기능과의 충돌을 피하기 위해, CSSWG는 최선의 구현 방법을 따를 것을 권장합니다. 불안정한 기능과 독점 확장 기능 구현 시 참고하십시오.

비실험적 구현

명세가 Candidate Recommendation 단계에 도달하면 비실험적 구현이 가능해지며, 구현자는 명세에 따라 정확하게 구현된 CR 수준 기능에 대해 접두사 없는 구현을 배포해야 합니다.

CSS의 구현 간 상호운용성을 확보하고 유지하기 위해, CSS 작업 그룹은 비실험적 CSS 렌더러가 CSS 기능의 접두사 없는 구현을 배포하기 전에 W3C에 구현 보고서(필요시 해당 구현 보고서에 사용된 테스트케이스 포함)를 제출할 것을 요청합니다. W3C에 제출된 테스트케이스는 CSS 작업 그룹의 검토 및 수정 대상이 됩니다.

테스트케이스 및 구현 보고서 제출에 관한 추가 정보는 CSS 작업 그룹 웹사이트 https://www.w3.org/Style/CSS/Test/에서 확인할 수 있습니다. 문의는 public-css-testsuite@w3.org 메일링 리스트로 하십시오.

색인

이 명세에서 정의한 용어

참조로 정의된 용어

참고문헌

규범적 참고문헌

[CSS-ANIMATIONS-1]
Dean Jackson 외. CSS Animations Level 1. 2018년 10월 11일. WD. URL: https://www.w3.org/TR/css-animations-1/
[CSS-BOX-4]
Elika Etemad. CSS Box Model Module Level 4. 2020년 4월 21일. WD. URL: https://www.w3.org/TR/css-box-4/
[CSS-BREAK-3]
Rossen Atanassov; Elika Etemad. CSS Fragmentation Module Level 3. 2018년 12월 4일. CR. URL: https://www.w3.org/TR/css-break-3/
[CSS-CASCADE-4]
CSS Cascading and Inheritance Level 4 URL: https://www.w3.org/TR/css-cascade-4/
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 5. 2022년 1월 13일. CR. URL: https://www.w3.org/TR/css-cascade-5/
[CSS-CONDITIONAL-3]
David Baron; Elika Etemad; Chris Lilley. CSS Conditional Rules Module Level 3. 2022년 1월 13일. CR. URL: https://www.w3.org/TR/css-conditional-3/
[CSS-CONTAIN-1]
Tab Atkins Jr.; Florian Rivoal. CSS Containment Module Level 1. 2020년 12월 22일. REC. URL: https://www.w3.org/TR/css-contain-1/
[CSS-CONTAIN-2]
CSS Containment Module Level 2 URL: https://drafts.csswg.org/css-contain-2/
[CSS-DISPLAY-3]
Tab Atkins Jr.; Elika Etemad. CSS Display Module Level 3. 2021년 9월 3일. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-FONTS-5]
Myles Maxfield; Chris Lilley. CSS Fonts Module Level 5. 2021년 12월 21일. WD. URL: https://www.w3.org/TR/css-fonts-5/
[CSS-SIZING-3]
Tab Atkins Jr.; Elika Etemad. CSS Box Sizing Module Level 3. 2021년 12월 17일. WD. URL: https://www.w3.org/TR/css-sizing-3/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS Syntax Module Level 3. 2021년 12월 24일. CR. URL: https://www.w3.org/TR/css-syntax-3/
[CSS-TRANSITIONS-1]
David Baron 외. CSS Transitions. 2018년 10월 11일. WD. URL: https://www.w3.org/TR/css-transitions-1/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 2019년 6월 6일. CR. URL: https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2021년 12월 16일. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 4. 2019년 7월 30일. CR. URL: https://www.w3.org/TR/css-writing-modes-4/
[CSS2]
Bert Bos 외. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011년 6월 7일. REC. URL: https://www.w3.org/TR/CSS21/
[CSSOM-VIEW-1]
Simon Pieters. CSSOM View Module. 2016년 3월 17일. WD. URL: https://www.w3.org/TR/cssom-view-1/
[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[MEDIAQUERIES-5]
Dean Jackson 외. Media Queries Level 5. 2021년 12월 18일. WD. URL: https://www.w3.org/TR/mediaqueries-5/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997년 3월. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. Selectors Level 4. 2022년 5월 7일. WD. URL: https://www.w3.org/TR/selectors-4/
[WEB-ANIMATIONS-1]
Brian Birtles 외. Web Animations. 2021년 5월 18일. WD. URL: https://www.w3.org/TR/web-animations-1/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

정보성 참고문헌

[CSS-FONTS-4]
John Daggett; Myles Maxfield; Chris Lilley. CSS Fonts Module Level 4. 2021년 12월 21일. WD. URL: https://www.w3.org/TR/css-fonts-4/
[CSS-PSEUDO-4]
Daniel Glazman; Elika Etemad; Alan Stearns. CSS Pseudo-Elements Module Level 4. 2020년 12월 31일. WD. URL: https://www.w3.org/TR/css-pseudo-4/
[CSS-SCOPING-1]
Tab Atkins Jr.; Elika Etemad. CSS Scoping Module Level 1. 2014년 4월 3일. WD. URL: https://www.w3.org/TR/css-scoping-1/
[CSS-SHADOW-PARTS-1]
Tab Atkins Jr.; Fergal Daly. CSS Shadow Parts. 2018년 11월 15일. WD. URL: https://www.w3.org/TR/css-shadow-parts-1/
[CSS-SIZING-4]
Tab Atkins Jr.; Elika Etemad; Jen Simmons. CSS Box Sizing Module Level 4. 2021년 5월 20일. WD. URL: https://www.w3.org/TR/css-sizing-4/
[FULLSCREEN]
Philip Jägenstedt. Fullscreen API Standard. Living Standard. URL: https://fullscreen.spec.whatwg.org/

속성 색인

이름 초기값 적용 대상 상속 백분율 애니메이션 타입 정식 순서 계산된 값
container <'container-name'> [ / <'container-type'> ]? 개별 속성 참조 개별 속성 참조 개별 속성 참조 개별 속성 참조 개별 속성 참조 문법에 따름 개별 속성 참조
container-name none | <custom-ident>+ none 모든 요소 아니오 해당 없음 애니메이션 불가 문법에 따름 키워드 none 또는 식별자 목록
container-type normal || [ size | inline-size ] normal 모든 요소 아니오 해당 없음 애니메이션 불가 문법에 따름 키워드 normal 또는 size, inline-size 중 하나 이상

@container 디스크립터

이름 초기값 타입
aspect-ratio <ratio> 범위
block-size <length> 범위
height <length> 범위
inline-size <length> 범위
orientation portrait | landscape 불연속
width <length> 범위

IDL 색인

[Exposed=Window]
interface CSSContainerRule : CSSConditionRule {
};

이슈 색인

이 문서는 CSS Containment Level 2에 대한 차등 명세(diff spec)입니다. 현재 탐색적 작업 초안(Exploratory Working Draft)입니다: 실제 구현 시 Level 2를 참조하시기 바랍니다. CR 단계에 도달하면 Level 2의 텍스트를 이 초안에 병합할 예정입니다.
CSS Containment 2 § 2 강한 containment: contain 프로퍼티
CSS Containment 2 § 3 containment의 타입
일반적으로, 요소의 inline size와 block size의 관계는 예측할 수 없고 비단조적(non-monotonic)입니다. block size는 inline size가 변경될 때 임의로 위아래로 변할 수 있습니다. 무한 루프를 방지하기 위해, 레이아웃이 이전(문제가 있었던 것으로 알려진) 상태로 되돌아가지 않도록 보장합니다. 즉, 제약 조건의 단순 분석으로 가능하더라도 레이아웃은 항상 "앞으로 나아갑니다". 현재 CSS 레이아웃 명세가 이러한 규칙을 포함한다고 생각하지만, 만약 포함하지 않는 부분이 있다면 CSSWG에 알려주십시오. 오류를 수정하겠습니다.
CSSContainerRule에 대한 CSSOM API 추가 [Issue #7033]
Container Queries는 matchContainer 메서드를 가져야 합니다. 이는 matchMedia()MediaQueryList 인터페이스를 모델로 하지만, Window가 아니라 Element에 적용됩니다. 레이아웃 크기를 측정할 때 resizeObserver와 유사하게 동작하지만, 추가적인 Container Query 문법 및 기능을 제공합니다. [Issue #6205]
CSS Containment 2 § 4 요소의 콘텐츠 전체 숨기기: content-visibility 프로퍼티
CSS Containment 2 § 5 프라이버시 및 보안 고려사항
CSS Containment 2 §  변경사항