CSS 앵커 위치 지정 모듈 레벨 2

W3C 최초 공개 작업 초안,

이 문서에 대한 추가 정보
이 버전:
https://www.w3.org/TR/2025/WD-css-anchor-position-2-20251021/
최신 공개 버전:
https://www.w3.org/TR/css-anchor-position-2/
편집자 초안:
https://drafts.csswg.org/css-anchor-position-2/
히스토리:
https://www.w3.org/standards/history/css-anchor-position-2/
피드백:
CSSWG 이슈 저장소
편집자:
Tab Atkins-Bittner (Google)
Elika J. Etemad / fantasai (Apple)
Ian Kilpatrick (Google)
스펙 수정 제안:
GitHub 에디터
델타 스펙:

요약

이 명세서는 앵커 위치 지정을 정의합니다. 위치가 지정된 요소가 페이지의 한 곳 또는 여러 앵커 요소를 기준으로 자신의 크기와 위치를 정할 수 있습니다.

CSS는 구조화된 문서(HTML 및 XML 등)의 화면, 인쇄물 등에서 렌더링을 기술하는 언어입니다.

이 문서의 상태

이 섹션은 문서가 발행된 시점의 상태를 설명합니다. 현재 W3C 발행물 목록과 이 기술 보고서의 최신 개정판은 W3C 표준 및 초안 색인에서 확인할 수 있습니다.

이 문서는 CSS 작업 그룹에서 최초 공개 작업 초안으로 권고안 트랙을 사용해 발행되었습니다. 최초 공개 작업 초안으로 발행되었다고 해서 W3C 및 회원의 승인이나 지지를 의미하지는 않습니다.

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

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

이 문서는 2025년 8월 18일 W3C 프로세스 문서에 따라 관리됩니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 작성되었습니다. W3C는 그룹 산출물과 관련된 공개 특허 공개 목록을 유지합니다. 해당 페이지에는 특허 공개 방법도 안내되어 있습니다. 개인이 본인이 Essential Claim(s)를 포함한다고 믿는 특허를 알게 된 경우, 특허 정책 섹션 6에 따라 정보를 공개해야 합니다.

1. 델타 명세

이 문서는 델타 명세로, 현재 [CSS-ANCHOR-POSITION-1]의 CSS 앵커 위치 지정 레벨 1과의 차이점만을 포함합니다.

2. 앵커 위치 지정을 위한 컨테이너 쿼리

이 섹션은 컨테이너 쿼리[css-conditional-5]에서 확장하여, 앵커 위치 지정을 사용해 요소의 특정 속성을 쿼리할 수 있도록 합니다.

2.1. container-typeanchored 확장

이 명세서는 container-type 속성을 CSS Conditional 5 § 5.1 쿼리 컨테이너 생성: container-type 속성에서 정의된 것에 anchored라는 키워드를 추가하여 확장합니다. anchoredscroll-statesize와 같은 기존 컨테이너 타입과 조합될 수 있습니다:

normal | [ [ size | inline-size ] || scroll-state || anchored ]
anchored
쿼리 컨테이너컨테이너 쿼리용으로 설정하며, 앵커 위치가 지정된 요소의 자손들이 앵커링의 특정 특징을 기반으로 스타일링될 수 있도록 합니다. (현재는 position-try-fallbacks 중 어떤 것이 적용되는지에 한정됨)

anchored container-type은 스타일 컨테인먼트쿼리 컨테이너에 적용합니다.

참고: 스타일 컨테인먼트는 아래와 같이 카운터를 사용하는 경우 레이아웃 사이클을 방지하기 위해 필요합니다:
  • anchored 컨테이너가 있습니다.

  • 앵커 컨테이너의 자손이 fallback 쿼리를 바탕으로 카운터를 증가시킵니다.

  • 앵커 컨테이너 뒤에 트리 순서로 따라오는 in-flow 요소가 카운터를 사용해 콘텐츠를 생성하며, 해당 in-flow 요소의 크기에 영향을 줍니다.

  • in-flow 요소가 앵커 요소의 위치/크기에 영향을 줍니다. in-flow앵커 요소일 수도 있습니다.

  • 앵커 요소의 변경된 위치/크기가 어떤 fallback이 선택되는지에 영향을 주고, 이는 앵커 쿼리 평가와 카운터 증가에 다시 영향을 줍니다.

컨테이너는 단순히 anchored일 수도 있고, 다른 컨테이너 타입과 함께 사용할 수도 있습니다:
#anchored { container-type: anchored; }
#anchored-size { container-type: anchored inline-size; }

2.2. @container 문법의 anchored 쿼리 확장

anchored 컨테이너를 쿼리하려면, anchored() 함수가 @container 문법에 추가됩니다. 이 함수는 컨테이너 쿼리 문법을 다음과 같이 확장합니다. '<query-in-parens>' 문법에 다음이 추가됩니다:

<query-in-parens> = ...
                  | anchored( <anchored-query> )

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

2.3. 앵커 컨테이너 기능

2.3.1. 적용된 position-try-fallbacks: fallback 기능

이름: fallback
대상: @container
값: none | [ [<dashed-ident> || <try-tactic>] | <position-area-query> ]
타입: 이산형

fallback 컨테이너 기능은 앵커 위치 지정 요소에 어떤 position-try-fallbacks 옵션이 적용되었는지 쿼리합니다.

none
anchored 컨테이너에는 position-try-fallbacks가 적용되지 않습니다.
<dashed-ident> || <try-tactic>
anchored 컨테이너는 <dashed-ident><try-tactic>의 조합이 position-try-fallbacks에서 적용된 것과 일치할 경우 매칭됩니다. <dashed-ident> 또는 <try-tactic>이 쿼리 값에서 빠져있으면, 적용된 값에서도 빠져있어야 하며, 반대로도 마찬가지여야 매칭됩니다.

<dashed-ident> 시도 규칙 이름은 트리 범위 이름으로 간주되지 않습니다.

<try-tactic>의 순서는 중요합니다. 예를 들어 flip-start flip-blockflip-block flip-start는 다르므로, 순서도 쿼리에서 일치해야 합니다.

<position-area-query>
anchored 컨테이너가 <position-area>position-try-fallbacks에서 적용한 경우에 매칭됩니다. fallback에서 적용된 <position-area>와 쿼리 값이 동일한 물리적 영역을 나타내면 매칭됩니다. 즉, block-starttopwriting-modehorizontal-tb일 때 일치합니다.

any로 쿼리 값을 지정하면 해당 축에서 항상 매칭됩니다.

요소가 앵커의 왼쪽이나 오른쪽에 위치되는지에 따라 방향이 달라지는 화살표를 추가하기:
#container {
  container-type: anchored;
  position: absolute;
  position-anchor: --a;
  position-area: left;
  position-try-fallbacks: right;
  &::before { content: ">"; }

  @container anchored(fallback: right) {
    &::before { content: "<"; };
  }
}
'<try-tactic>'로 명명된 fallback 옵션 매칭:
.anchored {
  container-type: anchored;
  position-try-fallbacks: --foo, --bar flip-inline;

  @container anchored(fallback: --bar flip-inline) {
    /* '--bar' fallback이 적용되면 적용됨 */
    .inner { background-color: green; }
  }
  @container anchored(fallback: --bar) {
    /* try-tactic까지 일치해야 하므로 적용되지 않음 */
    .inner { background-color: red; }
  }
}
수직 writing-mode에서 '<position-area>' fallback 옵션 매칭:
.anchored {
  container-type: anchored;
  position-anchor: --a;
  position-try-fallbacks: right;
  writing-mode: vertical-rl;

  @container anchored(fallback: self-block-start) {
    /* 'right' fallback이 적용되면, block-start가 'vertical-rl'에서는 'right'이므로 적용됨 */
    .inner { background-color: green; }
  }
}
any와 함께 '<position-area>' fallback 옵션 매칭:
.anchored {
  container-type: anchored;
  position-anchor: --a;
  position-try-fallbacks: bottom right;
  writing-mode: vertical-rl;

  @container anchored(fallback: bottom any) {
    /* 'any'가 'right'와 매칭되어 적용됨 */
    .inner { color: lime; }
  }
  @container anchored(fallback: right) {
    /* 수직 축의 암시적 'any'가 'bottom'과 매칭되어 적용됨 */
    .inner { background-color: green; }
  }
}

2.3.2. <position-area-query> 값의 문법

position-area fallback을 쿼리할 때 사용하는 값의 문법은 <position-area>와 같으며, 모든 생성 규칙에 any 키워드가 추가로 들어갑니다:

<position-area-query> = [
  [ left | center | right | span-left | span-right
  | x-start | x-end | span-x-start | span-x-end
  | self-x-start | self-x-end | span-self-x-start | span-self-x-end
  | span-all | any ]
  ||
  [ top | center | bottom | span-top | span-bottom
  | y-start | y-end | span-y-start | span-y-end
  | self-y-start | self-y-end | span-self-y-start | span-self-y-end
  | span-all | any ]
|
  [ block-start | center | block-end | span-block-start | span-block-end | span-all | any ]
  ||
  [ inline-start | center | inline-end | span-inline-start | span-inline-end
  | span-all | any ]
|
  [ self-block-start | center | self-block-end | span-self-block-start
  | span-self-block-end | span-all | any ]
  ||
  [ self-inline-start | center | self-inline-end | span-self-inline-start
  | span-self-inline-end | span-all | any ]
|
  [ start | center | end | span-start | span-end | span-all | any ]{1,2}
|
  [ self-start | center | self-end | span-self-start | span-self-end | span-all | any ]{1,2}
]
any

any는 하나 또는 두 축 모두에 사용할 수 있습니다. 어떤 축을 의미하는지 모호하며, '<position-area>'의 startcenter처럼 축 할당 및 단일 키워드 값 복제 시 다른 모호한 키워드와 같이 처리됩니다.

start, end, self-start, self-end
top, bottom, left, right
y-start, y-end, self-y-start, self-y-end
x-start, x-end, self-x-start, self-x-end
block-start, block-end, self-block-start, self-block-end
inline-start, inline-end, self-inline-start, self-inline-end
center
span-start, span-end, span-self-start, span-self-end
span-top, span-bottom, span-left, span-right
span-y-start, span-y-end, span-self-y-start, span-self-y-end
span-x-start, span-x-end, span-self-x-start, span-self-x-end
span-block-start, span-block-end, span-self-block-start, span-self-block-end
span-inline-start, span-inline-end, span-self-inline-start, span-self-inline-end
span-all

'<position-area>'의 해당 정의를 참조하세요.

키워드가 하나만 주어진 경우, '<position-area-query>'는 해당 키워드가 축에 대해 모호하다면 두 번째 키워드가 any인 것처럼 동작합니다. 이는 '<position-area>'에서 단일 키워드를 처리할 때 두 번째 키워드를 span-all로 취급하는 것과 다릅니다. 그 외에는 '<position-area-query>'가 축 할당 측면에서 '<position-area>'와 같이 동작합니다.

3. 보안 고려사항

이 문서에 대해 제기된 보안 이슈는 없습니다.

4. 프라이버시 고려사항

이 문서에 대해 제기된 프라이버시 이슈는 없습니다.

규격 준수

문서 규약

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

이 명세서의 모든 텍스트는 명시적으로 비규범적임을 표시하거나, 예시, 노트인 섹션을 제외하고는 규범적입니다. [RFC2119]

본 명세서의 예시는 “for example”로 시작하거나 class="example"로 규범 텍스트와 구분되어 표시됩니다, 예시:

이것은 안내용 예시입니다.

안내 노트는 “Note”로 시작하며, class="note"로 규범 텍스트와 구분되어 표시됩니다, 예시:

Note, 이것은 안내용 노트입니다.

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

규격 준수 클래스

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

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

스타일시트는 본 모듈에서 정의된 문법을 사용하는 모든 선언이 CSS 일반 문법 및 각 기능별 개별 문법에 따라 유효하다면, 본 명세서에 적합합니다.

렌더러는 해당 스타일시트를 관련 명세서에서 정의한 대로 해석하는 것 외에, 본 명세서에서 정의된 모든 기능을 올바르게 구문 분석 및 문서 렌더링을 통해 지원한다면, 본 명세서에 적합합니다. 단, UA가 장치의 한계로 인해 문서를 올바르게 렌더링하지 못하는 경우, UA가 비준수임을 의미하지 않습니다. (예: UA는 흑백 모니터에서 색상을 렌더링할 필요는 없습니다.)

저작 도구는 CSS 일반 문법 및 본 모듈의 각 기능별 개별 문법에 따라 구문적으로 올바른 스타일시트를 작성하고, 본 모듈에서 설명한 스타일시트의 모든 기타 규격 준수 요구사항을 충족하면, 본 명세서에 적합합니다.

부분 구현체

작성자가 호환성 있는 파싱 규칙을 활용해 fallback 값을 지정할 수 있도록, CSS 렌더러는 반드시 지원 가능한 수준의 기능이 없는 at-rule, 속성, 속성 값, 키워드 등 모든 구문 구조를 무효(적절히 무시)로 처리해야 합니다. 특히, 사용자 에이전트는 선택적으로 지원하지 않는 구성 값만 무시하고, 지원되는 값을 하나의 다중값 속성 선언에서 적용해서는 안 됩니다: 어떤 값이 무효(지원하지 않는 값은 반드시 무효로 간주)로 처리되면, CSS는 전체 선언을 무시해야 함을 요구합니다.

불안정 및 독점 기능 구현

향후 안정적인 CSS 기능과의 충돌을 방지하기 위해, CSSWG는 모범 사례를 따라 불안정 기능 및 독점 확장 구현을 권장합니다.

비실험적 구현체

명세서가 Candidate Recommendation 단계에 도달하면, 비실험적 구현이 가능해지며, 구현자는 본 명세서에 따라 올바르게 구현되었음을 입증할 수 있는 CR 수준의 기능에 대해 반드시 접두사 없는 구현을 배포해야 합니다.

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

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

색인

이 명세서에서 정의한 용어

참조로 정의된 용어

참고 문헌

강제 참고 문헌

[CSS-ANCHOR-POSITION-1]
Tab Atkins Jr.; Elika Etemad; Ian Kilpatrick. CSS Anchor Positioning. 2025년 10월 7일. WD. URL: https://www.w3.org/TR/css-anchor-position-1/
[CSS-CONDITIONAL-5]
Chris Lilley; 외. CSS Conditional Rules Module Level 5. 2024년 11월 5일. WD. URL: https://www.w3.org/TR/css-conditional-5/
[CSS-CONTAIN-2]
Tab Atkins Jr.; Florian Rivoal; Vladimir Levin. CSS Containment Module Level 2. 2022년 9월 17일. WD. URL: https://www.w3.org/TR/css-contain-2/
[CSS-SCOPING-1]
Tab Atkins Jr.; Elika Etemad. CSS Scoping Module Level 1. 2014년 4월 3일. FPWD. URL: https://www.w3.org/TR/css-scoping-1/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2024년 3월 12일. 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/
[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

안내 참고 문헌

[CSS-DISPLAY-4]
Elika Etemad; Tab Atkins Jr.. CSS Display Module Level 4. 2024년 12월 19일. FPWD. URL: https://www.w3.org/TR/css-display-4/
[CSS-LISTS-3]
Elika Etemad; Tab Atkins Jr.. CSS Lists and Counters Module Level 3. 2020년 11월 17일. WD. URL: https://www.w3.org/TR/css-lists-3/
[CSS2]
Bert Bos; 외. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011년 6월 7일. REC. URL: https://www.w3.org/TR/CSS2/

속성 색인

정의된 속성이 없습니다.

@container 디스크립터

이름 초기값 타입
fallback none | [ [<dashed-ident> || <try-tactic>] | <position-area-query> ] 이산형