CSS 계단식 스타일과 상속 레벨 5

W3C 후보 권고안 스냅샷,

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2022/CR-css-cascade-5-20220113/
최신 공개 버전:
https://www.w3.org/TR/css-cascade-5/
에디터스 드래프트:
https://drafts.csswg.org/css-cascade-5/
이전 버전:
히스토리:
https://www.w3.org/standards/history/css-cascade-5
구현 보고서:
https://wpt.fyi/results/css/css-cascade
피드백:
CSSWG 이슈 저장소
명세 내 인라인
편집자:
Elika J. Etemad / fantasai (초대 전문가)
Miriam E. Suzanne (초대 전문가)
Tab Atkins Jr. (Google)
이 명세에 대한 수정 제안:
GitHub 에디터

요약

이 CSS 모듈은 스타일 규칙을 정리하고 모든 요소의 모든 속성에 값을 할당하는 방법을 설명합니다. 계단식과 상속을 통해 모든 요소의 모든 속성에 값이 전달됩니다.

이번 단계에서 새롭게 추가된 것은 cascade layers입니다.

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

이 문서의 상태

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

이 문서는 CSS 작업 그룹에서 후보 권고 스냅샷으로 권고 트랙을 사용하여 공개되었습니다. 후보 권고로서의 공개는 W3C 및 그 회원의 지지를 의미하지 않습니다. 후보 권고 스냅샷은 폭넓은 검토를 받았으며, 구현 경험을 수집하고 작업 그룹 구성원들이 구현에 대해 로열티 없는 라이선스를 약속했습니다. 이 문서는 W3C 권고로 채택될 예정이며, 추가 피드백을 수집하기 위해 최소한 까지 후보 권고로 유지됩니다.

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

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

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 작성되었습니다. W3C는 그룹 산출물과 관련하여 제출된 공개 특허 목록을 유지합니다. 해당 페이지에는 특허 공개 방법도 포함되어 있습니다. 개인이 필수 청구권(Essential Claim(s))이 포함된 특허에 대해 실제로 알고 있다면, W3C 특허 정책 6장에 따라 정보를 공개해야 합니다.

다음 기능들은 위험군(at-risk)에 속하며, CR 기간 동안 삭제될 수 있습니다:

“위험군(at-risk)”은 W3C 프로세스의 전문 용어이며, 해당 기능이 실제로 삭제되거나 지연될 위험이 있다는 의미는 아닙니다. 이 용어는 작업 그룹이 해당 기능이 호환성 있게 구현되기 어려울 수 있다고 판단할 때 사용하며, 추후 권고안(Proposed Rec) 단계로 전환할 때 기능을 삭제할 수 있게 해줍니다. 이 경우, 해당 기능이 없는 새 후보 권고를 따로 공개하지 않아도 됩니다.

1. 소개

CSS는 문서의 렌더링을 지시하는 속성이라고 불리는 유한한 매개변수 집합을 정의합니다. 각각의 속성은 이름(예: color, font-size, 또는 border-style), 값의 공간 (예: <color>, <length-percentage>, [ solid | dashed | dotted | … ]), 그리고 문서의 렌더링에 대해 정의된 동작을 가집니다. 속성 값들은 속성 선언을 통해 문서의 다양한 부분에 할당되며, 해당 요소나 박스에 대해 (예: red, 12pt, dotted) 속성에 값을 할당합니다.

CSS의 근본적인 설계 원칙 중 하나는 계단식입니다. 이를 통해 여러 스타일 시트가 문서의 표현에 영향을 줄 수 있습니다. 서로 다른 선언이 같은 요소/속성 조합에 대해 값을 설정하려고 할 때, 그 충돌은 반드시 해결되어야 합니다.

반대로, 어떤 선언도 요소/속성 조합에 대해 값을 설정하지 않을 때의 문제가 있습니다. 이런 경우에는 상속이나 속성의 초기값을 참고하여 값을 찾게 됩니다.

계단식기본값 처리 프로세스는 선언의 집합을 입력으로 받아, 각 요소의 각 속성에 대해 지정 값을 출력합니다.

문서 내 모든 요소의 모든 속성에 대해 지정 값을 찾는 규칙은 이 명세에서 설명합니다. 페이지 컨텍스트와 마진 박스에서 지정 값을 찾는 규칙은 [css-page-3]에 설명되어 있습니다.

1.1. 모듈 상호작용

이 절은 규범적입니다.

이 모듈은 [CSS2] 6장에서 정의된 속성값 할당, 계단식 처리, 상속에 대한 규칙을 대체 및 확장합니다.

다른 CSS 모듈들은 여기서 정의된 일부 구문과 기능의 정의를 확장할 수 있습니다. 예를 들어 Media Queries Level 4 명세는 이 모듈과 결합할 때 <media-query> 값 타입의 정의를 확장합니다.

이 명세의 목적상, 텍스트 노드는 해당 요소의 자식 요소로 취급되며, 모든 속성 집합을 가집니다. 선택자로 타겟팅될 수 없기 때문에 모든 계산값은 기본값 처리에 의해 할당됩니다.

2. 스타일 시트 가져오기: @import 규칙

@import 규칙은 사용자가 다른 스타일 시트에서 스타일 규칙을 가져올 수 있게 해줍니다. @import 규칙이 유효한 스타일시트를 참조하면, 사용자 에이전트는 해당 스타일시트의 내용을 @import 규칙이 위치한 곳에 직접 작성된 것처럼 처리해야 하며, 두 가지 예외가 있습니다:

예를 들어, 가져온 스타일시트의 스타일 규칙 내 선언은 @import가 위치한 지점에 직접 작성된 것처럼 계단식에 영향을 줍니다.

모든 @import 규칙은 스타일시트 내 다른 유효한 at-규칙 및 스타일 규칙보다 앞에 와야 하며 (@charset 및 빈 @layer 정의는 무시함) 그리고 이전 @import 규칙과 그 사이에 다른 유효한 at-규칙 또는 스타일 규칙이 있어서는 안 되며, 그렇지 않으면 @import 규칙은 무효입니다. @import의 구문은 다음과 같습니다:

@import [ <url> | <string> ]
        [ layer | layer(<layer-name>) ]?
        [ supports( [ <supports-condition> | <declaration> ] ) ]?
        <media-query-list>? ;

여기서:

아래 조건부 @import 규칙은 UA가 display: flex지원할 때에만 스타일시트를 로드하며, handheld 기기 중 최대 뷰포트 너비가 400px인 경우에만 스타일시트를 적용합니다.
@import url("narrow.css") supports(display: flex) handheld and (max-width: 400px);
아래 레이어 가져오기는 각각 framework.component 레이어와 이름 없는 레이어에 스타일시트를 로드합니다:
@import url("tabs.css") layer(framework.component);
@import url("override.css") layer();

<string>이 제공된 경우, 동일한 값의 <url>로 해석되어야 합니다.

다음 두 줄은 의미가 동일하며, @import의 두 가지 구문(하나는 url(), 하나는 문자열)을 보여줍니다:
@import "mystyle.css";
@import url("mystyle.css");

2.1. 조건부 @import 규칙

가져오기 조건을 통해 가져오기를 미디어 또는 기능 지원에 따라 다르게 적용할 수 있습니다. 가져오기 조건이 없으면, 가져오기는 무조건 적용됩니다. (<media-query-list>all을 지정하면 같은 효과입니다.) 가져오기 조건이 일치하지 않으면, 가져온 스타일시트의 규칙은 적용되지 않으며, 이는 가져온 스타일시트가 해당 조건으로 @media 및/또는 @supports 블록에 감싸진 것과 동일하게 처리됩니다.

아래 규칙들은 @import 규칙을 미디어에 따라 적용하는 방법을 보여줍니다:
@import url("fineprint.css") print;
@import url("bluish.css") projection, tv;
@import url("narrow.css") handheld and (max-width: 400px);

따라서 사용자 에이전트는 가져오기 조건이 일치하지 않는 한 조건부 가져오기를 가져오지 않을 수 있습니다. 또한 <supports-condition>이 가져온 스타일시트의 적용을 막으면, UA는 반드시 스타일시트를 가져오지 않아야 하며(다른 링크로 로드되는 경우는 제외) 반드시 import 규칙의 CSSImportRule.styleSheet 값에 null을 반환해야 합니다 (다른 링크로 로드된 경우에도).

아래 규칙은 작성자가 레거시 사용자 에이전트에 대체 규칙을 제공하면서, 최신 사용자 에이전트의 네트워크 성능에는 영향을 주지 않는 방법을 보여줍니다:
@import url("fallback-layout.css") supports(not (display: flex));
@supports (display: flex) {
  ...
}

가져오기 조건<media-query-list>로 제공되며, 이는 미디어 쿼리 리스트로 파싱되고 해석됩니다. 그리고 <supports-condition>은 [[supports query]]로 파싱되고 해석됩니다. <supports-condition> 대신 <declaration>이 제공된 경우, 이는 <supports-decl> (즉, 추가 괄호가 암시됨)로 해석되어야 하며, <supports-condition>으로 취급됩니다.

예를 들어, 아래 두 줄은 의미가 동일합니다:
@import "mystyle.css" supports(display: flex);
@import "mystyle.css" supports((display: flex));

가져오기 조건의 평가와 전체 구문은 Media Queries [MEDIAQ]CSS 조건부 규칙 [CSS-CONDITIONAL-3] 명세에서 정의됩니다.

2.2. 스타일시트 가져오기 처리

동일한 스타일시트가 문서 내 여러 위치에서 import되거나 link된 경우, 사용자 에이전트는 각각의 링크를 독립된 스타일시트에 대한 링크처럼 처리(또는 그런 것처럼 동작)해야 합니다.

참고: 이는 리소스 가져오기에 대한 요구사항이 아니라, 스타일시트가 CSSOM에 반영되고 이 명세 등에서 사용되는 방식에 관한 것입니다. 적절한 캐싱을 전제하면, UA가 스타일시트를 한 번만 가져오는 것이 적합합니다. 여러 번 import되거나 연결되어 있더라도 말입니다.

가져온 스타일시트의 계단식 소스(origin)는 해당 스타일시트를 import한 스타일시트의 계단식 소스(origin)입니다.

가져온 스타일시트의 환경 인코딩은 해당 스타일시트를 import한 스타일시트의 인코딩입니다. [css-syntax-3]

2.3. CSS 스타일시트의 Content-Type

가져온 스타일시트의 처리는 연결된 리소스의 실제 타입에 따라 달라집니다:

연결된 리소스의 타입이 text/css인 경우, 반드시 CSS 스타일시트로 해석되어야 합니다. 그렇지 않으면 네트워크 오류로 해석되어야 합니다.

3. 축약 속성

일부 속성은 축약 속성입니다. 즉, 하나의 속성으로 여러 속성의 값을 지정할 수 있습니다. 축약 속성은 자신의 모든 세부(롱핸드) 속성(sub-property)을 마치 그 자리에 모두 펼친 것처럼 설정합니다.

축약 속성 형식에서 값을 생략하면, 별도 정의가 없는 한, 누락된 각 세부 속성(sub-property)초기값이 할당됩니다.

이는 축약 속성 선언이 항상 모든 세부 속성을 설정함을 의미합니다. 명시적으로 설정하지 않은 것도 포함됩니다. 부주의하게 사용하면 일부 세부 속성이 의도치 않게 리셋될 수 있습니다. 신중히 사용하면 축약 속성으로 다른 소스에서 계단식된 세부 속성을 리셋하여 "초기 상태(blank slate)"를 보장할 수 있습니다.

예를 들어, background: greenbackground-color: green 대신 작성하면, 배경색이 background-image로 이미지를 설정한 이전 선언을 덮어쓰게 됩니다.

예를 들어, CSS Level 1의 font 속성은 축약 속성으로, font-style, font-variant, font-weight, font-size, line-height, font-family를 한 번에 설정할 수 있습니다. 아래 예시처럼 여러 선언을:
h1 {
  font-weight: bold;
  font-size: 12pt;
  line-height: 14pt;
  font-family: Helvetica;
  font-variant: normal;
  font-style: normal;
}

다음과 같이 축약할 수 있습니다

h1 { font: bold 12pt/14pt Helvetica }

CSS에 더 많은 font 세부 속성(sub-property)이 추가되더라도, 축약 선언은 그 값들도 초기값으로 리셋합니다.

특정 경우, 축약 속성에 특별한 구문이나 키워드가 있어 세부 속성(sub-property)의 값과 직접적으로 대응되지 않을 수 있습니다. (이 경우 축약 속성이 값의 확장(expansion)을 명시적으로 정의합니다.)

다른 경우, 속성이 리셋 전용 세부 속성(reset-only sub-property)일 수 있습니다: 다른 세부 속성처럼, 축약 속성에서 명시되지 않으면 초기값으로 리셋되지만, 그 값을 직접 설정할 구문이 축약 속성에는 포함되어 있지 않을 수 있습니다. 예를 들어, border 축약 속성은 border-image를 초기값 none으로 리셋하지만, 다른 값으로 설정할 구문은 없습니다. [css-backgrounds-3]

축약 속성CSS 전역 키워드(CSS-wide keywords) [css-values-3]가 지정되면, 모든 세부 속성이 해당 키워드로 설정되며, 리셋 전용 세부 속성도 포함됩니다. (이 키워드들은 축약 속성 내에서 다른 값과 함께 선언할 수 없습니다.)

축약 속성!important를 선언하는 것은 모든 세부 속성!important를 선언하는 것과 동일합니다.

3.1. 속성 별칭(Aliasing)

속성은 일정 기간 지원된 후 이름이 변경되는 경우가 있습니다. 공급업체 접두사(vendor-prefixed) 속성이 표준화되는 경우가 그 예입니다. 호환성을 위해 기존 이름도 계속 지원해야 하지만, 새로운 이름이 우선됩니다. 이를 위해 CSS는 이전 구문을 새로운 구문으로 "별칭(alias)"하는 두 가지 방법을 정의합니다.

레거시 이름 별칭(legacy name alias)
기존 속성의 값 구문이 새 속성과 동일하다면, 두 이름은 대소문자 변환처럼 파싱 시 별칭 처리됩니다: 파싱 시 기존 속성은 새 속성으로 변환됩니다. 이 변환은 CSSOM에서도 적용되며, 문자열 인자와 속성 접근자 모두에 해당합니다: 기존 속성 이름으로 요청하면 투명하게 새 속성 이름에 전달됩니다.
예를 들어, old-name레거시 이름 별칭이라면, getComputedStyle(el).oldNamenewName 속성의 계산된 스타일을 반환하며, el.style.setPropertyValue("old-name", "value")new-name 속성에 "value"를 설정합니다.
레거시 축약(legacy shorthand)
기존 속성이 새 속성과 구문이 다르면, 두 이름은 축약 속성 메커니즘으로 별칭 처리됩니다. 이러한 축약은 레거시 축약으로 정의되며, 사용은 폐기(deprecated)되었습니다. 그 외에는 일반 축약과 동일하게 동작하지만, CSSOM은 선언을 직렬화할 때 이를 사용하지 않습니다. [CSSOM]
예를 들어, page-break-* 속성들은 레거시 축약이며, break-* 속성의 별칭입니다 (참고: CSS Fragmentation 3 § 3.4 Page Break Aliases: the page-break-before, page-break-after, and page-break-inside properties).

page-break-before: always를 설정하면 파싱 시 break-before: page로 확장됩니다. 마치 다른 축약 속성처럼 동작합니다. 마찬가지로 break-before: page가 설정된 경우, getComputedStyle(el).pageBreakBefore 호출 시 "always"가 반환됩니다. 하지만 스타일 블록을 직렬화할 때 (참고: CSSOM 1 § 6.7.2 Serializing CSS Values), page-break-before 속성은 절대 직렬화 대상 축약으로 선택되지 않으며, 원래 속성 또는 break-before가 지정되었는지와 무관합니다; 대신 break-before가 항상 선택됩니다.

3.2. 모든 속성 리셋: all 속성

이름(Name): all
값(Value): initial | inherit | unset | revert | revert-layer
초기값(Initial): 각 속성별 참조
적용 대상(Applies to): 각 속성별 참조
상속됨(Inherited): 각 속성별 참조
퍼센트(Percentages): 각 속성별 참조
계산값(Computed value): 각 속성별 참조
애니메이션 타입(Animation type): 각 속성별 참조
정규 순서(Canonical order): 문법 기준(per grammar)

all 속성은 축약 속성으로, 모든 CSS 속성을 리셋합니다. 단, directionunicode-bidi는 제외됩니다. 이 속성은 CSS 전역 키워드(CSS-wide keywords)만 허용합니다. 사용자 정의 속성(custom properties)은 리셋하지 않습니다. [css-variables-1]

참고: 제외된 CSS 속성 directionunicode-bidi는 실제로 마크업 수준(feature)이며, 작성자의 스타일 시트에서 설정하면 안 됩니다. (이들은 CSS 속성으로 존재하지만, UA가 지원하지 않는 문서 언어를 스타일링하기 위함입니다.) 작성자는 HTML의 dir 속성 등 적절한 마크업을 사용해야 합니다. [css-writing-modes-3]

예를 들어, 작성자가 요소에 all: initial을 지정하면, 모든 상속이 차단되고 모든 속성이 리셋됩니다. 작성자, 사용자, UA 계단식 레벨에 규칙이 없는 것처럼 동작합니다.

이는 페이지에 포함된 "위젯"의 루트 요소 등에 유용할 수 있으며, 바깥 페이지의 스타일을 상속받고 싶지 않은 경우에 사용합니다. 다만 해당 요소에 적용된 "기본" 스타일 (예: display: block 등 블록 요소에 UA 스타일시트에서 적용된 것) 역시 모두 제거됨에 유의해야 합니다.

4. 값 처리

사용자 에이전트가 문서를 파싱하고 문서 트리를 구성한 후, 트리 내의 모든 요소, 그리고 이에 대응되는 포맷 구조의 모든 박스에 대상 미디어 타입에 적용되는 모든 속성에 값을 할당해야 합니다.

주어진 요소 또는 박스의 CSS 속성의 최종 값은 여러 단계의 계산 결과입니다:

  1. 먼저, 각 요소의 각 속성에 적용된 선언값(declared values)을 모두 수집합니다. 요소에는 0개 또는 여러 개의 선언값이 적용될 수 있습니다.
  2. 계단식(cascading)을 통해 계단식 값(cascaded value)이 결정됩니다. 각 속성, 각 요소별로 최대 1개의 계단식 값이 존재합니다.
  3. 기본값 처리(defaulting)를 통해 지정 값(specified value)이 결정됩니다. 모든 요소는 각 속성별로 정확히 하나의 지정 값을 가집니다.
  4. 값 의존성 해결을 통해 계산 값(computed value)이 결정됩니다. 모든 요소는 각 속성별로 정확히 하나의 계산 값을 가집니다.
  5. 문서 포맷팅을 통해 사용 값(used value)이 결정됩니다. 해당 속성이 요소에 적용되는 경우에만 사용 값이 존재합니다.
  6. 마지막으로, 사용 값이 표시 환경의 제약에 따라 실제 값(actual value)으로 변환됩니다. 사용 값과 같이, 특정 속성이 요소에 대해 실제 값을 가질 수도 있고, 그렇지 않을 수도 있습니다.

연결되지 않은(connected) 요소 또는 문서의 평탄화(flattened) 요소 트리에 속하지 않는 요소는 CSS 값 처리에 참여하지 않으며, 선언값, 계단식 값, 지정 값, 계산 값, 사용 값, 실제 값을 가지지 않습니다. (예를 들어 style 속성으로 스타일 선언이 할당된 경우에도 마찬가지입니다.)

4.1. 선언값(Declared Values)

각 속성 선언은 요소에 적용될 때 해당 속성에 대한 선언값(declared value)을 제공합니다. 자세한 내용은 선언 필터링을 참고하세요.

이 값들은 계단식 처리(cascade)로 단일 "우승 값(winning value)"을 선택하는 과정에서 처리됩니다.

4.1.1. 값 별칭(Value Aliasing)

일부 속성 값에는 레거시 값 별칭(legacy value aliases)이 있습니다: 파싱 시, 레거시 구문이 새 구문으로 변환되어 파싱된 입력과 다른 선언값이 생성됩니다. 이러한 별칭은 대개 레거시 호환성 요구를 처리하기 위해 사용되며, 공급업체 접두사(vendor-prefixed) 값을 표준 값으로 변환하는 데 활용됩니다.

4.2. 계단식 값(Cascaded Values)

계단식 값(cascaded value)계단식 처리의 결과입니다: 계단식에서 "우승"한 선언값을 나타냅니다. (계단식 출력(output of the cascade)에서 가장 먼저 정렬된 값) 계단식 출력이 빈 리스트라면, 계단식 값은 없습니다.

4.3. 지정 값(Specified Values)

지정 값(specified value)은 스타일시트 작성자가 해당 요소에 의도한 주어진 속성의 값입니다. 계단식 값기본값 처리(defaulting) 과정에 넣어 모든 요소의 모든 속성에 지정 값이 존재하도록 보장합니다.

대부분의 경우 지정 값계단식 값입니다. 단, 계단식 값이 전혀 없으면 지정 값기본값 처리로 결정됩니다. CSS 전역 키워드가 계단식 값이 되는 경우에는 해당 키워드에 따라 지정 값이 설정됩니다. 자세한 내용은 § 7.3 명시적 기본값 처리를 참고하세요.

4.4. 계산 값(Computed Values)

계산 값(computed value)지정 값을 속성 정의 테이블의 "계산 값" 행에 따라 해결한 결과로, 일반적으로 상속을 준비하기 위해 절대값화(absolutizing)됩니다. 상속(inheritance)을 위해서입니다.

참고: 계산 값상속 시 부모에서 자식으로 전달되는 값입니다. 역사적 이유로, getComputedStyle() 함수가 반환하는 값과는 다를 수 있습니다. 이 함수는 때때로 사용 값을 반환하기 때문입니다. [CSSOM] 또한 계산 값은 추상 데이터 표현체로, 정의는 데이터 표현을 반영하며, 데이터 직렬화 방식과는 다릅니다. 예를 들어, 직렬화 규칙에서는 파싱 시 암시되는 특정 값을 생략할 수 있지만, 이런 값도 계산 값에 포함됩니다.

지정 값은 절대값(예: red 또는 2mm)이거나, 상대값(예: auto, 2em)일 수 있습니다. 상대값을 계산할 때는 일반적으로 절대값으로 변환합니다:

아래 표의 예시(f), (g), (h)를 참고하세요.

참고: 일반적으로 계산 값지정 값을 문서 레이아웃이나 비용이 크거나 병렬화가 어려운 작업(네트워크 요청 해결, 부모 외의 값 참조 등)을 하지 않고 가능한 한 많이 해결합니다.

계산 값은 속성이 적용되지 않더라도 존재합니다. 단, 일부 속성은 속성이 요소에 적용되는지 여부에 따라 계산 값 결정 방식을 변경할 수 있습니다.

4.5. 사용 값(Used Values)

사용 값(used value)계산 값에 남은 계산을 완료하여 문서 포맷팅에 사용되는 절대 이론값으로 만든 결과입니다.

예를 들어, width: auto 선언은 요소의 조상 레이아웃을 알지 못하면 길이로 해결할 수 없으므로, 계산 값auto이고, 사용 값100px처럼 절대 길이입니다. [CSS2]

또 다른 예로, <div>는 계산된 break-before 값이 auto일 수 있지만, 첫 자식에서 전파되어 사용 값 break-beforepage가 될 수 있습니다. [css-break-3]

속성이 해당 요소나 박스 타입에 적용되지 않으면 해당 속성에 대한 사용 값이 없습니다.

예를 들어, flex 속성은 사용 값이 플렉스 아이템(flex items)이 아닌 요소에는 존재하지 않습니다.

4.5.1. 적용 가능한 속성(Applicable Properties)

속성이 적용(apply to)되지 않는 요소나 박스 타입(“Applies to” 행에 명시됨)에는, 해당 타입의 박스나 요소에 직접적으로 효과를 주지 않습니다.

참고: 적용되지 않는 속성도 간접적으로 포맷팅에 영향을 줄 수 있습니다. 계산 값이 적용되는 다른 속성의 계산에 영향줄 수 있고, 계산 값은 항상 존재하므로 하위 노드로 상속되어 그들에게 영향을 줄 수 있습니다.

writing-modetext-orientation은 테이블 행에는 적용되지 않지만 (테이블 행이나 자식의 레이아웃에 영향을 주지 않음), 이런 박스에 설정해도 ch 같은 글꼴 상대 단위 계산에는 영향을 주어, <length> 값을 사용하는 속성에도 영향을 줄 수 있습니다.
text-transform을 HTML p 요소에 설정하면 (기본적으로 display: block) 효과를 주지만, text-transform인라인 박스에만 적용됩니다. 속성이 상속되어 단락의 익명 루트 인라인 박스(root inline box)에 적용되어 그 안의 텍스트에 영향을 미치기 때문입니다.

참고: “모든 요소”에 적용된다고 정의된 속성은 모든 요소와 display 타입에 적용되지만, 모든 의사 요소(pseudo-element)에 반드시 적용되는 것은 아닙니다. 의사 요소는 종종 자체 렌더링 모델이나 다른 제한이 있기 때문입니다. 단, ::before::after 의사 요소는 일반 요소와 거의 동일하게 박스를 생성하므로 “모든 요소”에 적용되는 속성을 모두 허용하도록 정의됩니다. 자세한 정보는 [CSS-PSEUDO-4]를 참고하세요. 의사 요소 관련 내용입니다.

4.6. 실제 값(Actual Values)

사용 값은 원칙적으로 사용할 준비가 된 값이지만, 사용자 에이전트가 특정 환경에서 해당 값을 사용할 수 없을 수도 있습니다. 예를 들어, 사용자 에이전트가 테두리를 정수 픽셀 너비로만 렌더링할 수 있다면 사용 너비를 근사해야 합니다. 또한, 폰트 크기는 폰트의 가용성이나 font-size-adjust 값에 따라 조정될 수도 있습니다. 실제 값(actual value)은 이러한 조정이 이루어진 후의 사용 값입니다.

참고: 요소의 실제 값을 조사하면 문서 레이아웃 방식에 대해 많은 정보를 얻을 수 있습니다. 하지만 모든 정보가 실제 값에 기록되는 것은 아닙니다. 예를 들어, page-break-after의 실제 값은 해당 요소 뒤에 페이지 분할이 있는지 여부를 반영하지 않습니다. 마찬가지로 orphans의 실제 값도 해당 요소에 고아 줄이 몇 줄 있는지를 반영하지 않습니다. 아래 표의 예시(j), (k)를 참고하세요.

4.7. 예시(Examples)

CSS 값 계산 예시
속성(Property) 우승 선언(Winning declaration) 계단식 값(Cascaded value) 지정 값(Specified value) 계산 값(Computed value) 사용 값(Used value) 실제 값(Actual value)
(a) text-align text-align: left left left left left left
(b) border-top-width, border-right-width, border-bottom-width, border-left-width border-width: inherit inherit 4.2px 4.2px 4.2px 4px
(c) width (없음) (없음) auto (초기값) auto 120px 120px
(d) list-style-position list-style-position: inherit inherit inside inside inside inside
(e) list-style-position list-style-position: initial initial outside (초기값) outside outside outside
(f) font-size font-size: 1.2em 1.2em 1.2em 14.1px 14.1px 14px
(g) width width: 80% 80% 80% 80% 354.2px 354px
(h) width width: auto auto auto auto 134px 134px
(i) height height: auto auto auto auto 176px 176px
(j) page-break-after (없음) (없음) auto (초기값) auto auto auto
(k) orphans orphans: 3 3 3 3 3 3

4.8. 조각(fragment)별 값 처리

일부 CSS 기능은 조각(fragment) 단위로 값 처리에 영향을 줄 수 있습니다. 예시로 CSS Pseudo-Elements 4 § 2.1.3 상속과 ::first-line 의사 요소를 참고하세요. 여기서는 ::first-line 의사 요소 내 조각의 상속이 달라집니다. 이런 경우, 개별 조각(fragment)이 서로 다른 지정 값을 가지게 되면, 다른 속성의 계산 값에 기반해 해결되는 값(예: currentcolor 또는 em 단위)은 각 박스 조각(box fragment)별로 해결됩니다. 이후의 값 처리 과정은 각 조각에서 일반적으로 진행됩니다.

박스(box)별로 단일 값만 가정하는 API는(박스 조각별이 아니라) 트리-준수(tree-abiding)가 아닌 의사 요소(pseudo-elements)의 효과를 무시해야 합니다. (예를 들어, ::first-line 스타일은 getComputedStyle()으로 반환되는 값에는 영향을 주지 않습니다.)

예를 들어, 다음 마크업이 있다고 할 때:
<div><span>First line<br />Second line</span></div>
<div><span>First line</span></div>
<div>First line<br><span>Second line</span></div>
<style>
div { color: blue; }
div::first-line { color: yellow; }
span { border: thin solid currentcolor; }
</style>

div에서, “First line” 텍스트는 노란색이고 “Second line” 텍스트는 파란색입니다. 각 줄을 감싸는 span의 각 조각의 테두리도 해당 색상과 일치합니다.

하지만 모든 span에 대해 getComputedStyle()을 호출하면, border-color는 모두 "blue"로 반환됩니다. 이는 ::first-line 의사 요소의 효과가 분할(fragment)을 인식하지 못하는 API에서는 무시되기 때문입니다.

5. 선언 필터링(Filtering)

선언값을 찾으려면, 구현체는 먼저 각 요소에 적용되는 모든 선언을 식별해야 합니다. 선언이 요소에 적용되는 조건은 다음과 같습니다:

적용되는 선언들의 값은, 각 요소의 각 속성별로 선언값의 리스트를 형성합니다. 그 다음 섹션인 계단식(cascade)에서 이 리스트들의 우선순위가 결정됩니다.

6. 계단식(Cascading)

계단식(cascade)은 주어진 요소의 주어진 속성에 대해 선언값의 무순서 리스트를 받아, 아래에서 결정된 선언의 우선순위에 따라 정렬하고, 단일 계단식 값을 출력합니다.

6.1. 계단식 정렬 순서(Cascade Sorting Order)

계단식은 아래의 기준에 따라 선언을 정렬합니다. 우선순위는 내림차순입니다:

출처(origin)와 중요도(importance)
선언의 출처(origin)는 어디서 왔는지에 따라 결정되고, 중요도(importance)!important로 선언되었는지에 따라 결정됩니다 (아래 참고). 각 출처(origin)의 우선순위는 다음과 같습니다 (내림차순):
  1. 트랜지션 선언 [css-transitions-1]
  2. 중요(Important) UA 선언
  3. 중요(Important) 사용자(User) 선언
  4. 중요(Important) 작성자(Author) 선언
  5. 애니메이션 선언 [css-animations-1]
  6. 일반(Normal) 작성자(Author) 선언
  7. 일반(Normal) 사용자(User) 선언
  8. 일반(Normal) UA 선언

이 리스트에서 앞쪽 출처(origin)의 선언이 뒤쪽 출처(origin)의 선언보다 우선합니다.

컨텍스트(Context)
문서 언어는 서로 다른 캡슐화 컨텍스트(encapsulation contexts)에서 온 선언들을 혼합(blending)할 수 있습니다. 예를 들어 트리 컨텍스트(tree contexts)와 같은, 섀도 트리(shadow trees)에서의 중첩 트리 컨텍스트가 있습니다. [DOM]

서로 다른 캡슐화 컨텍스트에서 나온 두 선언을 비교할 때, 일반(Normal) 규칙에서는 바깥 컨텍스트의 선언이 우선, 중요(Important) 규칙에서는 안쪽 컨텍스트의 선언이 우선합니다. 이때 [DOM] 트리 컨텍스트섀도-포함 트리 순서(shadow-including tree order)로 중첩된 것으로 간주합니다.

참고: 이는 일반(Normal) 선언이 캡슐화 컨텍스트에 속해 있으면 바깥 컨텍스트에서 쉽게 덮어쓸 수 있는 기본값 역할을 하게 되고, 중요(Important) 선언이 캡슐화 컨텍스트에 속해 있으면 바깥 컨텍스트에서 덮어쓸 수 없는 강제 조건이 됩니다.

요소-부착 스타일(Element-Attached Styles)
일반(Normal)중요(Important) 선언별로, 요소에 직접 부착된 선언(예: style 속성의 내용) 선택자에 의해 간접적으로 매핑된 스타일 규칙보다 같은 중요도 내에서 우선합니다.

자세한 내용은 [css-style-attr] 참고.

참고: 비-CSS 프리젠테이션 힌트(마크업 등)는 별도로 처리됩니다. § 6.5 비-CSS 프리젠테이션 힌트의 우선순위 참고.

레이어(Layers)
출처(origin)컨텍스트(context) 내 선언들은 명시적으로 계단식 레이어(cascade layer)에 할당될 수 있습니다. 이 단계에서, 명시적 레이어에 할당되지 않은 선언은 암시적 최종 레이어에 추가됩니다.

계단식 레이어(및 선언)는 등장 순서대로 정렬됩니다. 서로 다른 레이어에 속한 선언을 비교할 때, 일반(Normal) 규칙에서는 마지막 레이어의 선언이 우선, 중요(Important) 규칙에서는 첫 번째 레이어의 선언이 우선합니다.

참고: 이는 일반(Normal)중요(Important) 출처(origin)에서 사용하는 레이어링 논리와 동일합니다. !important 플래그가 두 경우 모두 "덮어쓰기" 역할을 유지하도록 하는 것입니다.

특이성(Specificity)
Selectors 모듈 [SELECT]에서 선택자의 특이성 계산 방법을 설명합니다. 각 선언은 자신이 속한 스타일 규칙과 같은 특이성을 가집니다. 특이성이 가장 높은 선언이 우승합니다.
등장 순서(Order of Appearance)
문서 순서상 마지막 선언이 우승합니다. 이때:
  • 스타일시트는 최종 CSS 스타일시트 순서대로 정렬됩니다.
  • import된 스타일시트의 선언은 해당 스타일시트가 @import 규칙 위치에 대체된 것처럼 정렬됩니다.
  • 원본 문서에서 독립적으로 링크된 스타일시트의 선언은 호스트 문서 언어가 결정하는 링크 순서대로 연결된 것처럼 취급합니다.
  • style 속성의 선언은 해당 요소의 문서 순서대로 정렬되며, 모든 스타일시트 뒤에 위치합니다.

계단식의 출력(output of the cascade)은 각 요소의 각 속성별로 선언값의 (비어 있을 수도 있는) 정렬된 리스트입니다.

6.2. 계단식 출처(Cascading Origins)

각 스타일 규칙은 계단식 출처(cascade origin)를 가지며, 이것이 계단식에 들어가는 위치를 결정합니다. CSS는 세 가지 주요 출처(origin)를 정의합니다:

작성자 출처(Author Origin)
작성자는 소스 문서에 대해 문서 언어의 규칙에 따라 스타일시트를 지정합니다. 예를 들어 HTML에서는 스타일시트를 문서 내에 포함하거나 외부에서 링크할 수 있습니다.
사용자 출처(User Origin)
사용자는 특정 문서에 대해 스타일 정보를 지정할 수 있습니다. 예를 들어 사용자가 스타일시트가 포함된 파일을 지정하거나, 사용자 에이전트가 사용자 스타일시트를 생성하는 인터페이스를 제공할 수 있습니다 (혹은 그런 것처럼 동작할 수 있습니다).
UA 출처(User-Agent Origin)
적합한 사용자 에이전트는 기본 스타일시트를 적용해야 하며 (혹은 그런 것처럼 동작해야 함). UA 기본 스타일시트는 문서 언어의 요소를 일반적인 표현 기대치에 맞게 표현해야 합니다 (예: 시각적 브라우저에서 HTML의 EM 요소는 이탤릭 폰트로 표시됨). 예시로 HTML 사용자 에이전트 스타일시트 참고. [HTML]

CSS 확장에서는 다음과 같은 추가 출처(origin)를 정의합니다:

애니메이션 출처(Animation Origin)
CSS 애니메이션 [css-animations-1] 실행 시 효과를 나타내는 “가상” 규칙을 생성합니다.
트랜지션 출처(Transition Origin)
CSS 애니메이션과 마찬가지로, CSS 트랜지션 [css-transitions-1]도 실행 시 효과를 나타내는 “가상” 규칙을 생성합니다.

6.3. 중요 선언: !important 애노테이션

CSS는 작성자와 사용자 스타일시트 사이의 권한 균형을 만들고자 합니다. 기본적으로 작성자 스타일시트 규칙이 사용자 스타일시트 규칙을 덮어쓰고, 사용자 스타일시트 규칙이 UA 기본 스타일시트 규칙을 덮어씁니다. 이를 균형 있게 하기 위해 중요(important) 마크를 선언할 수 있으며, 계단식에서 가중치가 높아져 우선순서가 반전됩니다.

선언이 중요(important)로 간주되려면 [css-syntax-3] 정의대로 !important 애노테이션이 있어야 합니다. 즉, 값의 마지막 두(공백/주석 제외) 토큰이 구분자 !와 식별자 important여야 합니다. 이외의 선언은 일반(normal)(비-중요) 선언입니다.

[hidden] { display: none !important; }

중요(important) 선언은 일반(normal) 선언보다 우선합니다. 작성자와 사용자 스타일시트 모두 중요 선언을 포함할 수 있으며, 사용자 출처(user-origin) 중요 선언이 작성자 출처(author-origin) 중요 선언을 덮어씁니다. 이 CSS 기능은 접근성을 높여, 특별한 요구(큰 폰트, 색상 조합 등)가 있는 사용자가 표현을 제어할 수 있게 합니다.

중요(important) 선언은 모든 출처에서 애니메이션보다 우선합니다. 이를 통해 작성자가 애니메이션 값을 중요한 상황에서 덮어쓸 수 있습니다. (애니메이션 값은 일반적으로 다른 모든 규칙을 덮어씁니다.) [css-animations-1]

UA 스타일시트에도 중요 선언이 포함될 수 있습니다. 이들은 모든 작성자, 사용자 선언을 덮어씁니다.

아래 예시에서 사용자의 스타일시트 첫 번째 규칙에 !important 선언이 포함되어, 작성자 스타일시트의 해당 선언을 덮어씁니다. 두 번째 규칙의 선언 역시 !important로 인해 우승합니다. 하지만 사용자의 스타일시트 세 번째 선언은 !important가 아니므로, 작성자 스타일시트 두 번째 규칙의 선언(축약 속성에 스타일 지정)이 이깁니다. 또한, 작성자 세 번째 규칙은 두 번째 규칙의 !important 선언에 밀려 집니다. !important 선언이 작성자 스타일시트 내에서도 기능함을 보여줍니다.
/* 사용자의 스타일시트 */
p { text-indent: 1em !important }
p { font-style: italic !important }
p { font-size: 18pt }

/* 작성자의 스타일시트 */
p { text-indent: 1.5em !important }
p { font: normal 12pt sans-serif !important }
p { font-size: 24pt }
속성(Property) 우승 값(Winning value)
text-indent 1em
font-style italic
font-size 12pt
font-family sans-serif

6.4. 계단식 레이어(Cascade Layers)

계단식 출처가 사용자와 작성자 스타일 간의 권한 균형을 제공하는 것처럼, 계단식 레이어는 단일 출처(origin) 내에서 스타일 우선순위를 구조적으로 조직하고 균형 잡는 방법을 제공합니다. 하나의 계단식 레이어 내 규칙들은 서로 계단식되며, 레이어 밖의 스타일 규칙과는 섞이지 않습니다.

작성자는 레이어를 만들어 요소의 기본값, 서드파티 라이브러리, 테마, 컴포넌트, 오버라이드 등 다양한 스타일 관심사를 표현할 수 있고, 각 레이어 내에서 선택자나 특이성(specificity)을 변경하지 않고, 레이어 간 충돌 해결에 소스 순서에 의존하지 않으면서, 계단식 레이어의 순서를 명시적으로 재정렬할 수 있습니다.

예를 들어, 다음은 명시적으로 reset 레이어를 생성하며, 어떤 레이어가 없는(unlayered) 스타일보다 낮은 계단식 가중치를 갖습니다:
audio {
  /* 특이성 0,0,1 - 암시적(최종) 레이어 */
  display: flex;
}

@layer reset {
  audio[controls] {
    /* 특이성 0,1,1 - 명시적 "reset" 레이어 */
    display: block;
  }
}

audio 요소의 레이어 없는 선언이 audio[controls]의 명시적 레이어 선언보다 우선합니다 — 특이성이 더 낮고, 소스 순서상 먼저 나와도 마찬가지입니다.

이름을 정의하는 at-규칙 (@keyframes 또는 @font-face 등)이 계단식 레이어 안에 정의되어 있으면 이름 충돌을 해결할 때 레이어 순서를 사용합니다.

예를 들어, 작성자가 프레임워크의 애니메이션을 오버라이드하려면, 더 높은 우선순위 레이어에 같은 이름의 keyframes를 제공하면 됩니다:
/* 레이어 순서를 명시적으로 설정하여 "override" 레이어가 우선 */
@layer framework, override;

@layer override {
  @keyframes slide-left {
    from { translate: 0; }
    to { translate: -100% 0; }
  }
}

@layer framework {
  @keyframes slide-left {
    from { margin-left: 0; }
    to { margin-left: -100%; }
  }
}

.sidebar { animation: slide-left 300ms; }

이 경우 override 레이어가 framework 레이어보다 높은 계단식 우선순위를 가지므로 slide-left 애니메이션은 translate 속성으로 동작합니다(margin-left 대신).

6.4.1. 계단식 레이어 선언

계단식 레이어는 다음 방법으로 선언할 수 있습니다:

link 또는 style 요소를 계단식 레이어에 할당하는 속성 제공? [Issue #w3c/csswg-drafts#5853]

6.4.2. 레이어 이름과 중첩(Layer Naming and Nesting)

계단식 레이어레이어 이름(layer name)을 가지며, 이는 각 레이어 중첩 단계(level)를 나타내는 순서 있는 리스트입니다. 각 구간(segment)은 CSS 식별자로 명명되거나 익명일 수 있습니다. (따라서 한 레이어가 다른 레이어에 중첩되면, 이름이 이어 붙여집니다.) 한 레이어가 다른 레이어에 중첩되는 경우는, 다른 레이어의 범위 내에서 선언되는 경우입니다. 예: @layer 규칙이 또 다른 @layer 안에 있을 때, 계층화된 @import가 계층화된 import 안에 있을 때, 또는 @layer 규칙이 계층화된 import 안에 있을 때 등입니다.

레이어 이름이 동일한 순서로 동일한 구간을 포함하면 동일한 계단식 레이어를 나타냅니다. 단, 익명 구간은 각 발생마다 고유한 식별자를 가집니다. 중첩(nesting)으로 인해 여러 레이어가 동일한 익명 구간을 공유할 수 있습니다.

명시적 레이어 식별자를 이용하면 여러 스타일 블록을 하나의 레이어에 할당할 수 있습니다. 아래 예시에서는 headings.csslinks.css의 내용이 audio[controls] 규칙과 동일 레이어에서 계단식됩니다:
@import url(headings.css) layer(default);
@import url(links.css) layer(default);

@layer default {
  audio[controls] {
    display: block;
  }
}
이 예시에서, 중첩된 framework.base 레이어는 최상위 base 레이어와 구별됩니다:
@layer base {
  p { max-width: 70ch; }
}

@layer framework {
  @layer base {
    p { margin-block: 0.75em; }
  }

  @layer theme {
    p { color: #222; }
  }
}

결과 레이어는 다음과 같이 트리로 표현할 수 있습니다:

  1. base

  2. framework

    1. base

    2. theme

또는 중첩 식별자를 포함한 평면 리스트로 표현할 수도 있습니다:

  1. base

  2. framework.base

  3. framework.theme

구문적으로, 명시적 레이어 이름@layer@import 규칙의 <layer-name>으로 표현됩니다. 이는 공백 없이 점(.)으로 구분된 <ident> 토큰의 리스트입니다:

<layer-name> = <ident> [ '.' <ident> ]*

CSS 전역 키워드(CSS-wide keywords)는 향후 사용을 위해 예약되어 있으므로 <ident>로 사용하면 해당 규칙이 파싱 시 무효가 됩니다. 여러 식별자를 점(.)으로 이어 붙이면, 해당 레이어들이 순서대로 중첩된 것을 의미합니다.

@layer framework {
  @layer default {
     p { margin-block: 0.75em; }
  }

  @layer theme {
    p { color: #222; }
  }
}

@layer framework.theme {
  /* 이 스타일은 framework 레이어 내 theme 레이어에 추가됨 */
  blockquote { color: rebeccapurple; }
}

참고: 중첩된 레이어는 부모 레이어 바깥의 레이어를 참조할 수 없습니다.

6.4.2.1. 익명 레이어(Anonymous Layers)

@layer 규칙이 <layer-name>을 생략하거나, @import 규칙에서 layer 키워드만 사용해 <layer-name>을 제공하지 않을 때, 레이어 이름에 고유한 익명 구간이 추가됩니다; 따라서 바깥에서 참조할 수 없습니다.

익명 레이어 선언의 각 발생은 고유한 계단식 레이어를 나타냅니다. 즉:
<layer-name> 없이 선언된 레이어는 외부에서 스타일을 재배치하거나 추가할 수 있는 후크를 제공하지 않습니다.

이는 단순히 편의를 위한 축약일 수도 있고, 팀에서 조직 규칙을 강제하기 위한 용도로(해당 레이어 내 모든 코드는 한 곳에서 정의해야 함), 또는 라이브러리가 내부 "비공개" 레이어 집합을 합치고 숨기고 싶을 때(작성자 조작에서 숨김) 사용할 수도 있습니다:

/* bootstrap-base.css */
/* 각 서브 파일마다 익명 래퍼 레이어 */
@import url(base-forms.css) layer;
@import url(base-links.css) layer;
@import url(base-headings.css) layer;
/* bootstrap.css */
/* 내부 이름은 접근 불가, "base"로 흡수됨 */
@import url(bootstrap-base.css) layer(base);
/* author.css */
/* 작성자는 bootstrap.base 레이어에는 접근 가능하지만 익명 레이어 내부에는 접근 불가 */
@import url(bootstrap.css) layer(bootstrap);

/* bootstrap 레이어에 추가 스타일을 넣을 수 있음: */
@layer bootstrap {...}

6.4.3. 레이어 순서(Layer Ordering)

계단식 레이어는 처음 선언된 순서대로 정렬되며, 중첩된 레이어는 부모 레이어 내에 그룹화되고 모든 레이어 없는(unlayered) 규칙보다 먼저 그룹화됩니다.

다음과 같은 레이어 규칙이 있을 때:
/* 레이어 없는 스타일은 레이어 순서상 마지막에 위치 */
h1 { color: darkslateblue; }

@layer reset.type {
  strong { font-weight: bold; }
}

@layer framework {
  .title { font-weight: 100; }

  @layer theme {
    h1, h2 { color: maroon; }
  }
}

@layer reset {
  [hidden] { display: none; }
}

바깥쪽(outer) 레이어들이 먼저 정렬되며, 레이어 없는 스타일 규칙은 암시적 바깥 레이어에 추가되어 명시적 레이어보다 더 높은 우선순위를 갖습니다(더 뒤에 나옴):

  1. reset

  2. framework

  3. (암시적 바깥 레이어)

각 레이어 내에서는, 중첩된 레이어들이 등장 순서대로 정렬되고, 추가 중첩 없이 스타일 규칙이 명시적 중첩 레이어 뒤의 암시적 서브 레이어(sub-layer)에 추가됩니다:

  1. reset.type

  2. reset (암시적 서브 레이어)

  3. framework.theme

  4. framework (암시적 서브 레이어)

  5. (암시적 바깥 레이어)

조건부 그룹 규칙(conditional group rule) 안에 정의된 레이어는 조건이 참이거나 해당 조건부 그룹 규칙이 문서 내 요소별로 다르게 평가될 수 있는 경우에만 레이어 순서에 기여합니다.

참고: 레이어 순서는 문서 전체에 대해 전역(global)이므로, 요소-민감(element-sensitive)한 조건부 그룹 규칙 내에서 정의된 레이어도 전역 레이어 순서 설정 시 반드시 포함되어야 합니다(조건과 무관하게). 문서에 대해 전역적인 조건(예: @media, @supports)에서는 해당 @layer 규칙을 조건부로 포함할 수 있습니다.

예를 들어, 다음 레이어 순서는 어떤 미디어 조건이 일치하느냐에 따라 달라집니다:
@media (min-width: 30em) {
  @layer layout {
    .title { font-size: x-large; }
  }
}

@media (prefers-color-scheme: dark) {
  @layer theme {
    .title { color: white; }
  }
}

@layer theme, layout;

첫 번째 미디어 쿼리가 뷰포트 크기 조건에 맞으면, layout 레이어가 레이어 순서상 가장 먼저 옵니다. 컬러 스킴 조건이 맞거나 둘 다 아니면, theme이 가장 먼저 옵니다.

작성자가 이런 동작을 피하려면 미리 명시적으로 레이어 순서를 설정하고, 조건부 규칙 내에서 새 레이어를 정의하지 않으면 됩니다.

참고: 계단식 레이어는 해당 출처(origin)컨텍스트(context)에 범위가 한정되므로, light DOM의 레이어 순서는 shadow DOM의 동일 이름 레이어 순서에 영향을 주지 않습니다(반대도 마찬가지).

작성자가 레이어 없는 스타일을 명시적으로 레이어 순서에 배치할 수 있도록 허용? [Issue #6323]

6.4.4. 인라인 레이어 선언: @layer 규칙

@layer 규칙은 계단식 레이어를 선언하며, 스타일 규칙을 할당할 수 있습니다.

6.4.4.1. 인라인 스타일 할당: @layer 블록 at-규칙

@layer 블록 at-규칙(block at-rule)은 자식 스타일 규칙들을 특정 이름의 계단식 레이어에 할당합니다. 이 블록 레이어 할당 구문은 다음과 같습니다:

@layer <layer-name>? {
  <stylesheet>
}

이런 @layer 블록 규칙은 조건이 참인 조건부 그룹 규칙 [CSS-CONDITIONAL-3]과 동일한 제한 및 처리 규칙을 가집니다.

예를 들어, @layer@media를 혼합해서 사용할 수 있습니다:
@layer framework {
  h1, h2 { color: maroon; background: white;}

  @media (prefers-color-scheme: dark) {
    h1, h2 { color: red; background: black; }
  }
}

참고: @layer 블록 at-규칙@import 규칙과 섞어서 사용할 수 없습니다.

6.4.4.2. 스타일 없이 선언: @layer 문장 at-규칙

@layer 규칙은 스타일 규칙을 할당하지 않고 레이어 이름만 제공하여 새로운 레이어를 정의하는 데에도 사용할 수 있습니다:

@layer <layer-name>#;

이런 빈 @layer 규칙은 @import@namespace 규칙 앞(있다면 @charset 규칙 뒤에) 뿐만 아니라 @layer 블록 at-규칙이 허용되는 모든 위치에 사용할 수 있습니다.

참고: @layer 규칙은 @import@namespace 규칙 사이에는 허용되지 않습니다. @layer 규칙이 @import 또는 @namespace 규칙 뒤에 위치하면, 그 이후의 @import 또는 @namespace 규칙은 무시됩니다.

블록 구문과 달리, 이 구문에서는 여러 레이어 이름을 쉼표로 구분해 제공할 수 있으며, 지정된 순서대로 각각의 레이어를 선언합니다.

참고: 레이어 순서는 레이어 이름의 첫 등장으로 결정되기 때문에(아래 § 6.4.3 레이어 순서 참고), 이 규칙을 사용하면 페이지가 레이어 순서를 미리 선언할 수 있어, 스타일시트를 전체 읽지 않아도 순서를 알 수 있습니다. 또한 인라인 레이어를 import된 레이어와 섞어서 선언할 수 있는데, 이는 블록 구문에서는 불가능합니다.

문장 구문(statement syntax)은 스타일 규칙이 각 레이어에 추가되는 순서와 관계없이 미리 레이어 순서를 정할 수 있습니다. 사전 레이어 순서 선언은, @import 규칙보다 앞에 선언하면 유용할 수 있습니다. 아래 예시에서는, import된 theme.css 스타일 규칙이 이후 default 블록에 추가된 규칙보다 우선합니다. 레이어 순서가 이미 정해졌기 때문입니다:
@layer default, theme, components;
@import url(theme.css) layer(theme);

@layer default {
  audio[controls] {
    display: block;
  }
}

@import 규칙을 @layer 규칙들 사이에 배치하여, 순서를 정할 수도 있습니다. 아래 예시도 같은 결과가 됩니다:

@layer default;
@import url(theme.css) layer(theme);
@layer components;

@layer default {
  audio[controls] {
    display: block;
  }
}

단, @import@namespace 규칙은 반드시 연속적으로 나와야 하며, 그 사이에 다른 규칙이 끼어 있으면 안 됩니다. 아래 예시는 잘못된 구문입니다:

@import url(default.css) layer(default);
@layer theme;
@import url(components.css) layer(components);

@layer theme {
  audio[controls] { display: block; }
}

6.5. 비-CSS 프리젠테이션 힌트의 우선순위

UA는 소스 문서의 마크업에서 프리젠테이션 힌트를 존중할 수 있습니다. 예를 들어 bgcolor 속성이나 s 요소 등입니다([HTML] 참고). 모든 문서 언어 기반 스타일링은 해당 CSS 규칙으로 변환되어 계단식에 UA-origin 또는 특별 작성자 프리젠테이션 힌트 출처(author presentational hint origin)로 들어가야 하며, 이는 일반 사용자 출처(user origin)작성자 출처(author origin) 사이에 위치합니다. 계단식(cascading) 시에는 작성자 프리젠테이션 힌트 출처가 독립적인 출처(origin)로 취급되지만, revert 키워드 측면에서는 작성자 출처의 일부로 간주됩니다.

문서 언어는 해당 프리젠테이션 힌트가 계단식UA-origin 또는 작성자 출처(author-origin)로 들어가는지 정의할 수 있습니다. 만약 정의되어 있다면 UA는 해당 규정대로 동작해야 합니다. 예를 들어 [SVG11]은 프리젠테이션 속성을 작성자 출처로 매핑합니다.

참고: 계단식UA-origin 규칙으로 들어가는 프리젠테이션 힌트는, 작성자 출처 또는 사용자 출처 스타일로 덮어쓸 수 있습니다. 작성자 프리젠테이션 힌트 출처 규칙으로 들어가는 힌트는, 작성자 출처 스타일로 덮어쓸 수 있지만, 중요(important)가 아닌 사용자 출처 스타일로는 덮어쓸 수 없습니다. 호스트 언어는 이런 점을 고려해 프리젠테이션 힌트의 출처를 선택해야 합니다.

7. 기본값 처리(Defaulting)

계단식(cascade)이 값을 반환하지 않으면, 지정 값을 다른 방식으로 찾아야 합니다. 상속 속성(inherited properties)은 부모 요소를 통해 상속(inheritance)으로 기본값을 가져오고, 그 외의 속성은 초기값(initial value)을 사용합니다. 작성자는 inheritinitial 키워드로 상속 또는 초기화를 명시적으로 요청할 수 있습니다.

7.1. 초기값(Initial Values)

각 속성은 초기값(initial value)을 가지며, 이는 속성 정의 테이블에 명시되어 있습니다. 속성이 상속 속성이 아니고, 계단식이 값을 반환하지 않으면, 해당 속성의 지정 값은 초기값입니다(initial value).

7.2. 상속(Inheritance)

상속(Inheritance)은 속성 값을 부모 요소에서 자식 요소로 전달합니다. 요소의 속성의 상속 값(inherited value)은 부모 요소의 해당 속성 계산 값(computed value)입니다. 루트 요소의 경우 부모 요소가 없으므로, 상속 값은 해당 속성의 초기값입니다.

[DOM] 트리(섀도 포함)에서는, 상속은 평탄화(flattened) 요소 트리에서 동작합니다. 이 뜻은, 슬롯에 할당된 요소는 slot에서 상속받으며, 직접적인 light tree 부모에서는 상속받지 않습니다. 의사 요소(pseudo-elements)는 각 의사 요소에 명시된 가상의 태그 시퀀스대로 상속받습니다. [CSS-PSEUDO-4]

일부 속성은 상속 속성(inherited properties)입니다. 이는 속성 정의 테이블에 명시되어 있습니다. 즉, 계단식이 값을 반환하지 않으면, 상속(inheritance)으로 값이 결정됩니다.

속성은 명시적으로 상속받을 수도 있습니다. inherit 키워드 참고.

참고: 상속은 문서 트리를 따르며 익명 박스에서 가로채지 않으며, 박스 트리의 조작 등으로 영향을 받지 않습니다.

7.3. 명시적 기본값 처리(Explicit Defaulting)

아래에 여러 CSS 전역 속성 값이 정의되어 있습니다; 속성에 이 값을 명시적으로 선언하면 특정 기본값 처리 동작을 지정하는 것입니다. CSS 값 및 단위 [css-values-3]에 명시된 대로, 모든 CSS 속성은 이 값들을 허용할 수 있습니다.

7.3.1. 속성 리셋: initial 키워드

속성의 계단식 값initial 키워드라면, 해당 속성의 지정 값초기값입니다.

7.3.2. 명시적 상속: inherit 키워드

속성의 계단식 값inherit 키워드라면, 해당 속성의 지정 값계산 값상속 값입니다.

7.3.3. 모든 선언 삭제: unset 키워드

속성의 계단식 값unset 키워드라면, 상속 속성일 경우 inherit로 처리하고, 상속 속성이 아니면 initial로 처리합니다. 이 키워드는 앞서 계단식에서 발생한 모든 선언값을 지우며, 속성에 맞게 올바르게 상속하거나(상속 속성일 경우), 그렇지 않으면 초기화합니다 (또는 축약 속성(longhands) 전체에 대해).

7.3.4. 계단식 출처 롤백: revert 키워드

속성의 계단식 값revert 키워드라면, 그 선언이 속한 계단식 출처에 따라 동작이 달라집니다:

UA 출처(user-agent origin)
unset과 동일하게 처리합니다.
사용자 출처(user origin)
계단식 값을 UA 레벨로 롤백합니다. 즉, 해당 요소의 해당 속성에 대해 작성자-origin 또는 사용자-origin 규칙이 지정되지 않은 것처럼 지정 값을 계산합니다.
작성자 출처(author origin)
계단식 값을 사용자 레벨로 롤백합니다. 즉, 해당 요소의 해당 속성에 대해 작성자-origin 규칙이 지정되지 않은 것처럼 지정 값을 계산합니다. revert 목적상, 이 출처에는 애니메이션 origin도 포함됩니다.

7.3.5. 계단식 레이어 롤백: revert-layer 키워드

속성의 계단식 값revert-layer 키워드라면, 계단식 값을 아래 레이어로 롤백하여, 해당 요소의 해당 속성에 대해 현재 계단식 레이어 또는 그 안의 일반(normal)중요(important) 수준 사이에서 규칙이 지정되지 않은 것처럼 지정 값을 계산합니다. revert-layer중요 요소-부착 스타일(element-attached styles)에서 사용되면, 요소-부착 스타일과 그 사이의 애니메이션 출처(animation origin)만 롤백되며, 그 사이의 작성자 출처(author-origin) 중요 규칙은 롤백되지 않습니다.

참고: 같은 계단식 출처(origin)에 더 낮은 우선순위 선언이 없으면, revert-layer 값이 계단식 값을 이전 출처로 롤백합니다.

참고: 애니메이션 출처(animation origin)작성자 출처(author origin)revert에서처럼 합쳐지지 않으며, 실제로 독립적인 계단식 레이어를 형성합니다.

8. 레이어 API

8.1. CSSImportRule 인터페이스 확장

CSSImportRule 인터페이스는 아래와 같이 확장됩니다:

partial interface CSSImportRule {
  readonly attribute CSSOMString? layerName;
};

layerName 속성은 at-규칙에 선언된 레이어 이름을 나타내며, 레이어가 익명일 경우 빈 문자열, at-규칙이 레이어를 선언하지 않는 경우 null입니다.

8.2. CSSLayerBlockRule 인터페이스

CSSLayerBlockRule 인터페이스는 @layer 블록 규칙(block rule)을 나타냅니다:

[Exposed=Window]
interface CSSLayerBlockRule : CSSGroupingRule {
  readonly attribute CSSOMString name;
};

name 속성은 at-규칙에 선언된 레이어 이름을 나타내며, 레이어가 익명일 경우 빈 문자열입니다.

예를 들어, 추가 중첩 컨텍스트가 래핑된 레이어 규칙에서 추가되지 않습니다.
@layer outer {
  @layer foo.bar { }
}

이 경우, 내부 @layer 규칙의 name 값은 "foo.bar"입니다(즉, "outer.foo.bar" 아님).

8.3. CSSLayerStatementRule 인터페이스

CSSLayerStatementRule 인터페이스는 @layer 문장(statement)을 나타냅니다:

[Exposed=Window]
interface CSSLayerStatementRule : CSSRule {
  readonly attribute FrozenArray<CSSOMString> nameList;
};

nameList 속성은 at-규칙에서 선언된 레이어 이름의 리스트를 나타내며, CSSLayerBlockRulename 속성과 동일한 규칙으로 정규화(normalization)됩니다.

9. 변경 사항

9.1. 2021년 10월 15일 워킹드래프트 이후 변경 사항

2021년 10월 15일 워킹 드래프트 이후의 주요 변경 사항:

9.2. 2021년 8월 29일 워킹드래프트 이후 변경 사항

2021년 8월 29일 워킹 드래프트 이후의 변경 사항:

9.3. 2021년 6월 8일 워킹드래프트 이후 변경 사항

2021년 6월 8일 워킹 드래프트 이후의 주요 변경 사항:

9.4. 2021년 3월 19일 워킹드래프트 이후 변경 사항

2021년 3월 19일 워킹 드래프트 이후의 주요 변경 사항:

9.5. 2021년 1월 19일 워킹드래프트 이후 변경 사항

2021년 1월 19일 퍼블릭 워킹 드래프트 이후의 주요 변경 사항:

9.6. 레벨 4 이후 추가 사항

레벨 4 이후 추가된 기능은 다음과 같습니다:

9.7. 레벨 3 이후 추가 사항

레벨 3 이후 추가된 기능은 다음과 같습니다:

9.8. 레벨 2 이후 추가 사항

레벨 2 이후 추가된 기능은 다음과 같습니다:

감사의 말씀

David Baron, Tantek Çelik, Florian Rivoal, Simon Sapin, Jen Simmons, 그리고 Boris Zbarsky가 이 명세에 기여했습니다.

개인정보 및 보안 고려사항

적합성

문서 규칙(Document conventions)

적합성 요구사항(conformance requirements)은 설명적(assertion) 진술과 RFC 2119 용어의 조합으로 표현됩니다. “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL” 등의 키워드는 RFC 2119에 정의된 대로 해석해야 합니다. 다만 가독성을 위해 이 명세에서는 항상 대문자로 표기하지 않습니다.

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

이 명세의 예시(example)는 “for example” 문구로 시작하거나 class="example"로 구분되어 있습니다. 예시 예시:

이것은 정보성 예시입니다.

정보성 노트(informative note)는 “Note”로 시작하며 class="note"로 구분되어 있습니다. 예시:

참고: 이것은 정보성 노트입니다.

권고(advisement)는 규범적 섹션으로 특별히 강조되어 <strong class="advisement">로 구분됩니다. 예시: UA는 반드시 접근 가능한 대안을 제공해야 한다.

적합성 클래스(Conformance classes)

이 명세의 적합성은 세 가지 적합성 클래스로 정의됩니다:

스타일시트(style sheet)
CSS 스타일시트
렌더러(renderer)
스타일시트 의미를 해석하고, 해당 스타일시트를 사용하는 문서를 렌더링하는 UA
저작 도구(authoring tool)
스타일시트를 작성하는 UA

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

렌더러가 이 명세에 적합하려면, 스타일시트를 적절한 명세대로 해석하는 것 외에도, 이 명세에서 정의한 모든 기능을 올바르게 파싱하고, 문서를 적절히 렌더링해야 합니다. 단, UA가 기기 한계로 인해 문서를 올바르게 렌더링하지 못해도, UA가 부적합하다고 할 수는 없습니다(예: UA가 모노크롬 모니터에서 색상을 렌더링할 필요는 없음).

저작 도구가 이 명세에 적합하려면, 이 모듈의 일반 CSS 문법과 각 기능의 개별 문법에 따라 문법적으로 올바른 스타일시트를 작성하고, 이 모듈에서 설명한 스타일시트의 기타 적합성 요구사항을 모두 만족해야 합니다.

부분 구현(Partial implementations)

작성자가 미래 호환성 파싱 규칙(forward-compatible parsing rules)을 활용해 대체값(fallback value)을 지정할 수 있도록, CSS 렌더러는 반드시 지원 수준이 없는 at-규칙, 속성, 속성 값, 키워드, 기타 구문 구성요소를 무효로 처리하며(적절히 무시), 다값 속성 선언에서 지원하지 않는 값만 선택적으로 무시하고 지원되는 값만 적용해서는 안 됩니다: 값 중 하나라도 무효(지원하지 않는 값)로 간주되면, CSS는 전체 선언을 무시하도록 요구합니다.

불안정 및 독점 기능 구현(Implementations of Unstable and Proprietary Features)

향후 안정적인 CSS 기능과의 충돌을 피하기 위해, CSSWG는 베스트 프랙티스를 따라 불안정 기능 및 독점 확장을 구현할 것을 권장합니다.

비실험적 구현(Non-experimental implementations)

명세가 후보 권고(Candidate Recommendation) 단계에 도달하면, 비실험적 구현이 가능해지며, 구현자는 명세에 따라 올바르게 구현된 CR 수준 기능은 접두사 없는 구현체를 릴리스해야 합니다.

CSS의 상호운용성(interoperability)을 확보하고 유지하기 위해, CSS 작업 그룹은 비실험적 CSS 렌더러에게 구현 보고서(및 필요한 경우 구현 보고서에 사용된 테스트 케이스)를 W3C에 제출하도록 요청합니다. W3C에 제출된 테스트 케이스는 CSS 작업 그룹의 검토 및 수정 대상이 됩니다.

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

CR 종료 기준(CR exit criteria)

이 명세가 제안 권고(Proposed Recommendation)로 진행되려면, 각 기능별로 최소 두 개의 독립적이고 상호운용 가능한 구현이 있어야 합니다. 각 기능은 서로 다른 제품에서 구현될 수 있으며, 모든 기능을 하나의 제품이 구현할 필요는 없습니다. 이 기준의 목적상, 다음 용어를 정의합니다:

독립적(independent)
각 구현은 서로 다른 업체가 개발해야 하며, 다른 적합 구현에서 사용된 코드를 공유/재사용/파생할 수 없습니다. 명세 구현과 무관한 코드 영역은 이 요구에서 예외입니다.
상호운용(Interoperable)
공식 CSS 테스트 스위트의 해당 테스트 케이스를 통과하거나, 구현체가 웹 브라우저가 아닐 경우 동등한 테스트를 통과해야 함. 모든 관련 테스트는 동등한 테스트가 생성되어야 하며, 해당 UA가 상호운용성을 주장하려면, 또 다른 UA도 동등한 방식으로 동등한 테스트를 통과해야 하며, 동등 테스트는 동료 검토(peer review)를 위해 공개되어야 함.
구현체(Implementation)
다음을 만족하는 UA:
  1. 명세를 구현함
  2. 일반 대중이 사용 가능. 릴리스 제품 또는 접근 가능한 버전(베타, 프리뷰 릴리스, "nightly build" 등) 비릴리스 제품은 기능을 최소 1개월 이상 구현하여 안정성을 입증해야 함.
  3. 실험적(테스트 통과만을 위한 특별 버전)이 아니어야 함

이 명세는 최소 6개월간 후보 권고로 유지됩니다.

색인

이 명세에서 정의된 용어

참조로 정의된 용어

참고문헌(References)

규범적 참고문헌(Normative References)

[CSS-2021]
Tab Atkins Jr.; Elika Etemad; Florian Rivoal. CSS Snapshot 2021. 2021년 12월 31일. NOTE. URL: https://www.w3.org/TR/css-2021/
[CSS-ANIMATIONS-1]
Dean Jackson; et al. CSS Animations Level 1. 2018년 10월 11일. WD. URL: https://www.w3.org/TR/css-animations-1/
[CSS-BACKGROUNDS-3]
Bert Bos; Elika Etemad; Brad Kemper. CSS Backgrounds and Borders Module Level 3. 2021년 7월 26일. CR. URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS-BREAK-4]
Rossen Atanassov; Elika Etemad. CSS Fragmentation Module Level 4. 2018년 12월 18일. WD. URL: https://www.w3.org/TR/css-break-4/
[CSS-COLOR-4]
Tab Atkins Jr.; Chris Lilley; Lea Verou. CSS Color Module Level 4. 2021년 12월 15일. WD. URL: https://www.w3.org/TR/css-color-4/
[CSS-CONDITIONAL-3]
David Baron; Elika Etemad; Chris Lilley. CSS Conditional Rules Module Level 3. 2021년 12월 23일. CR. URL: https://www.w3.org/TR/css-conditional-3/
[CSS-CONDITIONAL-5]
David Baron; Elika Etemad; Chris Lilley. CSS Conditional Rules Module Level 5. 2021년 12월 21일. WD. URL: https://www.w3.org/TR/css-conditional-5/
[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-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-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; et al. 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-VARIABLES-1]
Tab Atkins Jr.. CSS Custom Properties for Cascading Variables Module Level 1. 2021년 11월 11일. CR. URL: https://www.w3.org/TR/css-variables-1/
[CSS-WRITING-MODES-3]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 3. 2019년 12월 10일. REC. URL: https://www.w3.org/TR/css-writing-modes-3/
[CSS2]
Bert Bos; et al. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011년 6월 7일. REC. URL: https://www.w3.org/TR/CSS21/
[CSSOM]
Daniel Glazman; Emilio Cobos Álvarez. CSS Object Model (CSSOM). 2021년 8월 26일. WD. URL: https://www.w3.org/TR/cssom-1/
[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[FETCH]
Anne van Kesteren. Fetch Standard. Living Standard. URL: https://fetch.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[MEDIAQ]
Florian Rivoal; Tab Atkins Jr.. Media Queries Level 4. 2021년 12월 25일. CR. URL: https://www.w3.org/TR/mediaqueries-4/
[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
[SELECT]
Tantek Çelik; et al. Selectors Level 3. 2018년 11월 6일. REC. URL: https://www.w3.org/TR/selectors-3/
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. Selectors Level 4. 2018년 11월 21일. WD. URL: https://www.w3.org/TR/selectors-4/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

정보성 참고문헌(Informative References)

[CSS-ALIGN-3]
Elika Etemad; Tab Atkins Jr.. CSS Box Alignment Module Level 3. 2021년 12월 24일. WD. URL: https://www.w3.org/TR/css-align-3/
[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]
Elika Etemad; Tab Atkins Jr.. CSS Cascading and Inheritance Level 4. 2021년 12월 3일. WD. URL: https://www.w3.org/TR/css-cascade-4/
[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-FLEXBOX-1]
Tab Atkins Jr.; et al. CSS Flexible Box Layout Module Level 1. 2018년 11월 19일. CR. URL: https://www.w3.org/TR/css-flexbox-1/
[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-INLINE-3]
Dave Cramer; Elika Etemad; Steve Zilles. CSS Inline Layout Module Level 3. 2020년 8월 27일. WD. URL: https://www.w3.org/TR/css-inline-3/
[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/
[CSS-PAGE-3]
Elika Etemad; Simon Sapin. CSS Paged Media Module Level 3. 2018년 10월 18일. WD. URL: https://www.w3.org/TR/css-page-3/
[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-STYLE-ATTR]
Tantek Çelik; Elika Etemad. CSS Style Attributes. 2013년 11월 7일. REC. URL: https://www.w3.org/TR/css-style-attr/
[CSS-TEXT-3]
Elika Etemad; Koji Ishii; Florian Rivoal. CSS Text Module Level 3. 2021년 4월 22일. CR. URL: https://www.w3.org/TR/css-text-3/
[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/
[SVG11]
Erik Dahlström; et al. Scalable Vector Graphics (SVG) 1.1 (Second Edition). 2011년 8월 16일. REC. URL: https://www.w3.org/TR/SVG11/

속성 색인(Property Index)

이름(Name) 값(Value) 초기값(Initial) 적용 대상(Applies to) 상속됨(Inh.) 퍼센트(%ages) 애니메이션 타입(Animation type) 정규 순서(Canonical order) 계산값(Computed value)
all initial | inherit | unset | revert | revert-layer 각 속성별 참조 각 속성별 참조 각 속성별 참조 각 속성별 참조 각 속성별 참조 문법 기준(per grammar) 각 속성별 참조

IDL 색인(IDL Index)

partial interface CSSImportRule {
  readonly attribute CSSOMString? layerName;
};

[Exposed=Window]
interface CSSLayerBlockRule : CSSGroupingRule {
  readonly attribute CSSOMString name;
};

[Exposed=Window]
interface CSSLayerStatementRule : CSSRule {
  readonly attribute FrozenArray<CSSOMString> nameList;
};

이슈 색인

link 또는 style 요소를 계단식 레이어에 할당하는 속성 제공? [이슈 #w3c/csswg-drafts#5853]
작성자가 레이어 없는 스타일을 명시적으로 레이어 순서에 배치할 수 있도록 허용 [이슈 #6323]