CSS 조건부 규칙 모듈 레벨 3

W3C 후보 권고 초안,

이 문서에 대한 추가 정보
현재 버전:
https://www.w3.org/TR/2024/CRD-css-conditional-3-20240815/
최신 공식 버전:
https://www.w3.org/TR/css-conditional-3/
에디터스 드래프트:
https://drafts.csswg.org/css-conditional-3/
이전 버전:
이력:
https://www.w3.org/standards/history/css-conditional-3/
구현 보고서:
https://wpt.fyi/results/css/css-conditional?label=master&label=experimental&aligned
피드백:
CSSWG 이슈 저장소
에디터:
L. David Baron (Mozilla)
Elika J. Etemad / fantasai (Apple)
Chris Lilley (W3C)
이 명세에 대한 편집 제안:
GitHub 에디터
테스트 스위트:
https://wpt.fyi/results/css/css-conditional/

요약

이 모듈은 스타일 시트의 일부를 조건부로 처리할 수 있도록 CSS의 기능을 포함하고 있으며, 프로세서나 스타일 시트가 적용되는 문서의 기능에 따라 달라집니다. 이 모듈은 CSS 레벨 1 [CSS1]을 기반으로 한 CSS 레벨 2 [CSS21]의 기능을 포함하고 확장합니다. 레벨 2와 비교했을 때 주요 확장은 특정 at-규칙을 @media 내부에 중첩할 수 있게 하고, 조건부 처리를 위한 @supports 규칙이 추가된 것입니다.

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

이 문서의 상태

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

이 문서는 CSS 작업 그룹에서 후보 권고 초안으로 권고 트랙을 따라 발행되었습니다. 후보 권고로 발행되었다고 해서 W3C 및 그 회원의 승인을 의미하지는 않습니다. 후보 권고 초안은 이전 후보 권고에서 작업 그룹이 다음 후보 권고 스냅샷에 포함할 의도가 있는 변경사항을 통합합니다.

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

피드백은 GitHub 이슈 등록(권장)에 "css-conditional"이라는 명세 코드를 제목에 포함하여 보내주시기 바랍니다. 예: “[css-conditional] …의견 요약…”. 모든 이슈와 의견은 아카이브됩니다. 또는, 피드백은 (아카이브됨) 공개 메일링 리스트 www-style@w3.org로 보낼 수 있습니다.

이 문서는 2023년 11월 3일자 W3C 프로세스 문서를 따릅니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에 의해 작성되었습니다. W3C는 그룹의 결과물과 관련하여 이루어진 공개된 특허 공개 목록을 유지하며, 해당 페이지에는 특허 공개 방법에 대한 안내도 포함되어 있습니다. 특허에 대해 실제로 알고 있는 개인이 그 특허에 필수 청구항이 있다고 판단하는 경우, W3C 특허 정책 6절에 따라 정보를 공개해야 합니다.

다음 기능들은 위험에 처해 있으며, CR 기간 동안 제외될 수 있습니다:

“위험에 처함”(at-risk)은 W3C 프로세스의 용어로, 반드시 기능이 제거되거나 지연될 위험이 있다는 의미는 아닙니다. 이는 WG가 해당 기능이 적시에 상호 운용적으로 구현되기 어렵다고 판단할 수 있으며, 프로포즈드 권고(Proposed Rec) 단계로 전환할 때 필요하다면 해당 기능을 제거할 수 있도록 하기 위한 표시입니다. 이 경우 기능이 없는 새 후보 권고를 별도로 발행하지 않아도 됩니다.

1. 소개

1.1. 배경

이 절은 규범적이지 않습니다.

[CSS21]은 하나의 조건부 그룹 규칙 유형, 즉 @media 규칙을 정의하며, 그 안에는 스타일 규칙만(다른 @-규칙은 아님) 허용합니다. @media 규칙은 미디어 전용 스타일 시트를 사용할 수 있게 해주며, 이는 @importlink와 같은 스타일 시트 연결 기능을 통해서도 제공됩니다. @media 규칙의 내용에 대한 제한 때문에 활용도가 떨어졌습니다. 이러한 제한으로 인해, 미디어 전용 스타일 시트에서 @-규칙을 사용하려는 저자들은 각 미디어마다 별도의 스타일 시트를 사용해야 했습니다.

이 명세는 조건부 그룹 규칙의 내용에 대한 규칙을 확장하여 다른 @-규칙도 허용함으로써, 저자들이 @-규칙이 포함된 CSS 기능과 미디어 전용 스타일 시트를 하나의 스타일 시트에서 결합할 수 있도록 합니다.

이 명세는 또한 저자와 사용자의 요구를 반영하여 추가적인 조건부 그룹 규칙 유형인 @supports를 정의합니다.

@supports 규칙은 CSS 속성과 값에 대한 구현 지원 여부에 따라 CSS를 조건부로 적용할 수 있게 해줍니다. 이 규칙 덕분에 저자들은 새로운 CSS 기능을 더 쉽게 사용할 수 있고, 해당 기능을 지원하지 않는 구현에 대해 적절한 폴백을 제공할 수 있습니다. 이는 새로운 레이아웃 메커니즘을 제공하는 CSS 기능이나, 관련 스타일 집합이 속성 지원 여부에 따라 조건부로 적용되어야 하는 경우에 특히 중요합니다.

1.2. 모듈 상호작용

이 모듈은 @media 규칙 기능을 [CSS21] 7.2.1절에서 정의된 내용에 따라 대체하고 확장하며, [MEDIAQUERIES-4] 1절에서 비규범적으로 이루어졌던 수정을 통합합니다.

2. 조건부 그룹 규칙의 처리

이 명세는 여러 CSS at-규칙을 정의하며, 이들은 조건부 그룹 규칙이라 불립니다. 이 규칙들은 조건과 여러 CSS 규칙 그룹을 연결합니다. 각기 다른 규칙은 다양한 유형의 조건을 검사할 수 있지만, 조건이 참일 때와 거짓일 때 그 내용이 어떻게 사용되는지에 대한 공통 동작을 공유합니다.

예를 들어, 다음과 같은 규칙이 있습니다:
@media print {
  /* 인쇄 시 내비게이션 컨트롤 숨기기 */
  #navigation { display: none }
}

이 규칙은 특정 CSS 규칙(즉, "navigation" ID를 가진 요소에 display:none을 적용)을 스타일 시트가 인쇄 매체에 사용될 때만 적용하게 합니다.

각 조건부 그룹 규칙에는 조건이 있으며, 이 조건은 언제든지 참 또는 거짓으로 평가됩니다. 조건이 참일 때 CSS 프로세서는 반드시 그룹 규칙 내부의 규칙을 그룹 규칙 위치에 있는 것처럼 적용해야 하며, 조건이 거짓이면 CSS 프로세서는 그룹 규칙 내부의 어떤 규칙도 적용해서는 안 됩니다. 조건의 현재 상태는 CSS 오브젝트 모델(CSSOM)에 영향을 미치지 않으며, 그룹 규칙의 내용은 항상 그룹 규칙 내에 남아 있습니다.

Tests

조건이 참일 때, 규칙이 해당 위치에 적용됩니다.


조건이 거짓일 때, 규칙이 적용되지 않습니다.


CSSOM은 조건과 관계없이 규칙을 포함합니다.


즉, 여러 조건부 그룹 규칙이 중첩된 경우, 두 규칙 모두의 조건이 참일 때에만 내부의 규칙이 적용됩니다.

Tests

모든 조건이 참일 때 중첩된 규칙이 적용됩니다.


예를 들어, 다음과 같이 중첩된 규칙 집합이 있다고 가정해봅시다:
@media print { /* rule (1) */
  /* 인쇄 시 내비게이션 컨트롤 숨기기 */
  #navigation { display: none }
  @media (max-width: 12cm) { /* rule (2) */
    /* 좁은 페이지에 인쇄할 때 노트를 흐름에 남김 */
    .note { float: none }
  }
}

(1)로 표시된 규칙의 조건은 인쇄 매체에 대해 참이고, (2)로 표시된 규칙의 조건은 표시 영역(인쇄 매체의 경우 페이지 박스)의 너비가 12cm 이하일 때 참입니다. 따라서 #navigation { display: none } 규칙은 이 스타일 시트가 인쇄 매체에 적용될 때마다 적용되고, .note { float: none } 규칙은 스타일 시트가 인쇄 매체에 그리고 페이지 박스의 너비가 12cm 이하일 때만 적용됩니다.

조건부 그룹 규칙의 조건이 변경되면, CSS 프로세서는 해당 규칙이 이제 적용되는지 혹은 더 이상 적용되지 않는지를 반드시 반영해야 하며, 단, 계산된 값의 효과가 그 값의 수명 이후에도 남아 있는 속성(예: [CSS3-TRANSITIONS][CSS3-ANIMATIONS]의 일부 속성 등)의 경우는 예외입니다.

Tests

조건 변화와 규칙 적용의 동시 변경(단, 트랜지션/애니메이션 규칙 제외).


3. 조건부 그룹 규칙의 내용

모든 조건부 그룹 규칙은 블록 내에 <rule-list>를 받아들이도록 정의되어 있으며, 스타일 시트의 최상위에서 허용되는 모든 규칙을(별도의 제한이 없는 한) 허용합니다. (예를 들어, @import 규칙은 반드시 스타일 시트의 실제 맨 앞에 있어야 하므로, 다른 규칙 내부에는 올 수 없습니다.)

Tests

모든 제한 없는 최상위 규칙을 중첩하는 것이 유효합니다.


<rule-list> 내부에 잘못되었거나 알 수 없는 규칙은 무효로 간주하고 무시해야 하지만, 조건부 그룹 규칙 자체를 무효로 만들지는 않습니다.

Tests

잘못된 규칙이 있더라도 조건부 그룹 규칙 자체는 무효가 아닙니다.


조건부 그룹 규칙에서 사용되는 네임스페이스 접두사는 반드시 선언되어야 하며, 그렇지 않으면 무효입니다.

예를 들어, 다음 규칙은 CSS 한정 이름을 포함하고 있으며, 네임스페이스 접두사가 네임스페이스 url에 바인딩되어 있으므로 유효합니다:
@namespace x url(http://www.w3.org/1999/xlink);
@supports (content: attr(x|href)) {
  // do something }
예를 들어, 다음 규칙이 유효한지 판단하려면:
@supports (content: attr(n|tooltip)) {
  // do something }

사용자 에이전트는 네임스페이스 맵을 참조하여 "n" 접두사에 해당하는 네임스페이스 url이 존재하는지 확인합니다.

Tests

네임스페이스 접두사의 유효성은 네임스페이스 맵에 따라 달라집니다.


4. 조건부 그룹 규칙의 위치

조건부 그룹 규칙은 스타일 규칙이 허용되는 곳이면 어디서나 (스타일 시트의 최상위, 그리고 다른 조건부 그룹 규칙 내부 모두) 사용할 수 있습니다. CSS 프로세서는 반드시 이러한 규칙을 위에서 설명한 대로 처리해야 합니다.

테스트

조건부 그룹 규칙은 스타일 규칙이 허용되는 모든 곳에서 허용됩니다.


스타일 규칙 뒤에 허용되지 않는 어떤 at-규칙 (예: @charset, @import, @namespace 규칙) 은 조건부 그룹 규칙 뒤에도 허용되지 않으며, 그러한 위치에 있으면 무효가 됩니다.

테스트

스타일 규칙 뒤에 허용되지 않는 at-규칙은 조건부 그룹 규칙 뒤에도 무효입니다.


5. 미디어 전용 스타일 시트: @media 규칙

@media 규칙은 조건부 그룹 규칙이며, 조건은 미디어 쿼리입니다. 구문은 다음과 같습니다:

@media <media-query-list> {
  <rule-list>
}

이는 @media라는 at-키워드 뒤에 (비어 있을 수도 있는) 미디어 쿼리 목록 ([MEDIAQUERIES-4]에서 정의됨)이 오고, 임의의 규칙이 포함된 블록이 뒤따릅니다. 이 규칙의 조건은 미디어 쿼리의 결과입니다.

@media 규칙:
@media screen and (min-width: 35em),
       print and (min-width: 40em) {
  #section_navigation { float: left; width: 10em; }
}

조건 screen and (min-width: 35em), print and (min-width: 40em)을 갖으며, 이는 화면 디스플레이의 뷰포트가 초기 글꼴 크기의 35배 이상이거나 인쇄 디스플레이의 뷰포트가 초기 글꼴 크기의 40배 이상일 때 참이 됩니다. 이 중 하나라도 참이면, 규칙의 조건이 참이 되고, #section_navigation { float: left; width: 10em; } 규칙이 적용됩니다.

테스트

미디어 규칙 조건은 비어 있을 수 있습니다.


미디어 규칙의 조건은 미디어 쿼리입니다.


토큰화를 위해 필수적이지 않은 경우 공백은 선택 사항입니다.


6. 기능 쿼리: @supports 규칙

@supports 규칙은 조건부 그룹 규칙으로, 조건은 사용자 에이전트가 CSS property:value 쌍을 지원하는지 여부를 검사합니다. 저자는 이를 사용하여 새로운 기능이 사용 가능할 때는 그 기능을 사용하고 지원되지 않을 때는 자연스럽게 폴백되도록 스타일 시트를 작성할 수 있습니다. 이러한 쿼리를 CSS 기능 쿼리 또는 (비공식적으로) supports 쿼리라고 부릅니다.

참고: CSS에는 지원되지 않는 속성이나 값을 무시하는 것과 같이 자연스럽게 폴백되는 기존 메커니즘이 있으나, 많은 스타일 집합이 특정 기능 지원 여부와 연계되어야 할 때(예를 들어 새로운 레이아웃 시스템 기능 사용 시)에는 이러한 메커니즘만으로는 충분하지 않을 수 있습니다.

@supports 규칙의 조건 구문은 <media-condition> ([MEDIAQUERIES-4]에서 정의됨)과 유사하지만, "unknown" 값 논리는 없습니다:

따라서 @supports 규칙의 구문은 property:value 쌍, 임의의 논리곱(and), 논리합(or), 부정(not)을 검사할 수 있게 허용합니다.

@supports 규칙의 구문은 다음과 같습니다:

@supports <supports-condition> {
  <rule-list>
}

<supports-condition>의 정의는 다음과 같습니다:

<supports-condition> = not <supports-in-parens>
                     | <supports-in-parens> [ and <supports-in-parens> ]*
                     | <supports-in-parens> [ or <supports-in-parens> ]*
<supports-in-parens> = ( <supports-condition> ) | <supports-feature> | <general-enclosed>
<supports-feature> = <supports-decl>
<supports-decl> = ( <declaration> )

위 문법은 전방 호환성을 위해 의도적으로 매우 느슨하게 되어 있으며, <general-enclosed> 생산식이 향후 확장성을 크게 허용하기 때문입니다. 위의 문법에 따라 구문 분석되지 않는(<general-enclosed> 생산식 포함) 어떤 @supports 규칙도 무효입니다. 스타일 시트는 반드시 이러한 규칙을 사용하지 않아야 하며, 프로세서는 반드시 해당 규칙(내용 전체 포함)을 무시해야 합니다.

테스트

토큰화를 위해 필수적이지 않은 경우 공백은 선택 사항입니다.


문법적으로 무효한 @supports 규칙은 무시됩니다.


이러한 각 문법 용어는 다음과 같이 불리언 결과와 연결되어 있습니다:

<supports-condition>
<supports-in-parens>

결과는 자식 하위식의 결과와 같습니다.

not <supports-in-parens>

결과는 <supports-in-parens> 용어의 부정입니다.

테스트

Not은 supports 조건을 부정합니다.


Not 뒤에는 반드시 공백이 와야 합니다.


Not은 괄호가 필요합니다.


<supports-in-parens> [ and <supports-in-parens> ]*

모든 <supports-in-parens> 자식 용어가 참이면 결과는 참이고, 아니면 거짓입니다.

테스트

And 조건은 연결된 모든 조건이 참일 때만 참입니다.


And는 괄호가 필요합니다.


<supports-in-parens> [ or <supports-in-parens> ]*

모든 <supports-in-parens> 자식 용어가 거짓이면 결과는 거짓이고, 그렇지 않으면 참입니다.

테스트

Or 조건은 연결된 조건 중 하나라도 참이면 참입니다.


Or 뒤에는 반드시 공백이 와야 합니다.


Or는 괄호가 필요합니다.


<supports-decl>

UA가 괄호 안의 선언을 지원하면 결과는 참입니다.

테스트

Supports 조건은 선언이 지원될 때만 참입니다.


선언에는 세미콜론을 포함할 수 없습니다.


선언 값은 비어 있을 수 있습니다.


선언에는 잘못된 !토큰을 포함할 수 없습니다.


<general-enclosed>

결과는 거짓입니다.

저자는 스타일시트에 <general-enclosed>를 사용해서는 안 됩니다. 이 용어는 오직 미래 호환성을 위해 존재하며, 새로운 구문 추가가 옛 사용자 에이전트의 <supports-condition>의 너무 많은 부분을 무효화하지 않도록 하기 위함입니다.

테스트

인식되지 않지만 문법적으로 유효한 조건은 거짓이며, 무효가 아닙니다.


대괄호/괄호는 반드시 균형을 이루어야 합니다.


@supports 규칙의 조건은 그 프리루드 내 <supports-condition>의 결과입니다.

예를 들어, 다음 규칙은
@supports ( display: flex ) {
  body, #navigation, #content { display: flex; }
  #navigation { background: blue; color: white; }
  #article { background: white; color: black; }
}

@supports 규칙 내부의 규칙들은 display: flex가 지원될 때만 적용됩니다.

다음 예시는 @supports 규칙을 추가로 사용하여 display: flex가 지원되지 않을 때 대체 스타일을 제공하는 방법을 보여줍니다:
@supports not ( display: flex ) {
  body { width: 100%; height: 100%; background: white; color: black; }
  #navigation { width: 25%; }
  #article { width: 75%; }
}

width 선언은 flex 기반 레이아웃에 해로울 수 있으므로, 반드시 non-flex 스타일에만 존재해야 함에 유의하세요.

다음 예시는 box-shadow 속성 지원 여부(공급업체 접두어 포함)를 검사합니다. 지원되는 경우, 접두어 버전과 box-shadow, border를 지정하며, box-shadow가 지원되지 않으면 박스가 보이지 않을 수 있습니다.
.noticebox {
  border: 1px solid black;
  padding: 1px;
}
@supports ( box-shadow: 0 0 2px black inset ) or
          ( -moz-box-shadow: 0 0 2px black inset ) or
          ( -webkit-box-shadow: 0 0 2px black inset ) or
          ( -o-box-shadow: 0 0 2px black inset ) {
  .noticebox {
    -moz-box-shadow: 0 0 2px black inset;
    -webkit-box-shadow: 0 0 2px black inset;
    -o-box-shadow: 0 0 2px black inset;
    box-shadow: 0 0 2px black inset; /* unprefixed last */
    /* 위 @supports 규칙을 오버라이드 */
    border: none;
    padding: 2px;
  }
}

andor 사이 혼동을 방지하기 위해, 구문에서는 andor 모두를 명시적으로 작성해야 합니다(예를 들어, 쉼표나 공백으로 대체하지 않음). 마찬가지로, 우선순위 규칙으로 인한 혼동을 방지하기 위해 and, or, not 연산자를 괄호 없이 혼합하는 것은 허용되지 않습니다.

예를 들어, 다음 규칙은 유효하지 않습니다:
@supports (transition-property: color) or
          (animation-name: foo) and
          (transform: rotate(10deg)) {
  /* ... */
}

대신 저자는 아래와 같이 작성해야 합니다:

@supports ((transition-property: color) or
           (animation-name: foo)) and
          (transform: rotate(10deg)) {
  /* ... */
}
@supports (transition-property: color) or
          ((animation-name: foo) and
           (transform: rotate(10deg))) {
  /* ... */
}
테스트

연산자 혼합에는 괄호가 필요합니다.


테스트되는 선언이 식 내에 유일한 경우에는 항상 괄호 안에 있어야 합니다.

예를 들어, 다음 규칙은 유효하지 않습니다:
@supports display: flex {
  /* ... */
}

대신 저자는 다음과 같이 작성해야 합니다:

@supports (display: flex) {
  /* ... */
}
테스트

선언 테스트에는 괄호가 필요합니다.


구문은 필요하지 않은 경우에도 괄호를 추가로 허용합니다. 이 유연성은 저자(예: 식의 일부를 주석 처리할 때)와 저작 도구 모두에 유용할 수 있습니다.

예를 들어, 저자는 다음과 같이 작성할 수 있습니다:
@supports ((display: flex)) {
  /* ... */
}
테스트

추가 괄호가 허용됩니다.


테스트되는 선언에 !important가 뒤따르는 것은 허용되지만, 선언의 유효성에는 영향을 주지 않습니다.

예를 들어, 다음 규칙은 유효합니다:
@supports (display: flex !important) {
  /* ... */
}
테스트

!important는 허용됩니다.


6.1. 지원의 정의

미래 호환성을 위해, [CSS21] 섹션 4.1.8 (선언 및 속성)은 잘못된 속성과 값 처리 규칙을 정의합니다. CSS 프로세서가 명세를 구현하지 않거나 부분적으로만 구현하는 경우, 구현하지 않았거나 사용 가능한 수준의 지원이 없는 값의 일부에 대해 이 규칙에 따라 잘못된 속성과 값으로 간주하여 반드시 선언 전체를 파싱 오류로 버려야 합니다.

CSS 프로세서가 지원한다고 간주되는 선언(속성과 값으로 구성)은 해당 선언을 스타일 규칙 내에서 파싱 오류로 버리지 않고 받아들이는 경우입니다. 프로세서가 주어진 속성과 값 모두를 사용 가능한 수준으로 구현하지 않았다면, 절대 해당 선언을 받아들이거나 지원한다고 주장해서는 안 됩니다.

참고: 사용자의 환경설정으로 지원이 사실상 비활성화된 속성이나 값도 이 정의에서는 여전히 지원되는 것으로 간주합니다. 예를 들어, 사용자가 색상을 재정의하는 고대비 모드를 활성화했더라도, CSS 프로세서는 color 속성을 지원하는 것으로 간주하며 color 속성 선언이 실제로는 효과가 없을 수 있습니다. 반면, 실험적 CSS 기능의 지원을 활성화/비활성화하는 개발자 설정은 이 지원 정의에 영향을 미칩니다.

이러한 규칙(및 그 등가성)은 저자가 폴백을 사용할 수 있도록 해주며(나중에 선언으로 재정의되거나, 본 명세의 @supports 규칙이 제공하는 새로운 기능 등), 구현된 기능에 대해 올바르게 동작합니다. 이는 특히 복합 값에 적용되며, 구현은 값의 모든 부분을 구현해야 선언을 지원한다고 간주할 수 있습니다(스타일 규칙 내 또는 @supports 규칙의 선언 조건에서).

테스트

지원 쿼리는 속성 선언(모든 값 포함)이 파싱/지원될 때만 참입니다.


7. API

테스트

7.1. CSSRule 인터페이스 확장

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

partial interface CSSRule {
    const unsigned short SUPPORTS_RULE = 12;
};
테스트

CSSRule.SUPPORTS_RULE = 12


7.2. CSSConditionRule 인터페이스

CSSConditionRule 인터페이스는 조건과 구문 블록으로 구성된 모든 “조건부” at-규칙을 나타냅니다.

[Exposed=Window]
interface CSSConditionRule : CSSGroupingRule {
    readonly attribute CSSOMString conditionText;
};
테스트

CSSConditionRule은 CSSGroupingRule을 상속합니다.


CSSConditionRule에는 .conditionText 속성이 있습니다.


conditionText (타입: CSSOMString)
conditionText 속성은 규칙의 조건을 나타냅니다. 이 조건이 무엇을 하는지는 CSSConditionRule의 파생 인터페이스마다 다르므로, 파생 인터페이스는 이 속성에 대해 다른 동작을 명시할 수 있습니다 (예: 아래의 CSSMediaRule 참조). 별도의 규칙별 동작이 없는 경우, 아래 규칙이 적용됩니다:

conditionText 속성은 get 시, 연관된 조건을 직렬화한 결과를 반환해야 합니다.

테스트

.conditionText는 조건의 직렬화를 반환합니다.


    7.3. CSSMediaRule 인터페이스

    CSSMediaRule 인터페이스는 @media at-규칙을 나타냅니다:

    [Exposed=Window]
    interface CSSMediaRule : CSSConditionRule {
        [SameObject, PutForwards=mediaText] readonly attribute MediaList media;
        readonly attribute boolean matches;
    };
    
    media (타입: MediaList, 읽기전용)
    media 속성은 @media at-규칙으로 지정된 미디어 쿼리 목록에 대한 MediaList 객체를 반환해야 합니다.
    테스트

    .media는 @media 조건과 일치하는 MediaList를 반환합니다.


      matches (타입: boolean, 읽기전용)
      matches 속성은 규칙이 문서에 연결된 스타일 시트 내에 있고 그 Window가 이 규칙의 media 미디어 쿼리와 일치하면 true를 반환하고, 아니면 false를 반환합니다.
      테스트

      .matches는 미디어 쿼리와 일치하면 boolean을 반환합니다.


        conditionText (타입: CSSOMString) (CSSConditionRule의 속성에 대한 CSSMediaRule 전용 정의)
        conditionText 속성(CSSConditionRule 상위 규칙에서 정의됨)은 get 시, 해당 규칙의 media.mediaText 값을 반환해야 합니다.
        테스트

        CSSMediaRule.conditionText의 값은 media.mediaText의 값과 일치합니다.


          7.4. CSSSupportsRule 인터페이스

          CSSSupportsRule 인터페이스는 @supports 규칙을 나타냅니다.

          [Exposed=Window]
          interface CSSSupportsRule : CSSConditionRule {
            readonly attribute boolean matches;
          };
          
          matches (타입: boolean, 읽기전용)
          matches 속성은 conditionText에 표현된 CSS 기능 쿼리의 평가 결과를 반환합니다.
          테스트

          CSSSupportsRule.matches는 기능 쿼리와 일치하면 true를 반환합니다.


            conditionText (타입: CSSOMString) (CSSConditionRule의 속성에 대한 CSSSupportsRule 전용 정의)
            conditionText 속성(CSSConditionRule 상위 규칙에서 정의됨)은 get 시, 논리적 단순화 없이 지정된 조건을 반환해야 하며, 반환된 조건은 본 명세를 준수하는 어떤 구현(미래의 <general-enclosed> 확장까지 포함)에서도 지정된 조건과 동일한 결과로 평가되어야 합니다. 즉, 토큰 스트림 단순화(공백을 하나의 공백으로 줄이거나, 선택적임이 알려진 경우 공백 생략 등)는 허용되나, 논리적 단순화(불필요한 괄호 제거, 결과 평가에 기반한 단순화 등)는 허용되지 않습니다.
            테스트

            CSSSupportsRule.conditionText는 토큰화 단순화가 될 수 있습니다.


              CSSSupportsRule.conditionText는 다른 단순화가 허용되지 않습니다.


                7.5. CSS 네임스페이스 및 supports() 함수

                CSS 네임스페이스는 다른 곳에 속하지 않는 유용한 CSS 관련 함수를 포함합니다.

                partial namespace CSS {
                  boolean supports(CSSOMString property, CSSOMString value);
                  boolean supports(CSSOMString conditionText);
                };
                
                supports(CSSOMString property, CSSOMString value), 반환값 boolean
                supports(property, value) 메서드는 propertyvalue 두 인수로 호출될 때:
                1. property가 UA가 지원하는 모든 CSS 속성과 ASCII 대소문자 구분 없이 일치하거나, 사용자 정의 속성 이름 문자열이며, value가 해당 속성의 문법에 맞게 파싱된다면, true를 반환합니다.

                2. 그렇지 않으면 false를 반환합니다.

                참고: 속성 이름에는 CSS 이스케이프나 공백 처리가 적용되지 않으므로, CSS.supports(" width", "5px")false를 반환합니다(선행 공백이 있으면 속성 이름이 아니기 때문).

                참고: !important 플래그는 속성 문법의 일부가 아니며, value가 무효로 파싱되게 하므로, element.style.setProperty()의 value 인수와 마찬가지로 동작합니다.

                테스트

                CSS.supports(arg1, arg2)는 arg1 속성에 대해 arg2 값 지원 여부를 평가합니다.


                  supports(CSSOMString conditionText), 반환값 boolean
                  supports(conditionText) 메서드는 conditionText 인수로 호출될 때:
                  1. conditionText파싱<supports-condition>으로 평가되어 true가 반환된다면, true를 반환합니다.

                  2. 그렇지 않고 conditionText를 괄호로 감싸서 파싱<supports-condition>으로 평가했을 때 true가 반환된다면, true를 반환합니다.

                  3. 그 외에는 false를 반환합니다.

                  conditionText 인수의 모든 네임스페이스는 document.querySelector("a|b")처럼 무효로 간주됩니다.

                  테스트

                  CSS.supports(arg1)는 지원 조건 arg1을 평가합니다.


                    CSS.supports(arg1)는 괄호를 암시합니다.


                    테스트

                    보안 고려사항

                    이 명세는 새로운 보안 고려사항을 도입하지 않습니다.

                    개인정보 보호 고려사항

                    이 명세의 다양한 기능은 주로 @media 규칙과 연관되어 있지만, 일부는 @supports 규칙과도 관련이 있으며, 사용자의 하드웨어, 소프트웨어 및 그 설정과 상태에 대한 정보를 웹 콘텐츠에 제공합니다. 대부분의 정보는 이 명세의 기능이 아닌 [MEDIAQUERIES-4]의 기능을 통해 제공됩니다. 그러나 @supports 규칙은 사용자의 소프트웨어 및 비표준 설정(특정 기능의 활성화/비활성화)에 대한 추가적인 세부 정보를 제공할 수 있습니다.

                    이 정보의 대부분은 다른 API를 통해서도 결정할 수 있습니다. 하지만, 이 명세의 기능도 웹에서 이러한 정보를 노출하는 방법 중 하나입니다.

                    이 정보는 집합적으로 사용될 경우 사용자의 지문(fingerprinting) 정확도를 높이는 데 사용될 수 있습니다.

                    8. 변경사항

                    다음(편집 이외의) 변경사항이 2022년 1월 13일자 후보 권고 스냅샷 이후 이 명세에 반영되었습니다:

                    다음(편집 이외의) 변경사항이 2020년 12월 8일자 후보 권고 스냅샷 이후 이 명세에 반영되었습니다:

                    다음(편집 이외의) 변경사항이 2013년 4월 4일자 후보 권고 이후 이 명세에 반영되었습니다:

                    감사의 글

                    아래 분들의 아이디어와 피드백에 감사드립니다. Tab Atkins, Arthur Barstow, Ben Callahan, Tantek Çelik, Alex Danilo, Elika Etemad, Pascal Germroth, Björn Höhrmann, Paul Irish, Brad Kemper, Anne van Kesteren, Vitor Menezes, Alex Mogilevsky, Chris Moschini, James Nurthen, Simon Pieters, Florian Rivoal, Simon Sapin, Nicholas Shanks, Ben Ward, Zack Weinberg, Estelle Weyl, Boris Zbarsky, 그리고 www-style 커뮤니티의 모든 분들.

                    준수

                    문서 규약

                    준수 요구사항은 설명적 단언과 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"로 규범 텍스트와 구분됩니다. 예:

                    참고, 이것은 설명용 주석입니다.

                    권고(advisement)는 규범적 강조로 별도의 스타일을 가지며, <strong class="advisement">로 구분됩니다. 예: UA는 반드시 접근 가능한 대안을 제공해야 합니다.

                    테스트

                    이 명세의 내용과 관련된 테스트는 이와 같은 “Tests” 블록에 문서화될 수 있습니다. 이런 블록은 모두 비규범적입니다.


                    준수 등급

                    이 명세의 준수는 세 가지 준수 등급으로 정의됩니다:

                    style sheet
                    CSS 스타일 시트.
                    renderer
                    스타일 시트의 의미를 해석하고 이를 사용하는 문서를 렌더링하는 UA.
                    authoring tool
                    스타일 시트를 작성하는 UA.

                    스타일 시트가 본 명세를 준수하려면 이 모듈에서 정의된 문법을 사용하는 모든 구문이 일반 CSS 문법과 각 기능별 개별 문법에 따라 유효해야 합니다.

                    렌더러가 본 명세를 준수하려면 스타일 시트를 해당 명세에 따라 해석할 뿐만 아니라, 본 명세에서 정의한 모든 기능을 올바르게 파싱하고 문서를 그에 맞게 렌더링해야 합니다. 단, 기기 한계로 인해 UA가 문서를 올바르게 렌더링하지 못하더라도 비준수로 간주하지 않습니다. (예: UA가 흑백 모니터에서 색상을 렌더링할 필요는 없습니다.)

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

                    부분 구현

                    저자가 전방 호환 파싱 규칙을 활용해 폴백 값을 지정할 수 있도록, CSS 렌더러는 반드시 지원 가능한 수준이 아닌 at-규칙, 속성, 속성 값, 키워드 및 기타 문법 요소를 무효(그리고 적절하게 무시)로 처리해야 합니다. 특히, 사용자 에이전트는 단일 다중 값 속성 선언에서 지원되지 않는 일부 값만 무시하고 지원되는 값만 적용해서는 안 됩니다: 어떤 값이 무효(지원되지 않는 값은 반드시 무효)로 간주되면 CSS는 전체 선언을 무시해야 합니다.

                    불안정 및 독점 기능의 구현

                    미래의 안정된 CSS 기능과의 충돌을 피하기 위해, CSSWG는 미래 호환성 모범 사례를 따르며 불안정 기능 및 독점 확장 기능 구현을 권장합니다.

                    비실험적 구현

                    명세가 후보 권고 단계에 도달하면 비실험적 구현이 가능하며, 구현자는 명세에 따라 올바르게 구현됨을 입증할 수 있는 CR 수준 기능을 접두어 없이 릴리스해야 합니다.

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

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

                    CR 종료 기준

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

                    independent
                    각 구현은 서로 다른 주체에 의해 개발되어야 하며, 다른 구현의 코드를 공유, 재사용, 파생해서는 안 됩니다. 본 명세 구현과 무관한 코드 섹션은 예외입니다.
                    interoperable
                    공식 CSS 테스트 스위트의 해당 테스트 케이스를 통과하거나, 웹 브라우저가 아닌 경우 동등한 테스트를 통과해야 합니다. 관련 테스트가 있다면 동등한 테스트도 모두 만들어서 해당 UA가 상호운용성을 주장하려면 반드시 통과해야 합니다. 동등 테스트는 동료 검토(peer review)를 위해 공개되어야 합니다.
                    implementation
                    다음을 만족하는 사용자 에이전트:
                    1. 명세를 구현함
                    2. 일반에 공개됨(출시 제품, 베타, 프리뷰, 나이틀리 빌드 등). 비출시 제품의 경우 해당 기능이 최소 1개월 이상 구현되어 안정성이 입증되어야 함.
                    3. 실험적(테스트만을 위해 만들어진 비정상적 버전)이 아님

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

                    색인

                    이 명세에서 정의된 용어

                    참조로 정의된 용어

                    참고 문헌

                    규범적 참고문헌

                    [CSS-CASCADE-5]
                    Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 5. 13 January 2022. CR. URL: https://www.w3.org/TR/css-cascade-5/
                    [CSS-NAMESPACES-3]
                    Elika Etemad. CSS Namespaces Module Level 3. 20 March 2014. REC. URL: https://www.w3.org/TR/css-namespaces-3/
                    [CSS-SYNTAX-3]
                    Tab Atkins Jr.; Simon Sapin. CSS Syntax Module Level 3. 24 December 2021. CR. URL: https://www.w3.org/TR/css-syntax-3/
                    [CSS-TYPED-OM-1]
                    Tab Atkins Jr.; François Remy. CSS Typed OM Level 1. 21 March 2024. 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. 12 March 2024. WD. URL: https://www.w3.org/TR/css-values-4/
                    [CSS21]
                    Bert Bos; et al. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 7 June 2011. REC. URL: https://www.w3.org/TR/CSS21/
                    [CSS3-ANIMATIONS]
                    David Baron; et al. CSS Animations Level 1. 2 March 2023. WD. URL: https://www.w3.org/TR/css-animations-1/
                    [CSSOM-1]
                    Daniel Glazman; Emilio Cobos Álvarez. CSS Object Model (CSSOM). 26 August 2021. WD. URL: https://www.w3.org/TR/cssom-1/
                    [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/
                    [MEDIAQUERIES-4]
                    Florian Rivoal; Tab Atkins Jr.. Media Queries Level 4. 25 December 2021. CR. URL: https://www.w3.org/TR/mediaqueries-4/
                    [MEDIAQUERIES-5]
                    Dean Jackson; et al. Media Queries Level 5. 18 December 2021. WD. URL: https://www.w3.org/TR/mediaqueries-5/
                    [RFC2119]
                    S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. March 1997. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
                    [WEBIDL]
                    Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

                    참고용 참고문헌

                    [CSS-BACKGROUNDS-3]
                    Elika Etemad; Brad Kemper. CSS Backgrounds and Borders Module Level 3. 11 March 2024. CR. URL: https://www.w3.org/TR/css-backgrounds-3/
                    [CSS-COLOR-4]
                    Chris Lilley; Tab Atkins Jr.; Lea Verou. CSS Color Module Level 4. 13 February 2024. CR. URL: https://www.w3.org/TR/css-color-4/
                    [CSS-DISPLAY-3]
                    Elika Etemad; Tab Atkins Jr.. CSS Display Module Level 3. 30 March 2023. CR. URL: https://www.w3.org/TR/css-display-3/
                    [CSS-SIZING-3]
                    Tab Atkins Jr.; Elika Etemad. CSS Box Sizing Module Level 3. 17 December 2021. WD. URL: https://www.w3.org/TR/css-sizing-3/
                    [CSS1]
                    Håkon Wium Lie; Bert Bos. Cascading Style Sheets, level 1. 13 September 2018. REC. URL: https://www.w3.org/TR/CSS1/
                    [CSS3-TRANSITIONS]
                    David Baron; et al. CSS Transitions. 11 October 2018. WD. URL: https://www.w3.org/TR/css-transitions-1/

                    IDL 색인

                    partial interface CSSRule {
                        const unsigned short SUPPORTS_RULE = 12;
                    };
                    
                    [Exposed=Window]
                    interface CSSConditionRule : CSSGroupingRule {
                        readonly attribute CSSOMString conditionText;
                    };
                    
                    [Exposed=Window]
                    interface CSSMediaRule : CSSConditionRule {
                        [SameObject, PutForwards=mediaText] readonly attribute MediaList media;
                        readonly attribute boolean matches;
                    };
                    
                    [Exposed=Window]
                    interface CSSSupportsRule : CSSConditionRule {
                      readonly attribute boolean matches;
                    };
                    
                    partial namespace CSS {
                      boolean supports(CSSOMString property, CSSOMString value);
                      boolean supports(CSSOMString conditionText);
                    };