CSS 속성 및 값 API 레벨 1

W3C 워킹 드래프트,

이 문서에 대한 상세 정보
이 버전:
https://www.w3.org/TR/2024/WD-css-properties-values-api-1-20240326/
최신 공개 버전:
https://www.w3.org/TR/css-properties-values-api-1/
에디터스 드래프트:
https://drafts.css-houdini.org/css-properties-values-api-1/
이전 버전:
히스토리:
https://www.w3.org/standards/history/css-properties-values-api-1/
피드백:
public-houdini@w3.org 제목에 “[css-properties-values-api] … message topic …”를 포함하여 (아카이브)
GitHub
에디터:
Tab Atkins-Bittner (Google)
이전 에디터:

요약

이 CSS 모듈은 새로운 CSS 속성을 등록하기 위한 API를 정의합니다. 이 API를 사용하여 등록된 속성들은 타입, 상속 동작, 초기 값을 정의하는 구문 분석 방식이 제공됩니다.

이 문서의 상태

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

이 문서는 CSS 작업 그룹에서 워킹 드래프트추천 트랙을 따라 발행되었습니다. 워킹 드래프트로 발행되었다고 해서 W3C 및 회원들의 승인을 의미하는 것은 아닙니다.

이 문서는 초안 문서로, 언제든지 업데이트, 교체, 폐기될 수 있습니다. 진행 중인 작업 외의 인용은 적합하지 않습니다.

피드백은 GitHub에서 이슈 등록(권장)을 통해 보내주십시오. 제목에 “css-properties-values-api”를 포함하여 “[css-properties-values-api] …코멘트 요약…”처럼 작성해 주시기 바랍니다. 모든 이슈와 코멘트는 아카이브에 저장됩니다. 또는, 피드백은 (아카이브) 공개 메일링 리스트 www-style@w3.org로 보낼 수 있습니다.

이 문서는 2023년 11월 3일 W3C 프로세스 문서가 적용됩니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 작성되었습니다. W3C는 그룹 산출물과 관련하여 공개된 특허 공개 목록을 유지하고 있습니다. 해당 페이지에는 특허 공개 방법도 안내되어 있습니다. 실제로 특허를 보유하고 있고 해당 특허가 필수 청구항을 포함한다고 믿는 개인은 W3C 특허 정책 6절에 따라 정보를 공개해야 합니다.

1. 소개

CSS는 웹 문서의 레이아웃, 페인팅 또는 동작을 수정하기 위해 조작할 수 있는 포괄적인 속성 집합을 정의합니다. 하지만 웹 저자들은 이 속성 집합을 추가적인 속성으로 확장하고 싶어하는 경우가 많습니다.

[css-variables]는 사용자가 제어할 수 있는 속성을 정의할 수 있는 원시적인 방법을 제공합니다. 그러나 이러한 속성은 항상 토큰 리스트를 값으로 사용하고, 항상 상속되어야 하며, var() 참조를 통해 다른 속성의 값에 다시 통합될 때만 문서의 레이아웃이나 페인팅에 영향을 줄 수 있습니다.

이 명세는 [css-variables]를 확장하여, 값 타입, 초기 값, 정의된 상속 동작을 갖는 속성을 두 가지 방법을 통해 등록할 수 있도록 합니다:

이 명세는 [css-paint-api-1][css-layout-api-1]와 보완적으로 동작합니다. 이 명세들은 사용자 정의 속성이 각각 페인팅 또는 레이아웃 동작에 직접 영향을 줄 수 있게 해줍니다.

2. 등록된 사용자 정의 속성

사용자 정의 속성등록된 사용자 정의 속성이 될 수 있습니다. 등록되면 UA(사용자 에이전트)가 정의한 속성처럼 동작하며, UA가 검증하는 구문, 초기 값, 특정 상속 동작을 갖게 됩니다. 이는 @property 규칙이나, registerProperty() JS 함수를 통해 가능합니다.

사용자 정의 속성Document에 대해 다음 중 하나에 해당하면 등록된 것으로 간주됩니다: 문서의 스타일시트 중 하나에 이름에 대해 유효한 @property 규칙이 정의되어 있거나, 이름이 문서의 [[registeredPropertySet]] 슬롯에 포함되어 있을 때 (registerProperty() 로 등록된 경우).

등록된 사용자 정의 속성은 등록되지 않은 사용자 정의 속성과 유사하게 동작하지만, 아래에서 정의된 점이 다릅니다.

2.1. 등록 여부 결정

등록된 사용자 정의 속성사용자 정의 속성 등록 정보를 가지며, 실제 속성처럼 처리하기 위한 모든 데이터를 포함합니다. 이는 다음으로 구성된 구조체입니다:

만약 Document[[registeredPropertySet]] 슬롯이 포함하는 레코드에 사용자 정의 속성의 이름이 있다면, 등록 정보는 해당 레코드입니다.

그렇지 않으면, Document의 활성 스타일시트에 이름에 대해 유효한 @property 규칙이 하나 이상 있다면, 문서 순서상 마지막 규칙이 등록 정보가 됩니다.

그 밖에는 등록 정보가 없으며, 사용자 정의 속성등록된 사용자 정의 속성이 아닙니다.

2.2. 구문 분석 시 동작

등록된 사용자 정의 속성은 등록되지 않은 사용자 정의 속성과 동일하게 구문 분석됩니다. 거의 모든 값이 허용됩니다. 등록된 속성의 구문은 구문 분석 시점에 검사되지 않습니다.

참고: 다만, 구문은 계산 값 시점에 var()로 치환되기 전에 검사됩니다. § 2.4 계산 값 시점 동작을 참조하십시오.

왜 사용자 정의 속성은 구문 검사를 하지 않을까요?

페이지의 CSS를 파싱할 때, UA는 속도와 메모리 모두를 향상시키기 위해 여러 최적화를 적용합니다.

그 중 하나는 실제로 효과가 있는 속성만 저장하고; 잘못된 속성은 버리며, 하나의 선언 블록에서 같은 속성을 여러 번 쓴 경우 마지막 유효한 것만 남기고 나머지는 버립니다. (이것은 CSS의 오류 복구와 미래 호환성 동작에 매우 중요합니다.)

속성의 구문이 페이지의 생명주기 동안 결코 변하지 않는다면 이 방식은 잘 작동합니다. 하지만 사용자 정의 속성이 등록되면 구문이 변경될 수 있고, 이전에는 잘못된 값이었던 속성이 갑자기 유효해질 수 있습니다.

이를 처리하는 방법은 모든 선언을 저장하거나, (처음에 잘못된 것까지 모두, 페이지의 메모리 비용 증가) 새 구문 규칙으로 페이지의 CSS 전체를 다시 파싱하는 것뿐입니다. (사용자 정의 속성 등록 시 처리 비용 증가) 둘 다 바람직하지 않습니다.

또한 UA가 정의한 속성의 구문은 사용자가 보고 있는 UA 버전에 의해 결정되고, 이는 저자가 제어할 수 없습니다. 이 때문에 CSS는 오류 복구 동작과 다양한 지원 수준을 위한 여러 선언을 작성하는 관행이 있습니다. 반면, 사용자 정의 속성의 구문은 페이지 저자가 스타일시트나 스크립트로 직접 제어합니다; 관리해야 할 불확실성이 없습니다. 구문 오류가 있는 사용자 정의 속성을 버리는 것은 저자에게 편의성만 제공할 뿐, UA 정의 속성처럼 반드시 필요한 것은 아닙니다.

2.3. 지정 값 처리 시 동작

등록되지 않은 사용자 정의 속성과 마찬가지로, 모든 등록된 사용자 정의 속성은 등록된 구문과 관계없이, CSS 전체 키워드(예: inherit 또는 revert)를 허용합니다. 동작은 CSS Cascading 4 § 7.3 명시적 기본값 지정에서 정의되어 있습니다.

2.4. 계산 값 처리 시 동작

등록된 사용자 정의 속성의 계산 값은 등록 정보의 구문에 의해 결정됩니다.

만약 등록 정보의 구문이 범용 구문 정의라면, 계산 값은 등록되지 않은 사용자 정의 속성과 동일합니다 (변수가 치환된 지정 값 또는 보장된-잘못된 값).

그 외의 경우, 등록된 구문에 따라 속성 값을 파싱하려 시도합니다. 실패하면, 선언은 계산 값 시점에 잘못된 값이 되며, 계산 값은 이에 따라 결정됩니다. 성공하면, 계산 값은 구문의 종류에 따라 달라집니다:

"<length>", "<length-percentage>", "<angle>", "<time>", "<resolution>", "<integer>", "<number>", 그리고 "<percentage>" 값의 경우:

"<color>" 값의 경우, 값은 색상 값을 해석하여 계산되며, CSS Color 4 § 14. <color> 값 해석에 따릅니다.

"<custom-ident>", ident, 또는 "*" 값의 경우, 계산 값은 지정 값 그대로입니다.

"<url>" 값의 경우, 계산 값은 다음 중 하나입니다:

URL 동작 예시
URL은 자신이 속한 스타일시트의 기준 URL을 기준으로 해석되므로, 같은 속성 내에 있어도 서로 다른 기준 URL에 대해 여러 상대 URL이 해석될 수 있습니다.

예를 들어, --url-foo--url-bar<url> 구문으로 등록된 사용자 정의 속성이라고 가정하고, /style/foo/foo.css에 다음과 같은 스타일시트가 있다고 하겠습니다:

div {
  --url-foo: url("foo.png");
}

그리고 /style/bar/bar.css에 또 다른 스타일시트가 있습니다.

div {
  --url-bar: url("bar.png");
}

그리고 마지막으로 /index.html에 문서가 있습니다:

<link href="/style/foo/foo.css" rel="stylesheet" type="text/css">
<link href="/style/bar/bar.css" rel="stylesheet" type="text/css">
<div style="background-image: var(--url-foo), var(---url-bar);">
</div>

여기서 var(--url-foo) 참조는 /style/foo를 기준으로 URL을 해석하고, var(--url-bar) 참조는 /style/bar를 기준으로 해석됩니다.

반면, --url-foo--url-bar가 등록되지 않은 경우, 값(상대 URL)을 /index.html 스타일시트로 치환하게 되고, URL은 /index.html을 기준으로 해석됩니다.

"<image>" 값의 경우, 계산 값은 계산된 <image>입니다.

"<transform-function>""<transform-list>" 값의 경우, 계산 값은 모든 길이가 계산된 값으로 해석된 지정 값입니다.

반복자가 있는 구문의 경우, 계산 값은 기본 타입의 계산 값 리스트입니다.

| 조합자로 명시된 구문의 경우, 값을 만족시키는 첫 번째 절의 계산 값 규칙을 적용하여 계산 값을 얻습니다.

2.5. 애니메이션 동작

참고: [css3-animations][css3-transitions]에서 정의된 것처럼, 사용자 정의 속성을 참조하는 애니메이션 및 트랜지션을 지정할 수 있습니다.

애니메이션과 트랜지션에서 참조될 때, 사용자 정의 속성 값은 파싱된 타입에 따라 보간되며 계산 값 기준으로 동작합니다.

참고: <color>+ 또는 <color>#와 같은 값 목록은 각 구성요소를 인덱스별로 맞춰 단순 리스트로 보간되며, 구성요소의 수가 일치하지 않으면 보간이 실패합니다.

위 규칙의 예외로, 값이 <transform-list>, <transform-function>, 또는 <transform-function>+로 파싱된 경우에는 transform 속성의 방식으로 보간됩니다.

참고: 만약 어떤 이유로든 사용자 정의 속성이 <transform-function># 구문으로 정의된 경우, 먼저 단순 리스트로 보간되고, 이후 각 리스트 항목이 transform 값으로 보간됩니다.

참고: 사용자 정의 속성을 등록(또는 등록을 변경)하면 계산 값이 바뀔 수 있으며, 이는 CSS 트랜지션을 시작하거나 중단시킬 수 있습니다.

2.6. 조건부 규칙

§ 2.2 구문 분석 시 동작에서 설명한 것처럼, 등록되지 않은 속성과 등록된 사용자 정의 속성 모두 파싱 시 거의 모든 값을 허용합니다. 등록된 사용자 정의 속성은 계산 값 시점에만 구문이 적용됩니다.

따라서 모든 사용자 정의 속성은, 등록 여부와 관계없이, @supports 규칙에서 "true"로 판정됩니다. 단, 사용자 정의 속성의 (매우 자유로운) 일반 구문을 위반하지 않아야 합니다.

예를 들어, 사용자 정의 속성이 syntax: "<color>";로 등록되어 있더라도, @supports (--foo: 1em) {...} 같은 규칙은 true로 평가되어 스타일이 적용됩니다. 해당 선언이 실제로 유효한 속성으로 성공적으로 파싱되기 때문입니다.

2.7. var()를 통한 치환

등록되지 않은 사용자 정의 속성처럼, 등록된 사용자 정의 속성의 값도 var() 함수로 다른 값에 치환할 수 있습니다. 하지만 등록된 사용자 정의 속성은 원래 토큰 시퀀스가 아니라 계산 값으로서 치환됩니다.

등록된 사용자 정의 속성을 참조하는 var() 함수는 반드시 동등한 토큰 시퀀스로 대체되어야 하며, 이는 계산 값이 직렬화된 후 토큰화된 문자열과 동일합니다.

예를 들어, --x<length> 구문으로 등록되어 있고, '--y'가 등록되지 않은 사용자 정의 속성이라면,
div {
  font-size: 10px;
  --x: 8em;
  --y: var(--x);
}

--x의 계산 값(직렬화 시)이 "80px"이므로, --y의 계산 값은 값이 "80"이고 단위가 "px"인 <dimension-token>입니다.

2.7.1. var() 참조의 폴백

var() 함수를 사용해 등록된 사용자 정의 속성을 참조할 때는 폴백을 제공할 수 있습니다. 하지만 폴백 값은 참조하는 사용자 정의 속성의 구문 정의와 일치해야 하며, 그렇지 않으면 선언이 계산 값 시점에 잘못된 값이 됩니다.

참고: 폴백이 실제로 사용되는지 여부와 관계없이 이 규칙이 적용됩니다.

2.7.2. 상대 단위를 통한 의존성 순환

등록된 사용자 정의 속성은 등록되지 않은 사용자 정의 속성과 동일한 의존성 순환 해결 규칙을 따르지만, 다음과 같은 추가 제약이 있습니다:

다음과 같은 구문 구성요소(<length> 또는 <length-percentage>)를 가진 등록된 사용자 정의 속성의 경우:

예를 들어, 다음과 같이 등록한 경우:
CSS.registerProperty({
  name: "--my-font-size",
  syntax: "<length>",
  initialValue: "0px",
  inherits: false
});

다음과 같이 하면 의존성 순환이 발생합니다:

div {
  --my-font-size: 10em;
  font-size: var(--my-font-size);
}

그리고 font-sizeunset 값이 지정된 것처럼 동작합니다.

2.8. 섀도우 DOM

CSS의 많은 개념과 달리 (CSS Scoping 1 § 3.5 이름 정의 구조와 상속 참고), 속성 등록은 트리 범위에 한정되지 않습니다. 모든 등록은, 최상위 문서에 있든 섀도우 트리 내부에 있든, Document의 단일 글로벌 등록 맵에서 상호작용합니다.

왜 등록을 범위로 나눌 수 없나요?

속성 등록을 범위로 나누는 명확한 용례가 있습니다—​섀도우 DOM을 사용하는 컴포넌트가 자체 내부 용도로 사용자 정의 속성을 등록할 때, 외부 페이지에서 등록을 알 필요가 없으므로 외부 페이지가 해당 속성 등록을 볼 필요가 없습니다.

하지만 등록을 범위로 한정하지 않는 이유도 있습니다—​사용자 정의 속성은 컴포넌트로 데이터를 전달하는 데 사용되며, 외부 페이지가 해당 사용자 정의 속성을 설정하고 그 등록에 의해 구문 검사를 받는 것이 유용합니다; 마찬가지로 속성의 초기값 같은 개념도 속성 등록이 전역에 존재해야 의미가 있습니다. 그래야 속성이 문서의 루트에서도 적용됩니다.

하지만 위의 내용은 등록 범위가 제어 가능해야 한다는 의미이지, 반드시 글로벌이어야 한다는 의미는 아닙니다.

등록이 반드시 글로벌이어야 하는 이유는, 요소가 동시에 여러 트리 범위에 존재할 수 있기 때문입니다. 각 트리 범위의 스타일이 서로 섞이고 함께 캐스케이드됩니다. 이는 외부 트리에 존재하면서도 섀도우 트리에서 스타일 지정이 가능한 host 요소에도 적용되며, :host 선택자를 통해 섀도우 트리에서 스타일링할 수 있습니다. 또한 외부 트리에서 ::part() 의사 요소를 통해 섀도우 DOM 내부 요소에 스타일을 적용할 수도 있습니다.

등록이 트리 범위별로 한정될 수 있고, 하나의 속성이 내부와 외부 모두에서 등록된다면, 어떤 등록을 적용해 값을 파싱해야 할지 명확하지 않습니다. 값이 어떤 트리에서 왔는지 추적하고(다른 트리 범위 값에 대해 하는 것처럼) 해당 등록을 적용한다 해도, 섀도우 DOM이 특정 값 공간을 기대하다가 외부 트리가 캐스케이드에서 이겨서 완전히 다른 등록을 적용받으면 의도와 다른 결과가 나타날 수 있습니다.

사용자 정의 속성이 섀도우 DOM 기반 컴포넌트의 공개 API 일부로 노출되는 경우, 이 글로벌 등록 동작은 의도대로 동작합니다. 외부 페이지가 동일한 이름의 사용자 정의 속성을 다른 목적으로 사용하면, 이미 충돌이 발생하는 상황이므로 등록 동작이 문제를 더 악화시키지는 않습니다.

컴포넌트의 내부 전용 목적으로 사용자 정의 속성을 사용할 경우, 다른 컨텍스트와의 충돌 가능성을 최소화하기 위해 속성에 고유할 가능성이 높은 이름을 사용하는 것이 권장됩니다. 예를 들어, 프로젝트 이름이나 짧은 임의 문자열을 속성 이름에 포함시키는 방법이 있습니다.

3. @property 규칙

@property 규칙은 JS를 실행하지 않고도 스타일시트에서 직접 사용자 정의 속성 등록 정보를 나타냅니다. 유효한 @property 규칙은 등록된 사용자 정의 속성이 되며, registerProperty()가 동일한 매개변수로 호출된 것과 동일하게 동작합니다.

@property의 구문은 다음과 같습니다:

@property <custom-property-name> {
  <declaration-list>
}

유효한 @property 규칙은 사용자 정의 속성 등록 정보를 나타내며, 속성 이름은 규칙의 프렐루드에 있는 <custom-property-name>의 직렬화 값입니다.

@property 규칙에는 syntaxinherits 디스크립터가 반드시 필요합니다; 둘 중 하나라도 없으면 전체 규칙은 무효이며 무시되어야 합니다. initial-value 디스크립터는 구문이 범용 구문 정의일 때만 선택적으로 생략할 수 있고, 그 외에는 반드시 필요합니다; 없으면 전체 규칙은 무효이며 무시되어야 합니다.

알 수 없는 디스크립터는 무효이며 무시되지만, @property 규칙 자체를 무효화하지는 않습니다.

참고: § 2.1 등록 여부 결정에서 명시된 것처럼, 동일한 <custom-property-name>에 대해 여러 개의 유효한 @property 규칙이 정의되어 있으면, 스타일시트 순서상 마지막 규칙이 "승리"합니다. CSS.registerProperty()로 등록된 정보는 동일한 <custom-property-name>에 대해 어떠한 @property 규칙보다 우선합니다.

3.1. syntax 디스크립터

이름: syntax
대상: @property
값: <string>
초기값: n/a (본문 참조)

@property 규칙이 나타내는 사용자 정의 속성 등록 정보의 구문을 지정하며, 속성 값이 계산 값 시점에 어떻게 파싱되는지 제어합니다.

syntax 디스크립터는 @property 규칙이 유효하려면 반드시 필요합니다; 없으면 @property 규칙은 무효입니다.

제공된 문자열이 구문 문자열로 유효하지 않으면 (해당 문자열에 대해 구문 정의 소비를 호출하면 실패가 반환되는 경우), 해당 디스크립터는 무효이며 무시되어야 합니다.

3.2. inherits 디스크립터

이름: inherits
대상: @property
값: true | false
초기값: n/a (본문 참조)

custom property registration의 상속 플래그를 지정하며, @property 규칙을 통해 속성이 기본적으로 상속되는지 여부를 제어합니다.

inherits 디스크립터는 @property 규칙이 유효하려면 반드시 필요합니다; 없으면 @property 규칙은 무효입니다.

3.3. initial-value 디스크립터

이름: initial-value
대상: @property
값: <declaration-value>?
초기값: guaranteed-invalid value (본문 참조)

custom property registration의 초기값을 지정하며, @property 규칙을 통해 속성의 초기값을 제어합니다.

syntax 디스크립터의 값이 범용 구문 정의라면, initial-value 디스크립터는 선택사항입니다. 생략된 경우 속성의 초기값guaranteed-invalid value입니다.

그 외의 경우, syntax 디스크립터의 값이 범용 구문 정의가 아니라면, @property 규칙이 유효하려면 다음 조건을 만족해야 합니다:

위 조건을 만족하지 않으면 @property 규칙은 무효입니다.

4. JS에서 사용자 정의 속성 등록

JS를 통해 사용자 정의 속성을 등록하려면, CSS 객체에 registerProperty() 메서드가 추가됩니다:

dictionary PropertyDefinition {
  required DOMString name;
           DOMString syntax       = "*";
  required boolean   inherits;
           DOMString initialValue;
};

partial namespace CSS {
  undefined registerProperty(PropertyDefinition definition);
};

추가적으로, Document 객체에는 [[registeredPropertySet]] 라는 새로운 private 슬롯이 추가되며, 이는 등록된 사용자 정의 속성을 설명하는 레코드 집합입니다.

4.1. registerProperty() 함수

registerProperty(PropertyDefinition definition) 메서드는 definition에 지정된 설정 옵션에 따라 사용자 정의 속성을 등록합니다. 호출될 때, definition 인자의 옵션들을 동일한 이름의 인자로 넘겨 register a custom property 알고리즘을 실행합니다.

register a custom property 알고리즘은 name이 문자열이고, 선택적으로 syntax가 문자열, inherits가 불리언, initialValue가 문자열일 때 다음 단계를 실행합니다:
  1. property set현재 글로벌 객체의 연결된 Document[[registeredPropertySet]] 슬롯 값으로 설정합니다.

  2. namecustom property name string이 아니면, throw SyntaxError 하고 알고리즘을 종료합니다.

    property setname과 동일한 property name(코드포인트 비교)이 이미 있으면, throw InvalidModificationError 하고 알고리즘을 종료합니다.

  3. syntax에서 구문 정의 소비를 시도합니다. 실패하면 throw SyntaxError 하고 알고리즘을 종료합니다. 성공하면 반환된 syntax definitionsyntax definition으로 설정합니다.

  4. syntax definition범용 구문 정의이고, initialValue가 존재하지 않으면, parsed initial value를 비어있음으로 설정합니다. 이는 [css-variables]에 정의된 사용자 정의 속성의 "기본" 초기값과 동일하게 처리되어야 합니다. 알고리즘의 다음 단계로 이동합니다.

    그 외에, syntax definition범용 구문 정의이면, parse initialValue<declaration-value>로 파싱합니다. 실패하면 throw SyntaxError 하고 알고리즘을 종료합니다. 성공하면 parsed initial value를 파싱 결과로 설정합니다. 알고리즘의 다음 단계로 이동합니다.

    그 외에 initialValue가 존재하지 않으면, throw SyntaxError 하고 알고리즘을 종료합니다.

    그 밖에는 parse initialValuesyntax definition에 따라 파싱합니다. 실패하면 throw SyntaxError 하고 알고리즘을 종료합니다.

    성공하면 parsed initial value를 파싱 결과로 설정합니다. parsed initial value계산적으로 독립적이 아니면, throw SyntaxError 하고 알고리즘을 종료합니다.

  5. inherit flaginherits의 값으로 설정합니다.

  6. registered propertystruct로 만들되, property name에 name, syntax에 syntax definition, initial value에 parsed initial value, inherit flag에 inherit flag를 설정합니다. Append registered propertyproperty set에 추가합니다.

속성 값이 계산적으로 독립적이란, 오직 해당 요소의 속성 값과 "CSS로 변경할 수 없는" 글로벌 정보만으로 계산 값으로 변환할 수 있는 경우를 의미합니다.

예를 들어, 5px계산적으로 독립적입니다. 계산 값으로 변환해도 값이 변하지 않기 때문입니다. 마찬가지로 1in계산적으로 독립적입니다. 계산 값으로 변환할 때 1in96px이라는 "글로벌 지식"만 의존하며, 이는 CSS에서 변경하거나 조정할 수 없습니다.

반면, 3em계산적으로 독립적이 아닙니다. 해당 요소(또는 부모)의 font-size 값에 의존하기 때문입니다. var() 함수가 있는 값도 마찬가지로, 사용자 정의 속성의 값에 의존하기 때문입니다.

사용자 정의 속성이 특정 타입으로 등록되면, 해당 속성의 지정 값이 계산 값으로 변환되는 과정은 선택된 타입에 의해 완전히 정의되며, § 2.4 계산 값 처리 동작에 설명되어 있습니다.

참고: 속성을 등록 해제하는 방법은 추후 추가될 수 있습니다.

사용자 정의 속성 등록은 cascade절대 영향을 주지 않아야 합니다. 등록된 속성에 어떤 구문이 지정되었든, 파싱 시점에는 여전히 사용자 정의 속성의 일반 파싱 방식으로 처리되며, 거의 모든 값을 허용합니다. specified value가 등록된 구문을 위반하면, 해당 속성은 계산 값 시점에 잘못된 값이 되어 등록된 초기값으로 리셋됩니다.

기본적으로, 토큰 시퀀스로 파싱될 수 있는 모든 사용자 정의 속성 선언은 유효합니다. 따라서 아래 스타일시트의 결과는:
.thing {
  --my-color: green;
  --my-color: url("not-a-color");
  color: var(--my-color);
}

"thing" 클래스 요소의 color 속성이 inherit으로 설정됩니다. 두 번째 --my-color 선언이 첫 번째 선언을 파싱 시점에 덮어쓰고(둘 다 유효함), var() 참조가 color 속성에서 계산 값 시점에 잘못된 값으로 판정되어(url("not-a-color")이 color가 아니기 때문), CSS 파이프라인의 이 단계(계산 시점)에서는 속성의 초기값만 폴백으로 사용됩니다. color 속성의 경우 inherit입니다. 유효한 값(green)이 있었지만, URL이 덮어써서 파싱 시점에 제거되었습니다.

다음과 같이 호출하면:

CSS.registerProperty({
  name: "--my-color",
  syntax: "<color>",
  initialValue: "black",
  inherits: false
});

등록이 위 스타일시트보다 먼저든 나중이든 파싱 방식에 큰 변화는 없습니다. 다른 점은 --my-color 속성이 계산 값 시점에 잘못된 값이 되어 초기값 black으로 설정된다는 점입니다. 그 후 color 속성은 black으로 유효하게 설정되며, 계산 값 시점에 잘못된 값이 되어 inherit이 되는 것이 아닙니다.

4.2. PropertyDefinition 딕셔너리

PropertyDefinition 딕셔너리는 사용자 정의 속성에 대해 저자가 지정한 설정 옵션을 나타냅니다. PropertyDefinition 딕셔너리에는 다음 멤버가 포함됩니다:

name, 타입 DOMString

정의되는 사용자 정의 속성의 이름입니다.

syntax, 타입 DOMString, 기본값 "*"

이 사용자 정의 속성이 어떻게 파싱되는지 나타내는 문자열입니다.

inherits, 타입 boolean

이 사용자 정의 속성이 DOM 트리에서 상속되어야 한다면 true, 그렇지 않으면 false입니다.

initialValue, 타입 DOMString

이 사용자 정의 속성의 초기값입니다.

5. 구문 문자열

구문 문자열은 등록된 사용자 정의 속성이 허용하는 값 타입을 설명합니다. 구문 문자열은 구문 구성요소 이름으로 이루어져 있으며, 선택적으로 반복자조합자로 결합할 수 있습니다.

구문 문자열은 구문 정의로 파싱될 수 있으며, 이는 다음 중 하나입니다:

  1. 구문 구성요소 리스트. 각각 § 5.1 지원되는 이름에서 지정된 값 타입을 허용합니다.

  2. 범용 구문 정의 (*)로, 모든 유효한 토큰 스트림을 허용합니다.

참고: 지정된 구문과 관계없이 모든 사용자 정의 속성은 CSS 전체 키워드를 허용하며, 이에 맞게 값을 처리합니다.

예를 들어, 다음은 모두 유효한 구문 문자열입니다.
"<length>"

길이 값을 허용합니다

"<length> | <percentage>"

길이, 백분율, 백분율 calc 표현식, 길이 calc 표현식을 허용하지만 길이와 백분율이 혼합된 calc 표현식은 허용하지 않습니다.

"<length-percentage>"

"<length> | <percentage>"가 허용하는 모든 값과, 길이와 백분율이 혼합된 calc 표현식도 허용합니다.

"big | bigger | BIGGER"

ident big, bigger, BIGGER 중 하나를 허용합니다.

"<length>+"

공백으로 구분된 길이 값 리스트를 허용합니다.

"*"

모든 유효한 토큰 스트림을 허용합니다

참고: 구문 문자열의 내부 문법은 CSS 값 정의 문법의 부분집합입니다. 향후 명세에서는 허용되는 문법의 복잡성이 더 확대되어, 사용자 정의 속성이 CSS 속성 전체와 더 유사하게 동작할 수 있을 것입니다.

이 장의 나머지 부분에서는 구문 문자열의 내부 문법을 설명합니다.

5.1. 지원되는 이름

이 섹션에서는 지원되는 구문 구성요소 이름과, 결과적으로 생성되는 구문 구성요소가 허용하는 타입을 정의합니다.

"<length>"

모든 유효한 <length>

"<number>"

<number>

"<percentage>"

모든 유효한 <percentage>

"<length-percentage>"

모든 유효한 <length> 또는 <percentage> 값, 그리고 <calc()> 표현식에서 <length><percentage> 구성요소를 결합한 값.

"<color>"

모든 유효한 <color>

"<image>"

모든 유효한 <image>

"<url>"

모든 유효한 <url>

"<integer>"

모든 유효한 <integer>

"<angle>"

모든 유효한 <angle>

"<time>"

모든 유효한 <time>

"<resolution>"

모든 유효한 <resolution>

"<transform-function>"

모든 유효한 <transform-function>

"<custom-ident>"

모든 유효한 <custom-ident>

식별자 시작이 가능한 시퀀스, 이름으로 소비 가능하고, <custom-ident> 생산식에 일치하는 경우

그 식별자

참고: <custom-ident>들은 서로 코드포인트 단위로 비교합니다; 이는 UA 정의 CSS의 일반 동작(ASCII만 제한, ASCII 대소문자 무시)과 다릅니다. 예를 들어, Red를 지정하면 정확히 그 값만 허용되며 Red, red, RED 등은 일치하지 않습니다. CSS 규칙과 맞추기 위해 ident는 ASCII로 제한하고 소문자로 작성하는 것이 권장됩니다.

"<transform-list>"

유효한 <transform-function> 값 리스트. "<transform-list>"사전-반복된 데이터 타입 이름으로 "<transform-function>+"와 동일합니다.

참고: 구문 문자열 "*"범용 구문 정의를 생성하며, 이는 구문 구성요소가 아닙니다. 따라서 "*"는 어떤 것과도 반복자조합자로 결합할 수 없습니다.

5.2. '+' 및 '#' 반복자

구문 구성요소 이름사전-반복된 데이터 타입 이름을 제외한 모든 이름은 반복자를 바로 뒤에 붙일 수 있습니다:

U+002B 플러스 기호 (+)

공백으로 구분된 리스트를 나타냅니다.

U+0023 샵 기호 (#)

콤마로 구분된 리스트를 나타냅니다.

"<length>+"

공백으로 구분된 길이 값 리스트를 허용합니다

"<color>#"

콤마로 구분된 색상 값 리스트를 허용합니다

참고: 반복자는 반드시 반복될 구문 구성요소 이름 바로 뒤에 붙어야 합니다.

5.3. '|' 조합자

구문 문자열은 U+007C 세로줄 (|)로 여러 구문 구성요소 이름을 제공할 수 있습니다. 이런 구문 문자열은 구문 정의에서 여러 구문 구성요소를 가지게 됩니다.

여러 구문 구성요소가 있는 구문 정의로 CSS 값을 파싱할 때, 지정된 순서대로 구성요소를 매칭합니다.

참고: 예를 들어, 구문 문자열 "red | <color>"에서는, 값 red는 식별자로 파싱되고, 값 blue<color>로 파싱됩니다.

"<length> | auto"

길이 또는 auto를 허용합니다

"foo | <color># | <integer>"

foo, 콤마로 구분된 색상 값 리스트, 또는 하나의 정수를 허용합니다

5.4. 구문 문자열 파싱

5.4.1. 정의

데이터 타입 이름

U+003C LESS-THAN SIGN (<)으로 시작하고 0개 이상의 ident 코드포인트로 이어지며, U+003E GREATER-THAN SIGN (>)으로 끝나는 코드포인트 시퀀스입니다.

사전-반복된 데이터 타입 이름

데이터 타입 이름에서 구문 구성요소에 이미 반복자가 포함된 경우입니다.

구문 구성요소

구문 구성요소 이름과 선택적으로 반복자로 구성된 객체입니다.

구문 구성요소 이름

코드포인트 시퀀스로, 데이터 타입 이름 또는 <custom-ident>을 생성할 수 있는 시퀀스입니다.

구문 정의

구문 구성요소 리스트로 구성된 객체입니다.

범용 구문 정의

모든 유효한 토큰 스트림을 허용하는 특수 구문 정의입니다.

5.4.2. 구문 정의 소비

이 섹션에서는 구문 정의 소비string string에서 어떻게 이루어지는지 설명합니다. 이 과정은 syntax definitionsyntax components 리스트 또는 universal syntax definition을 생성합니다.
  1. ASCII 앞뒤 공백 제거string에 적용합니다.

  2. string길이가 0이면, 실패를 반환합니다.

  3. string길이 가 1이고, 유일한 코드포인트가 U+002A ASTERISK (*)라면, 범용 구문 정의를 반환합니다.

  4. stream입력 스트림으로 생성합니다. 코드포인트string을 변환하고, [css-syntax-3]에 지정된 대로 전처리합니다. definition리스트로 초기화합니다. 구문 구성요소만 포함합니다.

  5. 구문 구성요소 소비stream에서 실행합니다. 실패하면 실패를 반환합니다; 그렇지 않으면 반환된 값을 리스트에 추가합니다.

    공백을 가능한 만큼 stream에서 소비합니다.

    stream다음 입력 코드포인트를 소비합니다:

    EOF

    definition을 반환합니다.

    U+007C 세로줄 (|)

    5단계를 반복합니다.

    그 외:

    실패를 반환합니다.

5.4.3. 구문 구성요소 소비

구문 구성요소 소비code points 스트림 stream에서 수행하는 방법:

stream에서 가능한 한 많은 공백을 소비합니다.

component를 새 구문 구성요소로 생성하되, namemultiplier는 처음엔 비워둡니다.

stream에서 다음 입력 코드포인트를 소비합니다:

U+003C LESS-THAN SIGN (<)

데이터 타입 이름 소비stream에서 수행합니다. 반환값이 string이면 componentname에 그 값을 할당합니다. 그렇지 않으면 실패를 반환합니다.

ident-start 코드포인트
U+005C REVERSE SOLIDUS (\)

스트림이 ident 시퀀스로 시작하면, 현재 입력 코드포인트를 다시 사용한 뒤, ident 시퀀스 소비stream에서 수행하고, componentname에 반환값을 할당합니다. 그렇지 않으면 실패를 반환합니다.

componentname<custom-ident>으로 파싱되지 않으면 실패를 반환합니다.

그 외

실패를 반환합니다.

componentname사전-반복된 데이터 타입 이름이면, component를 반환합니다.

stream에서 다음 입력 코드포인트가 U+002B PLUS SIGN (+) 또는 U+0023 NUMBER SIGN (#)이면, 다음 입력 코드포인트stream에서 소비하고, componentmultiplier현재 입력 코드포인트를 할당합니다.

component를 반환합니다.

5.4.4. 데이터 타입 이름 소비

데이터 타입 이름 소비code points 스트림에서 수행하는 방법:

참고: 이 알고리즘은 U+003C LESS-THAN SIGN (<) 코드포인트가 이미 스트림에서 소비되었다고 가정합니다.

name을 U+003C LESS-THAN SIGN (<) 코드포인트 하나만 포함하는 문자열로 초기화합니다.

다음 입력 코드포인트를 반복적으로 소비합니다:

U+003E GREATER-THAN SIGN (>)

코드포인트name에 추가합니다. name지원되는 구문 구성요소 이름이면 name을 반환, 그렇지 않으면 실패를 반환합니다.

ident 코드포인트

코드포인트name에 추가합니다.

그 외

실패를 반환합니다.

6. CSSOM

등록된 사용자 정의 속성에 지정된 값은 계산 값 시점까지 해석되지 않습니다. 즉, 계산 값을 반환하는 API만 영향을 받으며, 그 외 API는 연결된 [[registeredPropertySet]] 슬롯을 무시하고, 모든 사용자 정의 속성을 등록되지 않은 것으로 처리해야 합니다.

6.1. CSSPropertyRule 인터페이스

CSSPropertyRule 인터페이스는 @property 규칙을 표현합니다.

[Exposed=Window]
interface CSSPropertyRule : CSSRule {
  readonly attribute CSSOMString name;
  readonly attribute CSSOMString syntax;
  readonly attribute boolean inherits;
  readonly attribute CSSOMString? initialValue;
};
name, 타입 CSSOMString, 읽기 전용
@property 규칙과 연관된 사용자 정의 속성 이름.
syntax, 타입 CSSOMString, 읽기 전용
@property와 연관된 구문(명시된 그대로).
inherits, 타입 boolean, 읽기 전용
@property 규칙과 연관된 inherits 디스크립터.
initialValue, 타입 CSSOMString, 읽기 전용, nullable
@property 규칙과 연관된 초기값(없을 수도 있음).
CSSPropertyRule 직렬화 방법: 다음을 연결하여 반환합니다:
  1. 문자열 "@property"와 단일 공백(U+0020)을 반환.

  2. 규칙의 name에 식별자 직렬화를 수행한 결과와 단일 공백(U+0020)을 반환.

  3. 문자열 "{ ", 즉 왼쪽 중괄호(U+007B)와 공백(U+0020)를 반환.

  4. 문자열 "syntax:"와 단일 공백(U+0020)을 반환.

  5. 규칙의 syntax문자열 직렬화를 수행한 결과, 세미콜론(U+003B), 공백(U+0020)을 반환.

  6. 문자열 "inherits:"와 단일 공백(U+0020)을 반환.

  7. 규칙의 inherits 속성에 따라 다음 중 하나를 반환:

    true

    문자열 "true", 세미콜론(U+003B), 공백(U+0020)을 반환.

    false

    문자열 "false", 세미콜론(U+003B), 공백(U+0020)을 반환.

  8. 규칙의 initial-value가 존재한다면, 다음을 수행:

    1. 문자열 "initial-value:"를 반환.

    2. 규칙의 initial-valueCSS 값 직렬화를 수행한 결과와 세미콜론(U+003B), 공백(U+0020)을 반환.

  9. 오른쪽 중괄호(U+007D)를 반환.

6.2. CSSStyleValue 실체화

등록된 사용자 정의 속성 값 실체화 방법: 속성 property구문 정의 syntax가 주어졌을 때, 다음 단계를 수행:

지정 값은 구성요소 값 리스트 실체화를 수행하고 결과를 반환.

계산 값의 경우:

  1. 값이 <length>, <integer>, <number>, <angle>, <time>, <resolution>, <percentage> 또는 <length-percentage>이면, 숫자 값 실체화를 수행하고 결과 반환.

  2. 값이 <transform-function>이면 <transform-function> 실체화를 수행하고 결과 반환.

  3. 값이 <transform-list>이면 <transform-list> 실체화를 수행하고 결과 반환.

  4. 값이 <image>이면 CSSImageValue로 실체화하여 결과 반환.

  5. 값이 identifieridentifier 실체화를 수행하고 결과 반환.

  6. syntax범용 구문 정의이면 구성요소 값 리스트 실체화를 수행하고 결과 반환.

  7. 그 외에는 CSSStyleValue로 실체화하되 [[associatedProperty]] 내부 슬롯을 property로 설정하고 결과 반환.

7. 예시

7.1. 예시 1: 사용자 정의 속성을 사용한 애니메이션 동작 추가

<script>
CSS.registerProperty({
  name: "--stop-color",
  syntax: "<color>",
  inherits: false,
  initialValue: "rgba(0,0,0,0)"
});
</script>

<style>
.button {
  --stop-color: red;
  background: linear-gradient(var(--stop-color), black);
  transition: --stop-color 1s;
}

.button:hover {
  --stop-color: green;
}
</style>

7.2. 예시 2: @property를 사용한 속성 등록

<script>
  CSS.paintWorklet.addModule('circle.js');
</script>
<style>
  @property --radius {
    syntax: "<length>";
    inherits: false;
    initial-value: 0px;
  }

  div {
    width: 100px;
    height: 100px;
    --radius: 10px;
    background: paint(circle);
    transition: --radius 1s;
  }

  div:hover {
    --radius: 50px;
  }
</style>
<div></div>
// circle.js
registerPaint('circle', class {
    static get inputProperties() { return ['--radius']; }
    paint(ctx, geom, properties) {
      let radius = properties.get('--radius').value;
      ctx.fillStyle = 'black';
      ctx.beginPath();
      ctx.arc(geom.width / 2, geom.height / 2, radius, 0, 2 * Math.PI);
      ctx.fill();
    }
});

8. 보안 고려 사항

이 기능들로 인해 알려진 보안 이슈는 없습니다.

9. 프라이버시 고려 사항

이 기능들로 인해 알려진 프라이버시 이슈는 없습니다.

10. 변경 사항

10.1. 2020년 10월 13일 워킹 드래프트 이후 변경 사항

/* 2024년 3월 20일까지 */

준수성

문서 규칙

준수성 요구사항은 설명적 단언과 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가 비준수적이 되는 것은 아닙니다. (예: UA는 단색 모니터에서 색상을 렌더링할 필요가 없습니다.)

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

부분 구현

저자가 미래 호환 파싱 규칙을 활용해 폴백 값을 지정할 수 있도록, CSS 렌더러는 지원 수준이 없는 at-rule, 속성, 속성값, 키워드 등 모든 구문 구조를 반드시 무효로 간주하고 적절히 무시해야 합니다. 특히, 사용자 에이전트는 지원되지 않는 구성요소 값을 선택적으로 무시하고, 지원되는 값을 하나의 다중값 속성 선언에서 적용해서는 안 됩니다: 어떤 값이라도 무효(지원되지 않음)로 간주되면 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-CASCADE-4]
Elika Etemad; Tab Atkins Jr.. CSS Cascading and Inheritance Level 4. 2022년 1월 13일. CR. 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-CASCADE-6]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 6. 2023년 3월 21일. WD. URL: https://www.w3.org/TR/css-cascade-6/
[CSS-COLOR-4]
Tab Atkins Jr.; Chris Lilley; Lea Verou. CSS Color Module Level 4. 2022년 11월 1일. CR. URL: https://www.w3.org/TR/css-color-4/
[CSS-COLOR-5]
Chris Lilley; et al. CSS Color Module Level 5. 2022년 6월 28일. WD. URL: https://www.w3.org/TR/css-color-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-FONTS-4]
Chris Lilley. CSS Fonts Module Level 4. 2024년 2월 1일. WD. URL: https://www.w3.org/TR/css-fonts-4/
[CSS-IMAGES-3]
Tab Atkins Jr.; Elika Etemad; Lea Verou. CSS Images Module Level 3. 2023년 12월 18일. CR. URL: https://www.w3.org/TR/css-images-3/
[CSS-IMAGES-4]
Tab Atkins Jr.; Elika Etemad; Lea Verou. CSS Images Module Level 4. 2023년 2월 17일. WD. URL: https://www.w3.org/TR/css-images-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-TRANSFORMS-1]
Simon Fraser; et al. CSS Transforms Module Level 1. 2019년 2월 14일. CR. URL: https://www.w3.org/TR/css-transforms-1/
[CSS-TYPED-OM-1]
Shane Stephens; Tab Atkins Jr.; Naina Raisinghani. CSS Typed OM Level 1. 2018년 4월 10일. WD. URL: https://www.w3.org/TR/css-typed-om-1/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2023년 12월 18일. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-VARIABLES]
Tab Atkins Jr.. CSS Custom Properties for Cascading Variables Module Level 1. 2022년 6월 16일. CR. URL: https://www.w3.org/TR/css-variables-1/
[CSS22]
Bert Bos. Cascading Style Sheets Level 2 Revision 2 (CSS 2.2) Specification. 2016년 4월 12일. WD. URL: https://www.w3.org/TR/CSS22/
[CSS3-VALUES]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 2022년 12월 1일. CR. URL: https://www.w3.org/TR/css-values-3/
[CSSOM-1]
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/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[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
[WEB-ANIMATIONS-1]
Brian Birtles; et al. Web Animations. 2023년 6월 5일. 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-LAYOUT-API-1]
Greg Whitworth; et al. CSS Layout API Level 1. 2018년 4월 12일. WD. URL: https://www.w3.org/TR/css-layout-api-1/
[CSS-PAINT-API-1]
Ian Kilpatrick; Dean Jackson. CSS Painting API Level 1. 2021년 12월 16일. CR. URL: https://www.w3.org/TR/css-paint-api-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/
[CSS3-ANIMATIONS]
David Baron; et al. CSS Animations Level 1. 2023년 3월 2일. WD. URL: https://www.w3.org/TR/css-animations-1/
[CSS3-TRANSITIONS]
David Baron; et al. CSS Transitions. 2018년 10월 11일. WD. URL: https://www.w3.org/TR/css-transitions-1/

속성 색인

정의된 속성이 없습니다.

@property 디스크립터

이름 초기값
inherits true | false n/a (본문 참조)
initial-value <declaration-value>? guaranteed-invalid value (본문 참조)
syntax <string> n/a (본문 참조)

IDL 색인

dictionary PropertyDefinition {
  required DOMString name;
           DOMString syntax       = "*";
  required boolean   inherits;
           DOMString initialValue;
};

partial namespace CSS {
  undefined registerProperty(PropertyDefinition definition);
};

[Exposed=Window]
interface CSSPropertyRule : CSSRule {
  readonly attribute CSSOMString name;
  readonly attribute CSSOMString syntax;
  readonly attribute boolean inherits;
  readonly attribute CSSOMString? initialValue;
};

MDN

CSS/registerProperty_static

In all current engines.

Firefoxpreview+Safari16.4+Chrome78+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

CSSPropertyRule/inherits

In all current engines.

Firefoxpreview+Safari16.4+Chrome85+
Opera?Edge85+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

CSSPropertyRule/initialValue

In all current engines.

Firefoxpreview+Safari16.4+Chrome85+
Opera?Edge85+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

CSSPropertyRule/name

In all current engines.

Firefoxpreview+Safari16.4+Chrome85+
Opera?Edge85+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

CSSPropertyRule/syntax

In all current engines.

Firefoxpreview+Safari16.4+Chrome85+
Opera?Edge85+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

CSSPropertyRule

In all current engines.

Firefoxpreview+Safari16.4+Chrome85+
Opera?Edge85+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

@property/inherits

In all current engines.

Firefoxpreview+Safari16.4+Chrome85+
Opera?Edge85+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

@property/initial-value

In all current engines.

Firefoxpreview+Safari16.4+Chrome85+
Opera?Edge85+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

@property/syntax

In all current engines.

Firefoxpreview+Safari16.4+Chrome85+
Opera?Edge85+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

@property

In all current engines.

Firefoxpreview+Safari16.4+Chrome85+
Opera?Edge85+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?