미디어 쿼리 레벨 4

W3C 후보 권고안 초안,

이 문서에 대한 추가 세부 정보
이 버전:
https://www.w3.org/TR/2026/CRD-mediaqueries-4-20260219/
최신 발행 버전:
https://www.w3.org/TR/mediaqueries-4/
편집자 초안:
https://drafts.csswg.org/mediaqueries-4/
이전 버전:
이력:
https://www.w3.org/standards/history/mediaqueries-4/
구현 보고서:
https://wpt.fyi/results/css/mediaqueries
피드백:
CSSWG 이슈 저장소
편집자:
Florian Rivoal (초청 전문가)
Tab Atkins Jr. (Google)
이전 편집자:
(Opera)
(Mozilla)
(파괴적 혁신)
(Mozilla)
이 사양에 대한 편집 제안:
GitHub 편집기
테스트 스위트:
https://wpt.fyi/results/css/mediaqueries/

초록

미디어 쿼리는 작성자가 렌더링되는 문서와 무관하게 사용자 에이전트 또는 표시 장치의 값이나 기능을 테스트하고 질의할 수 있도록 한다. 이는 CSS @media 규칙에서 문서에 스타일을 조건부로 적용하는 데 사용되며, HTML과 JavaScript 같은 다양한 다른 문맥과 언어에서도 사용된다.

미디어 쿼리 레벨 4는 미디어 쿼리, 미디어 유형, 미디어 기능의 메커니즘과 구문을 설명한다. 이는 미디어 쿼리 레벨 3에서 정의된 기능을 확장하고 대체한다.

CSS는 구조화된 문서(예: HTML 및 XML)의 렌더링을 설명하는 언어로, 화면, 종이 등에서 사용된다.

이 문서의 상태

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

이 문서는 CSS 작업 그룹에 의해 권고 트랙을 사용하여 후보 권고안 초안으로 발행되었다. 후보 권고안으로의 발행은 W3C 및 그 회원의 승인을 의미하지 않는다. 후보 권고안 초안은 작업 그룹이 이후의 후보 권고안 스냅샷에 포함하려는, 이전 후보 권고안에서의 변경 사항을 통합한다.

이 문서는 초안 문서이며 언제든지 업데이트되거나, 대체되거나 다른 문서에 의해 폐기될 수 있다. 진행 중인 작업이 아닌 다른 것으로 이 문서를 인용하는 것은 부적절하다.

피드백은 GitHub에 이슈를 등록하여(권장) 제목에 사양 코드 “mediaqueries”를 포함해 다음과 같이 보내기 바란다: “[mediaqueries] …의견 요약…”. 모든 이슈와 댓글은 보관된다. 또는 피드백은 (보관된) 공개 메일링 리스트 www-style@w3.org로 보낼 수 있다.

이 문서는 2025년 8월 18일 W3C 프로세스 문서의 적용을 받는다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에 의해 작성되었다. W3C는 그룹의 산출물과 관련하여 제출된 모든 특허 공개에 대한 공개 목록을 유지한다; 해당 페이지에는 특허를 공개하기 위한 지침도 포함되어 있다. 어떤 개인이 자신이 알고 있는 특허가 필수 청구항(Essential Claim(s))을 포함한다고 믿을 만한 실제 지식을 가지고 있다면, W3C 특허 정책 6절에 따라 그 정보를 공개해야 한다.

현재 예비 상호운용성 또는 구현 보고서는 없다.

1. 소개

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

1997년에 HTML4 [HTML401]는 미디어에 따라 달라지는 스타일 시트를 지원하는 메커니즘을 정의했으며, 서로 다른 미디어 유형에 맞게 조정되었다. 예를 들어, 문서는 화면용과 인쇄용에 서로 다른 스타일 시트를 사용할 수 있다. HTML에서는 다음과 같이 작성할 수 있다:

<link rel="stylesheet" type="text/css" media="screen" href="style.css">
<link rel="stylesheet" type="text/css" media="print" href="print.css">

CSS는 @media@import 규칙으로 이 기능을 채택하고 확장하여, 개별 기능의 값을 질의할 수 있는 능력을 추가했다:

CSS 스타일 시트 내부에서, 특정 미디어 유형에 섹션이 적용된다고 선언할 수 있다:
@media screen {
  * { font-family: sans-serif }
}

마찬가지로, 스타일시트는 미디어 쿼리에 따라 조건부로 가져올 수 있다:

@import "print-styles.css" print;

미디어 쿼리는 HTML, XHTML, XML [xml-stylesheet] 및 CSS의 @import 및 @media 규칙과 함께 사용할 수 있다.

다음은 동일한 예제를 HTML, XHTML, XML, @import 및 @media로 작성한 것이다:
<link media="screen and (color), projection and (color)"
      rel="stylesheet" href="example.css">

<link media="screen and (color), projection and (color)"
      rel="stylesheet" href="example.css" />

<?xml-stylesheet media="screen and (color), projection and (color)"
                 rel="stylesheet" href="example.css" ?>

@import url(example.css) screen and (color), projection and (color);

@media screen and (color), projection and (color) { … }

1.1. 모듈 상호작용

이 모듈은 [CSS2]의 7절 및 [MEDIAQUERIES-3]에 정의된 미디어 쿼리, 미디어 유형 및 미디어 기능을 대체하고 확장한다.

1.2.

이 명세에서 정의되지 않은 값 유형(예: <integer>, <number> 또는 <resolution>)은 [CSS-VALUES-3]에서 정의된다. 다른 CSS 모듈은 이러한 값 유형의 정의를 확장할 수 있다.

1.3. 단위

미디어 쿼리에서 사용되는 단위는 CSS의 다른 부분과 동일하며, [CSS-VALUES-3]에 정의되어 있다. 예를 들어, 픽셀 단위는 물리적 픽셀이 아니라 CSS 픽셀을 나타낸다.

상대 길이 단위는 미디어 쿼리에서 초기값을 기준으로 하며, 이는 단위가 선언 결과를 기준으로 하는 일이 결코 없음을 의미한다. 예를 들어, HTML에서 em 단위는 사용자 에이전트 또는 사용자의 선호에 의해 정의되는 초기값font-size에 상대적이며, 페이지의 어떤 스타일링에도 의존하지 않는다.

테스트

2. 미디어 쿼리

A media query는 문서가 표시되는 사용자 에이전트 또는 장치의 특정 측면을 테스트하는 방법이다. 미디어 쿼리는 (거의) 항상 문서의 내용과는 독립적이며, 문서의 스타일링, 또는 그 밖의 어떤 내부적 측면에도 의존하지 않는다; 다른 기능이 미디어 쿼리의 해석에 영향을 준다고 명시적으로 지정하지 않는 한, “외부” 정보에만 의존한다.

미디어 쿼리의 구문은 선택적 미디어 쿼리 수정자, 선택적 미디어 유형, 그리고 0개 이상의 미디어 기능으로 구성된다:

media condition only not media type and media condition

미디어 쿼리는 참 또는 거짓인 논리식이다. 미디어 쿼리는 다음의 경우 참이다:

이 절의 미디어 쿼리에 관한 진술은 구문 절을 따른다고 가정한다. 구문에 부합하지 않는 미디어 쿼리는 § 3.2 오류 처리에서 논의한다. 즉, 이 절의 요구사항보다 구문이 우선한다.

다음은 HTML로 작성된 간단한 예이다:
<link rel="stylesheet" media="screen and (color)" href="example.css" />

이 예는 특정 스타일 시트 (example.css)가 특정 미디어 유형의 장치 (screen)에, 특정 기능(컬러 화면이어야 함)을 갖는 경우에 적용됨을 표현한다.

다음은 동일한 미디어 쿼리를 CSS의 @import 규칙으로 작성한 것이다:

@import url(example.css) screen and (color);

사용자 에이전트는 자신이 인지하는 사용자 환경의 변화에 대응하여 미디어 쿼리를 재평가해야 하며, 예를 들어 장치가 가로 방향에서 세로 방향으로 전환되는 경우, 그 미디어 쿼리에 의존하는 모든 구성 요소의 동작을 그에 맞게 변경해야 한다.

다른 기능이 미디어 쿼리의 해석에 영향을 준다고 명시적으로 지정하지 않는 한, 표현식을 평가하기 위해 스타일 시트를 적용할 필요는 결코 없다.

테스트

2.1. 미디어 쿼리 결합

여러 미디어 쿼리는 쉼표로 구분된 미디어 쿼리 목록으로 결합할 수 있다.

media query ,

미디어 쿼리 목록은 구성 요소 미디어 쿼리어느 하나라도 참이면 참이고, 구성 요소 미디어 쿼리모두 거짓인 경우에만 거짓이다.

예를 들어, 다음 미디어 쿼리 목록미디어 유형screen이고 컬러 장치이거나, 또는 미디어 유형projection이고 컬러 장치이면 참이다:
@media screen and (color), projection and (color) { … }

미디어 쿼리 목록은 참으로 평가된다.

예를 들어, 다음은 동등하다:
@media all { … }
@media { … }

2.2. 미디어 쿼리 수정자

미디어 쿼리는 선택적으로 단 하나의 미디어 쿼리 수정자로 접두될 수 있으며, 이는 뒤따르는 미디어 쿼리의 의미를 바꾸는 단일 키워드이다.

2.2.1. 미디어 쿼리 부정: not 키워드

개별 미디어 쿼리는 키워드 not을 접두함으로써 결과를 부정할 수 있다. 미디어 쿼리가 정상적으로는 참으로 평가될 경우, not을 접두하면 거짓으로 평가되며, 그 반대도 마찬가지이다.

예를 들어, 다음은 컬러를 표시할 수 있는 화면을 제외한 모든 것에 적용된다. 전체 미디어 쿼리가 부정되며, 미디어 유형만 부정되는 것이 아님에 유의하라.
<link rel="stylesheet" media="not screen and (color)" href="example.css" />

2.2.2. 레거시 사용자 에이전트로부터 미디어 쿼리 숨기기: only 키워드

미디어 쿼리의 개념은 HTML4 [HTML401]에서 비롯된다. 그 명세는 미디어 유형만 정의했지만, 미디어 기능 같은 미래 개념의 추가를 수용할 수 있는 전방 호환 구문을 갖고 있었다: 첫 번째 비영숫자 문자가 나오기 전까지의 미디어 쿼리 문자를 소비하고, 이를 미디어 유형으로 해석하며, 나머지는 무시한다. 예를 들어, 미디어 쿼리 screen and (color)screen까지만 잘려 해석된다.

불행히도, 이 오류 처리 동작을 사용하는 레거시 사용자 에이전트는 미디어 쿼리 내의 어떤 미디어 기능도 무시하게 되며, 이는 기능이 쿼리의 미디어 유형보다 훨씬 더 중요하더라도 마찬가지다. 이는 부적절한 상황에서 스타일이 실수로 적용되는 결과를 낳을 수 있다.

이러한 미디어 쿼리를 레거시 사용자 에이전트로부터 숨기기 위해, 미디어 쿼리는 키워드 only로 접두될 수 있다. only 키워드는 미디어 쿼리의 결과에 영향이 없다. 다만 레거시 사용자 에이전트가 이를 미지의 미디어 유형 “only”로 지정한 것으로 파싱하게 하여, 결과적으로 무시되게 한다.

이 예에서 <link> 요소가 지정한 스타일시트는 레거시 사용자 에이전트에서 사용되지 않으며, 그것들이 정상적으로 screen 미디어 유형과 일치하더라도 마찬가지다.
<link rel="stylesheet" media="only screen and (color)" href="example.css" />

참고: only 키워드는 미디어 유형 앞에서만 사용할 수 있다. 미디어 기능만으로 구성된 미디어 쿼리나, 미디어 쿼리 수정자not 등이 있는 경우는 레거시 사용자 에이전트에 의해 자동으로 거짓으로 처리된다.

참고: 이 명세 발행 시점에는 이러한 레거시 사용자 에이전트가 극히 드물기 때문에, only 수정자를 사용하는 것은 드물게(혹은 전혀) 필요하다.

2.3. 미디어 유형

미디어 유형은 문서가 표시될 수 있는 사용자 에이전트 장치의 광범위한 분류이다. 원래의 미디어 유형 집합은 HTML4에서 <link> 요소의 media 속성을 위해 정의되었다.

불행히도, 미디어 유형은 서로 다른 스타일링 요구를 가진 장치들을 구분하는 방법으로는 불충분한 것으로 판명되었다. 원래는 상당히 뚜렷하게 구분되던 몇몇 범주들, 예컨대 screenhandheld은 발명된 이후 수년 동안 크게 서로 섞이게 되었다. 다른 것들, 예컨대 ttytv는 완전한 기능을 갖춘 컴퓨터 모니터의 일반적인 기준과는 다른 유용한 차이를 드러내며, 따라서 서로 다른 스타일링으로 대상으로 삼는 데 잠재적으로 유용하지만, 미디어 유형을 상호 배타적인 것으로 정의한 탓에 이를 합리적인 방식으로 사용하기가 어렵다; 대신, 그 배타적인 측면은 미디어 기능gridscan처럼 더 잘 표현된다.

따라서, 다음 미디어 유형미디어 쿼리에서 사용되도록 정의된다:

all
모든 장치와 일치한다.
print
프린터 및 인쇄된 표시를 재현하도록 의도된 장치(예: 문서를 “인쇄 미리보기”로 표시하는 웹 브라우저)에 매치된다.
screen
print로 일치하지 않는 모든 장치와 일치한다.

또한, 다음 더 이상 사용되지 않는 미디어 유형이 정의된다. 작성자는 이러한 미디어 유형을 사용해서는 안 된다; 대신, 스타일링하려는 장치의 측면을 더 잘 나타내는 적절한 미디어 기능을 선택할 것을 권장한다.

사용자 에이전트는 다음 미디어 유형을 유효한 것으로 인식해야 하지만, 아무것과도 일치하지 않도록 해야 한다.

참고: 모든 미디어 유형은 그들의 중요한 차이를 포착하는 적절한 미디어 기능이 정의됨에 따라, 시간이 지나면 역시 더 이상 사용되지 않게 될 것으로 예상된다.

Tests

2.4. 미디어 기능

미디어 기능미디어 유형보다 더 세밀한 테스트로, 사용자 에이전트 또는 표시 장치의 하나의 특정 기능을 시험한다.

구문적으로, 미디어 기능은 CSS 속성과 유사하다: 기능 이름, 콜론, 그리고 시험할 값을 포함한다. 또한 기능 이름만으로 불리언 형태로 쓸 수도 있고, 비교 연산자를 사용하는 범위 형태로도 쓸 수 있다.

( feature name : feature value feature name range form (see below) )

하지만, 속성과 미디어 기능 사이에는 몇 가지 중요한 차이가 있다:

미디어 기능이 UA가 실행 중인 장치에 존재하지 않는 개념을 참조하는 경우 (예: 음성 UA에는 “너비(width)”라는 개념이 없다), 미디어 기능은 항상 거짓으로 평가되어야 한다.

미디어 기능 device-aspect-ratio는 시각 장치에만 적용된다. speech 장치에서 device-aspect-ratio가 포함된 표현식은 따라서 항상 거짓이다:
<link media="speech and (device-aspect-ratio: 16/9)"
      rel="stylesheet" href="example.css">

2.4.1. 미디어 기능 유형: “range”와 “discrete”

모든 미디어 기능은 정의 표에서 자신의 “유형”을 “range” 또는 “discrete” 중 하나로 정의한다.

“discrete” 미디어 기능은 pointer와 같이 값의 집합에서 값을 취한다. 값은 키워드일 수도 있고 불리언 숫자(0과 1)일 수도 있지만, 공통점은 본질적인 “순서”가 없다는 점이다—​ 어떤 값도 다른 값보다 “작다”거나 “크다”고 할 수 없다.

반면 “range” 미디어 기능은 width처럼 값의 범위에서 값을 취한다. 임의의 두 값은 어느 쪽이 더 작고 어느 쪽이 더 큰지 비교할 수 있다.

두 유형의 유일한 중요한 차이는 “range” 미디어 기능범위 문맥에서 평가될 수 있고, 이름에 “min-” 및 “max-” 접두를 허용한다는 점이다. 이들 중 어느 하나를 수행하면 기능의 의미가 바뀐다—​ 즉, 기능이 주어진 값과 정확히 일치할 때 참이 되는 대신, 기능이 주어진 값보다 크거나/작거나/같을 때 일치한다.

(width >= 600px) 미디어 기능은 뷰포트 너비가 600px 이상일 때 참이다.

반면, (width: 600px)만으로는 뷰포트 너비가 정확히 600px일 때만 참이다. 600px보다 작거나 크면 거짓이 된다.

2.4.2. 불리언 문맥에서 미디어 기능 평가

미디어 기능은 보통 CSS 속성과 유사한 구문을 갖지만, (color)처럼 기능 이름만으로 더 단순하게 쓸 수도 있다.

이렇게 작성되면, 미디어 기능불리언 문맥에서 평가된다. 기능이 다음을 제외한 어떤 값에 대해서라도 참이 될 수 있다면— 숫자 0, 값이 0<dimension>, 또는 키워드 none미디어 기능은 참으로 평가된다. 그렇지 않으면 거짓으로 평가된다.

일부 미디어 기능은 이렇게 작성되도록 설계되었다.

예를 들어, update는 어떤 종류의 업데이트든 가능 여부를 시험하기 위해 보통 (update)로 작성되며, 반대를 확인하려면 not (update)로 쓴다.

여전히 명시적 값으로도 줄 수 있으며, (update: fast) or (update: slow)(update)와 같고, (update: none)not (update)와 같다.

일부 숫자형 미디어 기능—예: width—은 값이 거의 항상 0보다 크기 때문에, 불리언 문맥에서 평가하는 것이 드물게(혹은 전혀) 유용하지 않다. 다른 것들, 예: color는 의미 있는 0 값을 가진다: (color)(color > 0)과 동일하며, 장치가 색상을 전혀 표시할 수 있음을 나타낸다.
키워드를 받는 미디어 기능 중 일부만이 불리언 문맥에서 의미가 있다.

예를 들어, (pointer)는 유용한데, pointer에는 장치에 포인팅 장치가 전혀 없음을 나타내는 none 값이 있기 때문이다.

마찬가지로, not (color-gamut)는 매우 저품질의 화면을 감지하는 데 유용할 수 있는데, 그러한 장치는 color-gamut 키워드 중 어느 것도 일치하지 않기 때문이다; color-gamutnone 키워드가 없더라도, 값들 중 어느 것도 일치하지 않기 때문에 불리언 문맥에서는 여전히 거짓이 된다.

반면, (scan)은 (장치에 전혀 적용되는지 여부에 따라) 그냥 항상 참이거나 항상 거짓이다. 왜냐하면, 적용되기만 한다면 장치는 그 값들 중 적어도 하나와 일치하는 것이 보장되기 때문이다.

2.4.3. 범위 문맥에서 미디어 기능 평가

“range” 유형의 미디어 기능은 값에 순서가 있다는 사실을 활용하여, 일반적인 수학 비교 연산자를 사용하는 범위 문맥으로 대체 표기할 수 있다:

( feature name/value > <= < = >= feature value/name value < <= feature name < <= value value > >= feature name > >= value )

참고: 이 구문은 Mediaqueries 레벨 4에서 새로 도입되었으며, 따라서 현재는 min-/max- 접두사만큼 널리 지원되지 않는다.

기본 형태는 기능 이름, 비교 연산자, 그리고 값으로 구성되며, 그 관계가 참이면 참을 반환한다.

예를 들어, (height > 600px) (또는 (600px < height))는 뷰포트 높이가 600px보다 크면 참을 반환한다.

나머지 형태는, 기능 이름이 두 값 비교 사이에 중첩된 형태로, 두 비교가 모두 참이면 참을 반환한다.

예를 들어, (400px < width < 1000px)는 뷰포트 너비가 400px1000px 사이에 있으면 (단, 어느 쪽과도 같지 않은 경우) 참을 반환한다.

“range” 유형인 일부 미디어 기능은 음수 범위에서 거짓이라고 한다. 이는 음수 값이 유효하며 파싱되어야 하고, 미디어 기능이 그러한 음수 값과 같거나, 작거나, 작거나 같은지를 질의하는 것은 모두 거짓으로 평가되어야 함을 의미한다. 미디어 기능이 음수 값보다 크거나, 크거나 같은지를 질의하는 것은 그 관계가 참이면 참으로 평가된다.

참고: 만약 음수 값이 파싱 시점에 거부되었다면, 오류 처리 규칙에 따라 unknown으로 취급되었을 것이다. 그러나 현실에서, 장치의 resolution-300dpi인지 여부는 미지(unknown)가 아니라, 거짓임이 알려져 있다. 마찬가지로, 모든 시각 장치에서 대상 표시 영역의 width-200px보다 크다는 것이 알려져 있다. 위 규칙은 이를 반영하여, 직관이 UA의 동작과 일치하도록 만든다.

다음 예제들은 모든 시각 장치에서 녹색 배경을 만든다:
@media not (width <= -100px) {
  body { background: green; }
}
@media (height > -100px) {
  body { background: green; }
}
@media not (resolution: -300dpi) {
  body { background: green; }
}
이는 Media Queries Level 3 [MEDIAQUERIES-3]와 비교했을 때의 동작 변경이다. Level 3에서는 이러한 속성에서 음수 값이 문법 오류를 발생시켰다. Level 3에서는 금지된 값을 포함한 문법 오류로 인해 전체 미디어 쿼리가 이 레벨에서 정의된 unknown 처리로 되는 것이 아니라, false가 되었다. Level 3에서 업데이트하는 구현은, § 2.5 미디어 기능 결합에 정의된 더 풍부한 문법을 지원할 때 관련 속성에 대한 음수 값 처리 방식을 반드시 변경하여, 의도치 않은 의미가 도입되는 것을 피해야 한다.
Tests

2.4.4. 범위 기능에 “min-” 및 “max-” 접두사 사용

위에서 설명한 것처럼 “range” 유형의 미디어 기능을 범위 문맥에서 평가하는 대신, 기능은 일반적인 미디어 기능으로 작성하되, 기능 이름에 “min-” 또는 “max-” 접두사를 붙여 쓸 수 있다.

이는 다음과 같이 범위 문맥에서 기능을 평가하는 것과 동등하다:

참고: “min-”과 “max-”는 모두 값을 포함하는 범위 비교와 동일하므로, 특정 상황에서는 제약이 될 수 있다.

예를 들어, 작성자가 “min-” 및 “max-”를 사용하여 뷰포트 너비의 브레이크포인트에 따라 서로 다른 스타일을 정의하려고 할 때는 두 쿼리가 동시에 참으로 평가되지 않도록 비교하는 값을 보통 오프셋한다. 브레이크포인트가 320px라고 가정하면, 작성자는 개념적으로 다음을 사용한다:
@media (max-width: 320px) { /* viewports <= 320px에 대한 스타일 */ }
@media (min-width: 321px) { /* viewports >= 321px에 대한 스타일 */ }

이는 뷰포트 너비가 320px일 때 두 스타일 집합이 동시에 적용되지 않음을 보장하지만, 정수가 아닌 픽셀 밀도 (예: 고DPI 디스플레이 또는 줌/스케일링의 결과)로 인해 발생할 수 있는 분수 뷰포트 크기의 가능성은 고려하지 않는다. 320px과 321px 사이에 해당하는 뷰포트 너비는 어떤 스타일도 적용되지 않게 된다.

이 문제를 우회하는 한 가지 접근은 비교에 사용되는 값의 정밀도를 높이는 것이다. 위 예시에서 두 번째 비교 값을 320.01px로 바꾸면, 장치의 뷰포트 너비가 틈새 구간에 떨어질 가능성을 상당히 줄인다.

@media (max-width: 320px) { /* viewports <= 320px에 대한 스타일 */ }
@media (min-width: 320.01px) { /* viewports >= 320.01px에 대한 스타일 */ }

하지만 이러한 상황에서는, “>=” 및 “<=” 비교에 제한되지 않는 범위 문맥 쿼리가 더 적절한 해결책을 제공한다:

@media (width <= 320px) { /* viewports <= 320px에 대한 스타일 */ }
@media (width > 320px) { /* viewports > 320px에 대한 스타일 */ }

“discrete” 유형 속성은 “min-” 또는 “max-” 접두사를 받지 않는다. “discrete” 유형 미디어 기능에 이러한 접두사를 추가하면 단순히 알 수 없는 기능 이름이 된다.

예를 들어, (min-grid: 1)는 유효하지 않은데, grid는 “discrete” 미디어 기능이어서 접두사를 받지 않기 때문이다. (grid 미디어 기능01 값을 받기 때문에 숫자처럼 보이더라도 말이다.)

min/max 접두사가 붙은 미디어 기능불리언 문맥에서 평가하려는 시도는 유효하지 않으며 구문 오류다.

2.5. 미디어 기능 결합

여러 미디어 기능은 완전한 불리언 대수 (not, and, or)를 사용하여 미디어 조건으로 결합될 수 있다.

andornot을 미디어 쿼리의 같은 “수준”에서 섞는 것은 유효하지 않다. 예: (color) and (pointer) or (hover)는 불법인데, 의도가 무엇인지 불명확하기 때문이다. 대신, 특정 결합 키워드를 사용하여 그룹화하려면 괄호를 사용할 수 있으며, (color) and ((pointer) or (hover)) 또는 ((color) and (pointer)) or (hover)를 얻는다. 이 둘은 의미가 매우 다르다: (hover)만 참이라면, 첫 번째는 거짓으로 평가되지만 두 번째는 참으로 평가된다.

Tests

3. 구문

미디어 쿼리 구문에 대한 비공식 설명은 앞 절의 산문과 레일로드 다이어그램에 나타난다. 공식 미디어 쿼리 구문은 이 절에서 설명되며, 규칙/속성 문법 구문은 [CSS-SYNTAX-3][CSS-VALUES-3]에서 정의된다.

<media-query-list> 생성물을 파싱하기 위해, 컴포넌트 값의 쉼표로 구분된 목록을 파싱한 다음, 반환된 목록의 각 항목을 <media-query>로 파싱한다. 그 값은 이렇게 생성된 <media-query>들의 목록이다.

참고: <media-query-list> 파싱에 대한 이 명시적 정의는, 미디어 쿼리 목록의 오류 복구 동작을 잘 정의되게 만들기 위해 필요하다.

참고: <media-query-list> 파싱에 대한 이 정의는 의도적으로 빈 목록을 허용한다.

참고: [CSS-SYNTAX-3]에 따라, 토큰은 ASCII 대소문자 구분 없음이다.

<media-query> = <media-condition>
             | [ not | only ]? <media-type> [ and <media-condition-without-or> ]?
<media-type> = <ident>

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

<media-feature> = [ <mf-plain> | <mf-boolean> | <mf-range> ]
<mf-plain> = <mf-name> : <mf-value>
<mf-boolean> = <mf-name>
<mf-range> = <mf-name> <mf-comparison> <mf-value>
           | <mf-value> <mf-comparison> <mf-name>
           | <mf-value> <mf-lt> <mf-name> <mf-lt> <mf-value>
           | <mf-value> <mf-gt> <mf-name> <mf-gt> <mf-value>
<mf-name> = <ident>
<mf-value> = <number> | <dimension> | <ident> | <ratio>
<mf-lt> = '<' '='?
<mf-gt> = '>' '='?
<mf-eq> = '='
<mf-comparison> = <mf-lt> | <mf-gt> | <mf-eq>

<general-enclosed> = [ <function-token> <any-value>? ) ] | [ ( <any-value>? ) ]

<media-type> 생성물은 키워드 only, not, and, or, 그리고 layer를 포함하지 않는다.

참고: layer를 제외하는 이유는, 그렇지 않으면 @import url() layer; 구문에서 캐스케이드 레이어를 위해 사용될 때 모호해질 수 있기 때문이다. [CSS-CASCADE-5]를 참조하라.

“<” 또는 “>” <delim-token>과 뒤따르는 “=” <delim-token>(존재하는 경우) 사이에는 공백이 허용되지 않는다.

참고: not, and 또는 or 키워드와 그 뒤의 ( 문자 사이에는 공백이 필요하다. 공백이 없으면 <function-token>으로 파싱되기 때문이다. 이는 위 문법에서 이미 다뤄지고 있으므로 명시적으로 무효 처리하지는 않는다. 다만 )와 그 뒤의 키워드 사이에는 공백이 있어도 괜찮다.

<media-in-parens> 생성물을 파싱할 때, <general-enclosed> 분기는 입력이 앞의 두 분기 중 어느 쪽과도 일치하지 않을 때만 선택되어야 한다. <general-enclosed>는 문법을 합리적으로 호환되는 방식으로 확장할 수 있도록 하기 위해 존재한다.

Tests

3.1. 미디어 쿼리 평가

<media-condition> 또는 <media-condition-without-or>의 각 주요 하위 표현식은 다음과 같이 불리언 결과와 연관된다:

<media-condition>
<media-condition-without-or>
결과는 자식 하위 표현식의 결과이다.
<media-in-parens>
결과는 자식 항(term)의 결과이다.
<media-not>
결과는 <media-in-parens> 항의 부정이다. unknown의 부정은 unknown이다.
<media-in-parens> <media-and>*
결과는 <media-in-parens> 자식 항과, <media-and> 자식 항들의 모든 <media-in-parens> 자식들이 참이면 참이고, 이들 중 적어도 하나의 <media-in-parens> 항이 거짓이면 거짓이며, 그 외에는 unknown이다.
<media-in-parens> <media-or>*
결과는 <media-in-parens> 자식 항과, <media-or> 자식 항들의 모든 <media-in-parens> 자식들이 거짓이면 거짓이고, 이들 중 적어도 하나의 <media-in-parens> 항이 참이면 참이며, 그 외에는 unknown이다.
<general-enclosed>
결과는 unknown이다.

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

<media-feature>
결과는 지정된 미디어 기능을 평가한 결과이다.

위 생성물들 중 어느 하나의 결과가 2값 불리언을 기대하는 어떤 문맥에서 사용되는 경우, “unknown”은 “false”로 변환되어야 한다.

참고: 이는 예를 들어, 미디어 쿼리@media 규칙에서 사용될 때, “unknown”으로 해석되면 “false”로 취급되어 일치에 실패함을 의미한다.

미디어 쿼리는 항들이 “true”, “false”, “unknown”이 될 수 있는 3값 논리를 사용한다. 구체적으로는 Kleene 3값 논리를 사용한다. 이 논리에서 “unknown”은 “참 또는 거짓일 수 있지만, 아직 어느 쪽인지 확실하지 않다”를 의미한다.

일반적으로, 어떤 공식에 unknown 값이 나타나면 그 공식도 unknown이 된다. unknown을 “true”로 치환했을 때의 결과가 “false”로 치환했을 때의 결과와 달라지기 때문이다. unknown 값을 제거하는 유일한 방법은, unknown이 참/거짓 어느 쪽으로 바뀌어도 같은 결과를 내는 공식에 사용하는 것이다. 이는 “false AND unknown”(어떤 경우에도 false)과 “true OR unknown”(어떤 경우에도 true)에서 발생한다.

이 논리는 <general-enclosed>에 진리값을 부여해야 하기 때문에 채택되었다. 표준 불리언 논리에서 유일한 합리적인 값은 “false”이지만, 그러면 not unknown(function)이 참이 되어 혼란스럽고 원치 않을 수 있다. Kleene의 3값 논리는 unknown 항목이 최종 결과와 무관하지 않은 한 미디어 쿼리가 일치하지 않도록 보장한다.

3.2. 오류 처리

앞 절의 문법과 일치하지 않는 미디어 쿼리는 파싱 중 not all로 대체되어야 한다.

참고: 문법 불일치는 전체 미디어 쿼리 목록을 지우는 것이 아니다. 문제가 있는 미디어 쿼리만 해당한다. 위에서 정의한 파싱 동작은 다음 최상위 쉼표에서 자동으로 복구한다.

@media (example, all,), speech { /* only applicable to speech devices */ }
@media &test, speech           { /* only applicable to speech devices */ }

위의 두 미디어 쿼리 목록은 파싱 중 not all, speech로 바뀌며, 이는 speech만 있는 것과 동일한 진리값을 가진다.

오류 복구는 미디어 쿼리의 최상위 수준에서만 발생함에 유의하라; 유효하지 않은 괄호 블록 안의 내용은 그룹 전체가 not all로 바뀐다. 예를 들어:

@media (example, speech { /* rules for speech devices */ }

괄호 블록이 닫히지 않았으므로, (스타일시트 어딘가에서 짝이 맞지 않는 “)” 문자를 우연히 만나지 않는 한) 그 지점부터 스타일시트의 나머지 전체를 포함하게 되고, 전체가 not all 미디어 쿼리로 바뀐다.

알 수 없는 <media-type>은 일치하지 않는 것으로 취급되어야 한다.

예를 들어, 미디어 쿼리 unknown은 거짓인데, unknown은 알 수 없는 미디어 유형이기 때문이다.

하지만 not unknown은 참인데, not이 거짓인 미디어 유형을 부정하기 때문이다.

일부 키워드는 <media-type>으로 허용되지 않으며, 이 경우 파싱이 전체적으로 실패한다는 점을 기억하라: 미디어 쿼리 or and (color)or를 알 수 없는 미디어 유형으로 취급하는 대신, 파싱 중 not all로 바뀐다.

알 수 없는 <mf-name> 또는 <mf-value>, 또는 해당 미디어 기능의 값 구문과 일치하지 않는 기능 값은 “unknown” 값을 만든다. 값이 “unknown”인 <media-query>not all로 대체되어야 한다.

<link media="screen and (max-weight: 3kg) and (color), (color)"rel="stylesheet" href="example.css" />

max-weight는 알 수 없는 미디어 기능이므로, 이 미디어 쿼리 목록not all, (color)로 바뀌며, 이는 (color)만 있는 것과 동등하다.

@media (min-orientation: portrait) { … }

orientation 기능은 접두사를 허용하지 않으므로, 이는 알 수 없는 미디어 기능으로 간주되어 not all로 바뀐다.

미디어 쿼리 (color:20example)color 미디어 기능에 대해 알 수 없는 값을 지정하므로 not all로 바뀐다.
미디어 쿼리 역시 호스트 언어의 파싱 규칙의 영향을 받는다는 점에 유의하라. 예를 들어 다음 CSS 조각을 보자:
@media test;,all { body { background: lime } }

미디어 쿼리 test;,all은 자체로 파싱하면 not all, all과 동등하며, 이는 항상 참이다. 그러나 CSS의 파싱 규칙 때문에 @media 규칙, 그리고 따라서 미디어 쿼리는 세미콜론에서 끝난다. 나머지 텍스트는 유효하지 않은 선택자와 내용물을 가진 스타일 규칙으로 취급된다.

Tests

4. 뷰포트/페이지 크기 미디어 기능

4.1. 너비: width 기능

이름: width
대상: @media
값: <length>
유형: range

width 미디어 기능은 출력 장치의 대상 표시 영역의 너비를 설명한다. 연속 미디어의 경우, 이는 뷰포트의 너비이며 (CSS2 9.1.1절 [CSS2]에 설명됨), 렌더링된 스크롤바(있는 경우)의 크기를 포함한다. 페이지드 미디어의 경우, 이는 페이지 박스의 너비이다 (CSS2 13.2절 [CSS2]에 설명됨).

<length>§ 1.3 단위에 따라 해석된다.

width음수 범위에서 거짓이다.

예를 들어, 이 미디어 쿼리는 이 스타일시트가 25cm보다 넓은 인쇄 출력에서 사용됨을 표현한다:
<link rel="stylesheet" media="print and (min-width: 25cm)" href="http://…" />
이 미디어 쿼리는 뷰포트(문서가 렌더링되는 화면/종이의 부분) 너비가 400~700 픽셀 사이인 장치에서 스타일시트가 사용됨을 표현한다:
@media (400px <= width <= 700px) { … }
이 미디어 쿼리는 뷰포트 너비가 20em보다 큰 경우 스타일시트가 사용됨을 표현한다.
@media (min-width: 20em) { … }

em 값은 font-size초기값에 상대적이다.

Tests

4.2. 높이: height 기능

이름: height
대상: @media
값: <length>
유형: range

height 미디어 기능은 출력 장치의 대상 표시 영역의 높이를 설명한다. 연속 미디어의 경우, 이는 뷰포트 높이이며 렌더링된 스크롤바(있는 경우)의 크기를 포함한다. 페이지드 미디어의 경우, 이는 페이지 박스의 높이이다.

<length>§ 1.3 단위에 따라 해석된다.

height음수 범위에서 거짓이다.

4.3. 종횡비: aspect-ratio 기능

이름: aspect-ratio
대상: @media
값: <ratio>
유형: range

aspect-ratio 미디어 기능은 width 미디어 기능 값과 height 미디어 기능 값의 비율로 정의된다.

테스트

4.4. 방향: orientation 기능

이름: orientation
대상: @media
값: portrait | landscape
유형: discrete
portrait
orientation 미디어 기능은, height 미디어 기능 값이 width 미디어 기능 값보다 크거나 같을 때 portrait이다.
landscape
그 밖의 경우 orientationlandscape이다.
다음 미디어 쿼리는 휴대폰을 세워 쥔 것과 같은 “portrait” 방향을 테스트한다.
@media (orientation: portrait) { … }

5. 표시 품질 미디어 기능

5.1. 표시 해상도: resolution 기능

이름: resolution
대상: @media
값: <resolution> | infinite
유형: range

resolution 미디어 기능은 출력 장치의 해상도, 즉 픽셀의 밀도를 설명하며, 페이지 줌을 고려하지만 스케일 계수는 1.0이라고 가정한다.

resolution 미디어 기능은 음수 범위에서 거짓이다

정사각형이 아닌 픽셀을 가진 미디어를 질의할 때, resolution은 수직 차원의 밀도를 질의한다.

프린터의 경우, 이는 스크리닝 해상도(임의의 색상 점을 인쇄하기 위한 해상도)에 해당한다. 프린터는 회색조 인쇄에 대해 다른 해상도를 가질 수도 있다.

해상도에 물리적 제약이 없는 출력 매체(예: 벡터 그래픽으로 출력)의 경우, 이 기능은 infinite 값과 일치해야 한다. 이 미디어 기능을 범위 문맥에서 평가할 때, infinite는 가능한 어떤 <resolution>보다도 큰 것으로 취급되어야 한다. (즉, (resolution > 1000dpi) 같은 질의는 infinite 미디어에 대해 참이 된다.)

이 미디어 쿼리는 단순히 “고해상도” 화면을 감지한다 (하드웨어 픽셀 대 CSS px 비율이 최소 2인 화면):
@media (resolution >= 2dppx)
예를 들어, 이 미디어 쿼리는 CSS in당 300도트보다 큰 해상도를 가진 장치에서 스타일시트가 사용됨을 표현한다:
@media print and (min-resolution: 300dpi) { … }

이 미디어 쿼리는 동등하지만, CSS cm 단위를 사용한다:

@media print and (min-resolution: 118dpcm) { … }
<resolution>는 물리적 길이 단위당 장치 픽셀의 수를 의미하는 것이 아니라, CSS 단위당 장치 픽셀의 수를 의미한다. 이 매핑은 사용자 에이전트가 수행하므로, 이는 항상 사용자 에이전트에 알려져 있다.

사용자 에이전트가 물리적 픽셀의 기하에 대한 지식이 없거나, 또는 물리적 픽셀의 기하를 알고 있으며 그것들이 (충분히) 정사각형이라면, 각 축을 따라 CSS 픽셀당 다른 수의 장치 픽셀로 매핑하지 않을 것이며, 따라서 수직 및 수평 해상도 사이에 차이가 없다.

그 밖에, UA가 각 축마다 다른 수로 매핑하기로 선택한다면, 이는 물리적 픽셀이 정사각형이 아니기 때문일 수 있다. UA가 이 지식을 어떻게 얻는지는 범위를 벗어나지만, 이 결정을 내릴 충분한 정보를 가지고 있다면, 장치가 90도 회전될 경우 이 매핑을 반전시킬 수 있다.

5.2. 표시 유형: scan 기능

이름: scan
대상: @media
값: interlace | progressive
유형: discrete

scan 미디어 기능은 일부 출력 장치의 스캐닝 과정을 설명한다.

interlace
CRT 및 일부 플라즈마 TV 화면 유형은 “인터레이스” 렌더링을 사용했는데, 비디오 프레임이 화면의 “짝수” 줄만 지정하는 것과 “홀수” 줄만 지정하는 것을 번갈아 수행하며, 다양한 자동적인 심상 보정 능력을 활용해 부드러운 움직임을 만들어냈다. 이는 대역폭 비용을 절반으로 하면서 더 높은 FPS 방송을 시뮬레이션할 수 있게 했다.

인터레이스 화면에서 표시할 때는, 작성자는 “콤빙(combing)”을 피하기 위해 화면을 가로지르는 매우 빠른 움직임을 피해야 하며, “트위터(twitter)”를 피하기 위해 화면의 세부 요소가 1px보다 넓도록 해야 한다.

progressive
“프로그레시브” 렌더링을 사용하는 화면은 각 화면을 완전히 표시하며, 특별한 처리가 필요 없다.

대부분의 현대 화면과 모든 컴퓨터 화면은 프로그레시브 렌더링을 사용한다.

예를 들어, 세리프 글꼴에서 글자의 “발”은 인터레이스 장치에서 “트위터(twitter)”를 유발할 수 있는 매우 작은 특징이다. scan 미디어 기능은 이를 감지하는 데 사용할 수 있으며, “트위터” 가능성이 더 적은 대체 글꼴을 사용할 수 있다:
@media (scan: interlace) { body { font-family: sans-serif; } }

참고: 작성 시점 기준, 알려진 모든 구현은 scan: interlace가 아니라 scan: progressive와 일치한다.

5.3. 콘솔 디스플레이 감지: grid 기능

이름: grid
대상: @media
값: <mq-boolean>
유형: discrete
<mq-boolean> = <integer [0,1]>

grid 미디어 기능은 출력 장치가 그리드인지 비트맵인지 질의하는 데 사용된다. 출력 장치가 그리드 기반(예: “tty” 터미널, 또는 고정 글꼴 하나만 가진 전화기 디스플레이)이라면 값은 1이 된다. 그렇지 않으면 값은 0이 된다.

<mq-boolean> 값 유형은 값이 0 또는 1<integer>이다. 그 밖의 어떤 정수 값도 유효하지 않다. CSS에서 -0은 항상 0과 동등하므로, 유효한 <mq-boolean> 값으로도 받아들여진다는 점에 유의하라.

참고: <mq-boolean> 유형은 오직 레거시 목적을 위해 존재한다. 이 기능이 오늘날 설계된다면, 값에 대해 적절한 이름의 키워드를 대신 사용했을 것이다.

다음은 좁은 콘솔 화면을 감지하는 예시이다:
@media (grid) and (max-width: 15em) { … }

참고: 작성 시점 기준, 알려진 모든 구현은 grid: 1이 아니라 grid: 0과 일치한다.

5.4. 표시 업데이트 빈도: update 기능

이름: update
대상: @media
값: none | slow | fast
유형: discrete

update 미디어 기능은 콘텐츠가 렌더링된 이후에 출력 장치가 콘텐츠의 모양을 수정할 수 있는 능력을 질의하는 데 사용된다. 이는 다음 값을 받는다:

none
렌더링된 후에는 레이아웃을 더 이상 업데이트할 수 없다. 예: 종이에 인쇄된 문서.
slow
레이아웃은 CSS의 일반 규칙에 따라 동적으로 변할 수 있지만, 출력 장치는 변화가 부드러운 애니메이션으로 인지될 만큼 충분히 빠르게 렌더링하거나 표시할 수 없다. 예: E-ink 화면 또는 심각하게 저성능인 장치.
fast
레이아웃은 CSS의 일반 규칙에 따라 동적으로 변할 수 있으며, 출력 장치는 속도 면에서 특별히 제약되지 않으므로, CSS 애니메이션 같은 정기적으로 업데이트되는 것들을 사용할 수 있다. 예: 컴퓨터 화면.
예를 들어, 어떤 페이지가 링크를 호버 시에만 밑줄이 생기도록 스타일링한다면, 인쇄 시에는 항상 밑줄을 표시하고 싶을 수 있다:
@media (update) {
  a { text-decoration: none; }
  a:hover, a:focus { text-decoration: underline; }
}
/* 업데이트되지 않는 UA에서는 링크가 기본 밑줄을 항상 가진다. */
테스트

5.5. 블록 축 오버플로: overflow-block 기능

이름: overflow-block
대상: @media
값: none | scroll | paged
유형: discrete

overflow-block 미디어 기능은 콘텐츠가 블록 축에서 초기 포함 블록을 넘칠 때의 장치 동작을 설명한다.

none
block axis에서 오버플로를 처리할 수 있는 수단이 없으며; 넘치는 콘텐츠는 단순히 표시되지 않는다. 예: 빌보드
scroll
block axis에서 넘치는 콘텐츠는 사용자가 스크롤하여 볼 수 있도록 함으로써 노출된다. 예: 컴퓨터 화면
paged
콘텐츠는 개별 페이지로 나뉘며; block axis에서 한 페이지를 넘치는 콘텐츠는 다음 페이지에 표시된다. 예: 프린터, 전자책 리더

none 또는 scroll과 일치하는 미디어는 연속 미디어라고 하며, paged와 일치하는 미디어는 페이지드 미디어라고 한다.

참고: 이 미디어 기능에 대한 추가 값은 향후 연속페이지드 미디어의 측면을 결합한 하이브리드 동작을 갖는 사용자 에이전트의 범주를 설명하기 위해 추가될 수 있다. 예를 들어, (현재는 중단된) Presto 레이아웃 엔진은 강제 페이지 나누기를 존중한다는 점을 제외하면 continuous와 유사한 반(半) 페이지드 프레젠테이션 모드 동작을 제공했다. 이 수준에서 이러한 유형의 동작을 가진 현재 배포 중인 사용자 에이전트를 알지 못하므로, 워킹 그룹은 그러한 사용자 에이전트를 잘못 특징짓는 것을 피하기 위해 이 수준에서는 그러한 값을 추가하지 않기로 결정했다. 위에 지정된 값들 중 어느 것으로도 적절히 설명되지 않는 사용자 에이전트를 구현하는 사람은 누구나, 이 미디어 기능에 대한 확장을 고려할 수 있도록 워킹 그룹에 연락할 것이 권장된다.

테스트

5.6. 인라인 축 오버플로: overflow-inline 기능

이름: overflow-inline
대상: @media
값: none | scroll
유형: discrete

overflow-inline 미디어 기능은 콘텐츠가 inline axis에서 초기 포함 블록을 넘칠 때의 장치 동작을 설명한다.

none
inline axis에서 오버플로를 처리할 수 있는 수단이 없으며; 넘치는 콘텐츠는 단순히 표시되지 않는다.
scroll
inline axis에서 넘치는 콘텐츠는 사용자가 스크롤하여 볼 수 있도록 함으로써 노출된다.

참고: inline-overflowing 콘텐츠의 페이지드(paged) 오버플로에 대한 알려진 구현은 없으며, 그 개념 자체도 크게 타당해 보이지 않으므로, overflow-inline에 대해서는 의도적으로 paged 값이 없다.

6. 색상 미디어 기능

6.1. 색상 깊이: color 기능

이름: color
대상: @media
값: <integer>
유형: range

color 미디어 기능은 출력 장치의 각 색상 구성 요소당 비트 수를 설명한다. 장치가 컬러 장치가 아니라면 값은 0이다.

color음수 범위에서 거짓이다.

예를 들어, 다음 두 미디어 쿼리는 스타일시트가 모든 컬러 장치에 적용됨을 표현한다:
@media (color) { … }
@media (min-color: 1) { … }
이 미디어 쿼리는 각 색상 구성 요소당 최소 8비트를 가진 컬러 장치에 스타일시트가 적용됨을 표현한다:
@media (color >= 8) { … }

서로 다른 색상 구성 요소가 서로 다른 비트 수로 표현되는 경우, 가장 작은 수가 사용된다.

예를 들어, 8비트 컬러 시스템이 빨강 구성 요소는 3비트, 초록 구성 요소는 3비트, 파랑 구성 요소는 2비트로 표현한다면, color 미디어 기능의 값은 2가 된다.

인덱스(팔레트) 색상을 가진 장치에서는, 룩업 테이블에서 각 색상 구성 요소당 최소 비트 수가 사용된다.

참고: 설명된 기능은 색상 능력을 피상적인 수준에서만 설명할 수 있다. 일반적으로 color-gamut이 작성자의 요구에 더 관련성이 크다. 추가 기능이 필요하다면, RFC2879 [RFC2879]는 이후 단계에서 지원될 수 있는 보다 구체적인 미디어 기능을 제공한다.

6.2. 팔레트 컬러 화면: color-index 기능

이름: color-index
대상: @media
값: <integer>
유형: range

color-index 미디어 기능은 출력 장치의 색상 룩업 테이블의 엔트리 수를 설명한다. 장치가 색상 룩업 테이블을 사용하지 않는 경우, 값은 0이다.

color-index음수 범위에서 거짓이다.

예를 들어, 다음은 스타일시트가 모든 color index 장치에 적용됨을 표현하는 두 가지 방법이다:
@media (color-index) { … }
@media (color-index >= 1) { … }
이 미디어 쿼리는 256개 이상의 엔트리를 가진 color index 장치에 스타일시트가 적용됨을 표현한다:
<?xml-stylesheet media="(min-color-index: 256)"
  href="http://www.example.com/…" ?>

6.3. 단색 화면: monochrome 기능

이름: monochrome
대상: @media
값: <integer>
유형: range

monochrome 미디어 기능은 단색 프레임 버퍼에서 픽셀당 비트 수를 설명한다. 장치가 단색 장치가 아니라면, 출력 장치 값은 0이 된다.

monochrome음수 범위에서 거짓이다.

예를 들어, 다음은 스타일시트가 모든 단색 장치에 적용됨을 표현하는 방법이다:
@media (monochrome) { … }
스타일시트가 픽셀당 비트 수가 2보다 큰 단색 장치에 적용됨을 표현한다:
@media (monochrome >= 2) { … }
컬러 페이지용 스타일시트 하나와 단색용 스타일시트 하나가 있음을 표현한다:
<link rel="stylesheet" media="print and (color)" href="http://…" />
<link rel="stylesheet" media="print and (monochrome)" href="http://…" />

6.4. 컬러 디스플레이 품질: color-gamut 기능

이름: color-gamut
대상: @media
값: srgb | p3 | rec2020
유형: 불연속

color-gamut 미디어 기능은 UA 및 출력 장치가 지원하는 색상의 대략적인 범위를 설명한다. 즉, UA가 지정된 색 공간의 색을 포함한 콘텐츠를 수신하면 출력 장치가 해당하는 색을 렌더링하도록 하거나, 또는 그에 충분히 가깝게 렌더링하도록 만들 수 있다.

참고: 이 쿼리는 몇 가지 이유로 대략적인 범위를 사용한다. 첫째, 디스플레이 하드웨어에는 매우 많은 차이가 있다. 예를 들어, 어떤 장치는 "Rec. 2020"을 지원한다고 주장할 수 있지만, 실제로는 전체 색역보다 훨씬 낮은 범위만 렌더링한다. 둘째, 서로 다른 장치가 지원하는 색 범위의 종류가 매우 많으며, 이를 모두 열거하는 것은 번거롭다. 대부분의 경우 작성자는 디스플레이의 정확한 성능을 알 필요가 없고, sRGB보다 더 나은지, 또는 sRGB보다 현저히 더 나은지만 알면 된다. 그렇게 하면 적절한 이미지를, 색 프로필로 태그하여, 사용자에게 제공할 수 있다.

srgb
UA 및 출력 장치는 대략 sRGB 색역 또는 그 이상을 지원할 수 있다.

참고: 대다수의 컬러 디스플레이는 이 유형의 쿼리에 대해 true를 반환할 수 있을 것으로 예상된다.

p3
UA 및 출력 장치는 Display P3 [Display-P3] 색 공간으로 지정된 색역 또는 그 이상을 대략 지원할 수 있다.

참고: p3 색역은 srgb 색역보다 더 크며 이를 포함한다.

rec2020
UA 및 출력 장치는 ITU-R 권고 BT.2020 색 공간으로 지정된 색역 또는 그 이상을 대략 지원할 수 있다.

참고: rec2020 색역은 p3 색역보다 더 크며 이를 포함한다.

다음 표는 [COLORIMETRY]에 정의된 바와 같이, 이들 색 공간의 기본색을 해당 색 공간의 색도 좌표로 나타낸 것이다.

색 공간 백색점 기본색
빨강 초록 파랑
xW yW xR yR xG yG xB yB
srgb 0.3127 0.3290 0.640 0.330 0.300 0.600 0.150 0.060
p3 0.3127 0.3290 0.680 0.320 0.265 0.690 0.150 0.060
rec2020 0.3127 0.3290 0.708 0.292 0.170 0.797 0.131 0.046

참고: 위 표는 색 공간을 완전히 설명하기에 충분한 정보를 포함하지는 않지만, 출력 장치가 각 색역을 대략적으로 커버하는지 여부를 판단하기에는 충분하다. sRGB에 대한 추가 정보는 [SRGB]를, Display P3에 대한 추가 정보는 [Display-P3]를, ITU-R 권고 BT.2020에 대한 추가 정보는 [ITU-R-BT-2020-2]를 참조하라.

예를 들어, 이 미디어 쿼리는 디스플레이가 Display P3 범위의 색을 지원할 때 적용된다:
@media (color-gamut: p3) {}

참고: 출력 장치의 전체 출력 색역이 충분히 크거나, 한 색역이 다른 지원되는 색역의 부분집합인 경우, 이 미디어 기능의 여러 값에 대해 true를 반환할 수 있다. 그 결과, 이 기능은 “오름차순” 방식으로 사용하는 것이 가장 좋다—​(color-gamut: srgb)가 true일 때 기본 값을 설정한 다음, (color-gamut: p3)가 true이면 이를 덮어쓰는 식으로, 등등.

참고: 일부 출력 장치(예: 단색 디스플레이)는 srgb 색역조차 지원하지 못할 수 있다. 이러한 장치를 테스트하려면, 부정된 불리언 컨텍스트 방식으로 이 기능을 사용할 수 있다: not (color-gamut).

테스트

7. 상호작용 미디어 기능

“상호작용” 미디어 기능은 사용자가 페이지와 상호작용하는 방식의 다양한 측면을 반영한다.

pointerhover 조합에 해당하는 장치의 전형적인 예:
pointer: none pointer: coarse pointer: fine
hover: none 키보드 전용 컨트롤, 순차/공간(d-pad) 포커스 내비게이션 스마트폰, 터치 스크린 기본 스타일러스 디지타이저(Cintiq, Wacom 등)
hover: hover Nintendo Wii 컨트롤러, Kinect 마우스, 터치패드, 고급 스타일러스 디지타이저(Surface, Samsung Note, Wacom Intuos Pro 등)

pointerhover 기능은 “주(Primary)” 포인팅 장치의 특성과 관련이 있으며, any-pointerany-hover는 잠재적으로 사용 가능한 모든 포인팅 장치의 속성을 쿼리하는 데 사용할 수 있다.

참고: 이 명세는 사용자 에이전트가 “주(Primary)” 포인팅 장치를 어떻게 결정해야 하는지 정의하지 않지만, 기대되는 바는 사용자 에이전트가 다음을 결합하여 이 결정을 내리는 것이다: 실행 중인 장치/환경에 대한 지식, 사용 가능한 포인팅 장치의 수와 유형, 그리고 이들 중 어느 것이 일반적으로 및/또는 현재 사용 중인지에 대한 개념. 어떤 장치에서 주 입력 메커니즘이 포인팅 장치가 아니지만, 더 드물게 사용되는 보조 입력이 포인팅 장치인 상황에서는, 사용자 에이전트가 비-포인팅 장치를 주 장치로 취급하기로 결정할 수 있다(그 결과 pointer: none). 사용자 에이전트는 또한 사용자 환경의 변화나 사용자가 UA와 상호작용하는 방식의 변화에 반응하여, 어떤 유형의 포인팅 장치를 주 장치로 간주할지를 동적으로 변경하기로 결정할 수도 있다.

참고: pointer, hover, any-pointerany-hover 기능은 포인팅 장치의 특성, 또는 포인팅 장치의 완전한 부재에만 관련되며, 키보드 같은 비-포인팅 장치 입력 메커니즘의 존재를 감지하는 데 사용할 수 없다. 작성자는 이러한 기능을 쿼리할 때 어떤 값이 매치되는지와 무관하게, 비-포인팅 장치 입력이 존재할 수 있음을 고려해야 한다.

pointerhover는 주 입력 메커니즘에 맞춰(주 포인팅 장치의 특성 또는 완전한 부재에 기반하여) 페이지의 주요 스타일과 상호작용 모드를 설계하는 데 사용할 수 있지만, 작성자는 감지된 모든 가능한 유형의 포인팅 장치를 고려하기 위해 any-pointerany-hover를 사용할 것을 강력히 고려해야 한다.

7.1. 포인팅 장치 품질: pointer 기능

이름: pointer
대상: @media
값: none | coarse | fine
유형: 불연속

pointer 미디어 기능은 마우스와 같은 포인팅 장치의 존재 및 정확도를 쿼리하는 데 사용된다. 여러 포인팅 장치가 존재하는 경우, pointer 미디어 기능은 사용자 에이전트가 결정한 “주(Primary)” 포인팅 장치의 특성을 반영해야 한다. (사용 가능한 어떤 포인팅 장치의 성능을 쿼리하려면, any-pointer 미디어 기능을 참조하라.)

none
장치의 주 입력 메커니즘에 포인팅 장치가 포함되지 않는다.
coarse
장치의 주 입력 메커니즘에 제한된 정확도의 포인팅 장치가 포함된다. 예로는 터치스크린과 모션 감지 센서(예: Xbox용 Kinect 주변기기)가 있다.
fine
장치의 주 입력 메커니즘에 정확한 포인팅 장치가 포함된다. 예로는 마우스, 터치패드, 드로잉 스타일러스가 있다.

coarsefine은 모두 포인팅 장치의 존재를 나타내지만, 정확도에서 차이가 있다. 줌 배율 1에서 서로 인접한 여러 작은 타깃 중 하나를 신뢰성 있게 선택하기가 어렵거나 불가능한 포인팅 장치는 coarse로 분류될 것이다. 줌 레벨 변경은 이 미디어 기능의 값에 영향을 주지 않는다.

참고: UA가 사용자에게 줌 기능을 제공할 수 있고, 또는 보조 포인팅 장치의 정확도가 다를 수 있으므로, 사용자는 이 미디어 기능의 값이 coarse이더라도 정확한 클릭을 수행할 수 있을지도 모른다. 이 미디어 기능은 사용자가 결코 정확하게 클릭할 수 없다는 것을 나타내지 않으며, 단지 그렇게 하는 것이 불편하다는 것만을 나타낸다. 작성자는 coarse 값에 반응하여 정확한 클릭에 의존하지 않고도 조작될 수 있도록 페이지를 설계해야 할 것으로 기대된다.

접근성 이유로, 포인팅 장치를 fine으로 설명할 수 있는 장치에서조차, UA는 이 미디어 쿼리에 대해 coarse 또는 none 값을 줄 수 있는데, 이는 사용자가 포인팅 장치를 정확하게, 또는 아예 조작하기 어렵다는 것을 나타내기 위함이다. 또한 주 포인팅 장치가 fine 정확도를 가지고 있더라도, 사용자에게는 추가적인 coarse 포인팅 장치가 제공될 수 있다. 작성자는 이러한 다른 coarse 잠재적 포인팅 장치를 고려하기 위해 any-pointer 미디어 기능을 쿼리하고 싶을 수 있다.

/* 부정확한 주 포인팅 장치가 있을 경우 라디오 버튼과 체크박스를 더 크게 만든다 */
@media (pointer: coarse) {
  input[type="checkbox"], input[type="radio"] {
    min-width: 30px;
    min-height: 40px;
    background: transparent;
  }
}

7.2. 호버 기능: hover 기능

이름: hover
대상: @media
값: none | hover
유형: 불연속

hover 미디어 기능은 사용자가 주 포인팅 장치로 페이지의 요소 위를 호버할 수 있는 능력을 쿼리하는 데 사용된다. 장치에 여러 포인팅 장치가 있는 경우, hover 미디어 기능은 사용자 에이전트가 결정한 “주(Primary)” 포인팅 장치의 특성을 반영해야 한다. (사용 가능한 어떤 포인팅 장치의 성능을 쿼리하려면, any-hover 미디어 기능을 참조하라.)

none
주 포인팅 장치가 호버할 수 없거나, 또는 포인팅 장치가 없음을 나타낸다. 예로는 터치스크린과 기본 드로잉 스타일러스를 사용하는 화면이 있다.

호버할 수는 있지만, 호버하는 것이 불편하고 일반적인 사용 방식의 일부가 아닌 포인팅 장치도 이 값에 매치된다. 예를 들어, 길게 누르기를 호버로 취급하는 터치스크린은 hover: none에 매치될 것이다.

hover
주 포인팅 장치가 페이지의 일부 위를 쉽게 호버할 수 있음을 나타낸다. 예로는 마우스 및 Nintendo Wii 컨트롤러처럼 화면을 물리적으로 가리키는 장치가 있다.
예를 들어, 선택적으로 마우스로도 제어할 수 있는 터치 스크린 장치에서, hover 미디어 기능hover: none에 매치되어야 하는데, 주 포인팅 장치(터치 스크린)가 사용자가 호버할 수 있게 해주지 않기 때문이다.

하지만 그럼에도 선택적 마우스는 사용자가 호버할 수 있게 해준다. 따라서 작성자는 :hover 의사 클래스hover: none이 true인 장치에서 결코 매치되지 않을 것이라고 가정하지 않도록 주의해야 하며, 호버에 의존하지 않아도 완전히 사용 가능한 레이아웃을 설계해야 한다.

접근성 이유로, 호버를 지원하는 장치에서도 UA는 이 미디어 쿼리에 대해 hover: none 값을 줄 수 있는데, 호버 없이도 잘 동작하는 레이아웃을 선택하도록 하기 위함이다. 주 입력 메커니즘이 hover: hover 기능을 가지고 있더라도, 사용자에게는 호버 기능을 제공하지 않는 추가 입력 메커니즘이 있을 수 있음을 유의하라.

/* 편리하게 호버할 수 있는 장치에서만 호버로 활성화되는 드롭다운 메뉴를 사용한다. */
@media (hover) {
  .menu > li        {display:inline-block;}
  .menu ul          {display:none; position:absolute;}
  .menu li:hover ul {display:block; list-style:none; padding:0;}
  /* ... */
}

7.3. 사용 가능한 모든 상호작용 능력: any-pointerany-hover 기능

이름: any-pointer
대상: @media
값: none | coarse | fine
유형: 불연속
이름: any-hover
대상: @media
값: none | hover
유형: 불연속

any-pointerany-hover 미디어 기능은 pointerhover 미디어 기능과 동일하지만, 사용자에게 사용 가능한 모든 포인팅 장치의 능력의 합집합에 대응한다. any-pointer의 경우, 서로 다른 포인팅 장치가 서로 다른 특성을 가지면 하나 이상의 값이 매치될 수 있다.

any-pointerany-hovernone이 대응 쿼리에 대해 none에 매치되는 포인팅 장치뿐이거나, 또는 포인팅 장치가 전혀 없을 때에만 매치되어야 한다.

any-pointer는 포인팅 장치의 존재 및 정확도를 쿼리하는 데 사용된다. 이는 추가적인 비-포인팅 장치 입력을 고려하지 않으며, d-pad 또는 키보드 전용 컨트롤처럼 화면상의 포인터를 움직이지 않는 다른 입력 메커니즘의 존재를 테스트하는 데 사용할 수 없다. any-pointer: none은 포인팅 장치가 전혀 존재하지 않을 때에만 true로 평가된다.
마우스와 키보드가 있는 전통적인 데스크톱 환경에서는, any-pointer: none은 (마우스가 존재하므로) false가 된다. 비-포인터 입력(키보드)도 존재하지만 그럼에도 그렇다.
any-hover: none은 포인팅 장치가 전혀 없거나, 또는 존재하는 모든 포인팅 장치가 호버 기능이 없을 때에만 true로 평가된다. 따라서 이는 어떤 호버 가능 포인팅 장치가 존재하는지를 테스트하는 쿼리로 이해해야 하며, 포인팅 장치 중 어떤 것이 호버 불가능한지를 테스트하는 쿼리가 아니다. 후자의 시나리오는 현재 any-hover 또는 다른 어떤 상호작용 미디어 기능으로도 결정할 수 없다. 또한 이는 d-pad나 키보드 전용 컨트롤 같은 비-포인팅 장치 입력을 고려하지 않는데, 이들은 본질적으로 호버 가능하지 않기 때문이다.
마우스와 터치스크린이 있는 터치 지원 노트북에서, any-hover: none은 (호버 가능한 마우스가 존재하므로) false로 평가된다. 호버 불가능한 포인팅 장치(터치스크린)도 존재하지만 그럼에도 그렇다. 현재는 서로 다른 포인팅 장치가 서로 다른 호버 능력을 갖는 경우에 대해 서로 다른 스타일을 제공하는 것은 불가능하다.
any-hover 또는 any-pointer가 사용 가능한 입력 메커니즘 중 적어도 하나가 이러한 능력을 갖고 있음을 나타낸다는 이유만으로, 호버나 정확한 포인팅에 의존하는 페이지를 설계하는 것은 좋지 않은 경험으로 이어질 가능성이 높다. 다만 작성자는 이 정보를 사용하여, 사용자에게 추가 포인팅 장치가 제공되는 경우 어떤 스타일과 기능을 제공할지에 대한 결정을 내리는 데 참고할 수 있다.
많은 스마트 TV는 화면상의 커서를 제어하는 방법을 제공하지만, 대개는 정확하게 조작하기 어려운 꽤 기본적인 컨트롤러인 경우가 많다.

그러한 스마트 TV의 브라우저는 coarsepointerany-pointer의 값으로 둘 다 갖게 되어, 작성자가 크고 누르기 쉬운 클릭 타깃을 가진 레이아웃을 제공할 수 있게 해준다.

사용자는 TV에 블루투스 마우스를 페어링해 가끔 편의를 위해 사용하기도 하지만, 이 마우스는 TV를 조작하는 주된 방식은 아니다. pointer는 여전히 coarse에 매치되는 반면, any-pointer는 이제 coarsefine에 모두 매치된다.

(any-pointer: fine)이 이제 true라는 사실만으로 작은 클릭 타깃으로 전환하는 것은 적절하지 않다. 이는 TV에서 기대하는 것과 어긋나는 경험을 제공하여 사용자를 놀라게 할 뿐 아니라, 상당히 불편할 수도 있다: 마우스는 TV를 조작하는 주된 방식이 아니므로 손이 닿지 않거나, 소파 쿠션 아래 어딘가에 숨겨져 있을 수도 있다...

대조적으로, 같은 TV에서 스크롤을 생각해 보자. 스크롤바는 정확한 포인팅 장치 없이 조작하기 어렵다. (pointer: coarse)가 true라는 사실에 기반하여 더 많은 콘텐츠가 있음을 나타내는 대체 방법을 준비해 둔 작성자는, (any-pointer: fine)이 true이면 스크롤바도 추가로 표시하거나, (any-pointer: fine)이 false이면 시각적 혼잡을 줄이기 위해 스크롤바를 아예 숨기고 싶을 수도 있다.

부록 A: 폐기된 미디어 기능

다음 미디어 기능폐기됨이다. 이들은 하위 호환성을 위해 유지되지만, 새로 작성되는 스타일 시트에는 적절하지 않다. 작성자는 이를 사용해서는 안 된다. 사용자 에이전트는 명시된 대로 이를 지원해야 한다 .

뷰포트의 크기(또는 페이지 미디어에서의 페이지 박스)를 쿼리하려면, width, heightaspect-ratio 미디어 기능을 사용해야 하며, 문서가 레이아웃되는 데 사용 가능한 공간의 양과 무관하게 장치의 물리적 크기를 참조하는 device-width, device-heightdevice-aspect-ratio를 쓰는 대신 그래야 한다. 또한 device-* 미디어 기능은 때때로 모바일 장치를 탐지하기 위한 프록시로도 사용된다. 대신, 작성자는 스타일링 대상으로 삼으려는 장치의 측면을 더 잘 표현하는 미디어 기능을 사용해야 한다.

device-width

이름: device-width
대상: @media
값: <length>
유형: 범위

device-width 미디어 기능은 출력 장치의 렌더링 표면의 너비를 설명한다. 연속 미디어의 경우, 이는 웹에 노출된 화면 영역의 너비이다. 페이지드 미디어의 경우, 이는 페이지 용지 크기의 너비이다.

device-width음수 범위에서 false이다.

@media (device-width < 800px) { … }

위 예에서, 스타일 시트는 길이가 800px보다 작은 화면에만 적용된다. px 단위는 논리적 종류이며, 단위 절에서 설명한다.

참고: 장치가 세로(포트레이트) 및 가로(랜드스케이프)처럼 여러 방향으로 사용될 수 있는 경우, device-* 미디어 기능은 현재 방향을 반영한다.

device-height

이름: device-height
대상: @media
값: <length>
유형: 범위

device-height 미디어 기능은 출력 장치의 렌더링 표면의 높이를 설명한다. 연속 미디어의 경우, 이는 웹에 노출된 화면 영역의 높이이다. 페이지드 미디어의 경우, 이는 페이지 용지 크기의 높이이다.

device-height음수 범위에서 false이다.

<link rel="stylesheet" media="(device-height > 600px)" />

위 예에서, 스타일 시트는 600 수직 픽셀보다 큰 화면에만 적용된다. px 단위의 정의는 CSS의 다른 부분과 동일하다.

device-aspect-ratio

이름: device-aspect-ratio
대상: @media
값: <ratio>
유형: 범위

device-aspect-ratio 미디어 기능은 device-width 미디어 기능 값과 device-height 미디어 기능 값의 비율로 정의된다.

예를 들어, 정사각형 픽셀을 가진 화면 장치가 1280 수평 픽셀과 720 수직 픽셀을 가지는 경우 (일반적으로 “16:9”라고 부른다), 다음 미디어 쿼리는 모두 해당 장치에 매치된다:
@media (device-aspect-ratio: 16/9) { … }
@media (device-aspect-ratio: 32/18) { … }
@media (device-aspect-ratio: 1280/720) { … }
@media (device-aspect-ratio: 2560/1440) { … }
테스트

변경 사항

2021년 12월 25일 후보 권고 초안 이후의 변경 사항

다음 변경 사항은 2021년 12월 25일 후보 권고 초안 이후 이 명세에 적용되었다:

2020년 7월 21일 후보 권고 이후의 변경 사항

다음 변경 사항은 2020년 7월 21일 후보 권고 이후 이 명세에 적용되었다:

2017년 9월 5일 후보 권고 이후의 변경 사항

다음 변경 사항은 2017년 9월 5일 후보 권고 이후 이 명세에 적용되었다:

2017년 5월 19일 작업 초안 이후의 변경 사항

다음 변경 사항은 2017년 5월 19일 작업 초안 이후 이 명세에 적용되었다:

Media Queries Level 3 이후의 변경 사항

다음 변경 사항은 2012년 6월 19일 Media Queries Level 3 권고 이후 이 명세에 적용되었다:

감사의 말

이 명세는 W3C 캐스케이딩 스타일 시트 작업 그룹의 산물이다.

다음의 의견 제공자: Amelia Bellamy-Royds, Andreas Lind, Andres Galante, Arve Bersvendsen, Björn Höhrmann, Chris Lilley, Chris Rebert, Christian Biesinger, Christoph Päper, Dean Jackson, Elika J. Etemad (fantasai), Emilio Cobos Álvarez, François Remy, Frédéric Wang, Greg Whitworth, Ian Pouncey, James Craig, Jinfeng Ma, Kivi Shapiro, L. David Baron, Masataka Yakura, Melinda Grant, Michael[tm] Smith, Nicholas C. Zakas Patrick H. Lauke, Philipp Hoschka, Rick Byers, Rijk van Geijtenbeek, Roger Gimson, Sam Sneddon, Sigurd Lerstad, Simon Kissane, Simon Pieters, Steven Pemberton, Susan Lesch, Tantek Çelik, Thomas Wisniewski, Vi Nguyen, Xidorn Quan, Yves Lafon, 그리고 張俊芝 는 이 명세를 개선했다.

보안 고려 사항

이 명세에 대해 새로운 보안 고려 사항은 보고되지 않았다.

프라이버시 고려 사항

Media Queries는 CSS가 페이지 환경의 다양한 측면을 쿼리할 수 있게 해주며, 여기에는 스크립팅으로는 찾기 어렵거나 불가능한 것들도 포함된다. 이는 잠재적으로 프라이버시 위험이 될 수 있으며, 사용자의 지문(fingerprint) 식별을 강화할 수 있지만, 일반적으로 그 위험은 낮다. 최소한 동일한 정보는 사용자 에이전트 문자열을 검사하는 스크립팅을 통해 추론 가능해야 한다. 그러나 UA 문자열 스푸핑은 Media Queries에 영향을 주지 않으므로, 이는 다소 더 견고한 탐지 기법이 된다.

그렇다 하더라도, Media Queries가 제공하는 정보는 상대적으로 거칠며, 이 측면에서 엔트로피에 크게 기여하지 않는다.

몇몇 레거시 미디어 기능(device-width, device-height, 및 device-aspect-ratio)은 UA가 실행되는 환경에 대한 정보를 명확한 이점 없이 노출한다. 이들은 호환성 이유로 유지되지만, 프라이버시 및 보안을 위해 UA는 부정확한 정보를 보고하도록 허용되었다.

TAG는 편집자 및 작업 그룹이 그들의 명세로 인해 도입되는 위험을 평가하는 데 도움이 되도록 자체 검토 설문지를 개발했다. 답변은 아래에 제공된다.

이 명세는 개인 식별 정보를 다루는가?
아니오.
이 명세는 고가치 데이터를 다루는가?
아니오.
이 명세는 브라우저 세션 전반에 걸쳐 지속되는, 오리진의 새로운 상태를 도입하는가?
아니오.
이 명세는 지속적이며 교차 오리진 상태를 웹에 노출하는가?
아니오.
이 명세는 어떤 오리진이 현재 접근할 수 없는 다른 데이터를 그 오리진에 노출하는가?
아니오.
이 명세는 새로운 스크립트 실행/로딩 메커니즘을 가능하게 하는가?
아니오.
이 명세는 오리진이 사용자의 위치에 접근하도록 허용하는가?
아니오.
이 명세는 오리진이 사용자의 장치 센서에 접근하도록 허용하는가?
아니오.
이 명세는 오리진이 사용자의 로컬 컴퓨팅 환경의 측면에 접근하도록 허용하는가?
예, 위 설문지 앞의 설명문에 기술된 바와 같다.
이 명세는 오리진이 다른 장치에 접근하도록 허용하는가?
아니오.
이 명세는 오리진이 사용자 에이전트의 네이티브 UI에 대해 어느 정도 제어할 수 있게 하는가?
아니오.
이 명세는 웹에 임시 식별자를 노출하는가?
아니오.
이 명세는 퍼스트 파티 및 서드 파티 컨텍스트에서의 동작을 구분하는가?
아니오.
이 명세는 사용자 에이전트의 "시크릿(incognito)" 모드 컨텍스트에서 어떻게 동작해야 하는가?
동작에서 차이가 필요 없다.
이 명세는 사용자의 로컬 장치에 데이터를 지속 저장하는가?
아니오.
이 명세에는 "보안 고려 사항" 및 "프라이버시 고려 사항" 절이 있는가?
예, 당신이 현재 읽고 있는 이 절이다.
이 명세는 기본 보안 특성의 다운그레이드를 허용하는가?
아니오.

준수

문서 관례

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

이 명세의 모든 텍스트는 규범적이며, 명시적으로 비-규범적이라고 표시된 절, 예제, 및 주석은 예외이다. [RFC2119]

이 명세의 예제는 “for example”이라는 단어로 소개되거나 class="example"로 규범적 텍스트와 구분되어 다음과 같이 표시된다:

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

정보 제공용 주석은 “Note”라는 단어로 시작하며 class="note"로 규범적 텍스트와 구분되어 다음과 같이 표시된다:

Note, 이것은 정보 제공용 주석이다.

권고문은 특별한 주의를 환기하도록 스타일링된 규범적 절이며 <strong class="advisement">로 다른 규범적 텍스트와 구분되어 다음과 같이 표시된다: UAs MUST 접근 가능한 대안을 제공해야 한다.

테스트

이 명세의 콘텐츠와 관련된 테스트는 이와 같은 “Tests” 블록에 문서화될 수 있다. 이러한 블록은 비-규범적이다.


준수 등급

이 명세에 대한 준수는 다음 세 가지 준수 등급에 대해 정의된다:

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

스타일 시트는 이 모듈에서 정의된 구문을 사용하는 모든 진술이 일반 CSS 문법과 이 모듈에서 정의된 각 기능의 개별 문법에 따라 유효하다면, 이 명세에 준수한다.

렌더러는 이 명세에 준수하는데, 관련 명세에 의해 정의된 대로 스타일 시트를 해석하는 것에 더해, 이 명세에 의해 정의된 모든 기능을 올바르게 파싱하고 그에 따라 문서를 렌더링함으로써 지원해야 한다. 그러나 장치의 한계로 인해 UA가 문서를 올바르게 렌더링할 수 없는 것은 UA를 비-준수로 만들지는 않는다. (예를 들어, UA는 단색 모니터에서 색을 렌더링할 필요는 없다.)

저작 도구는 이 명세에 준수하는데, 일반 CSS 문법과 이 모듈의 각 기능에 대한 개별 문법에 따라 문법적으로 올바른 스타일 시트를 작성하고, 이 모듈에 기술된 바와 같이 스타일 시트의 다른 모든 준수 요구사항도 충족해야 한다.

부분 구현

작성자가 전방 호환 파싱 규칙을 활용하여 대체 값을 할당할 수 있도록, CSS 렌더러는 반드시 유효하지 않은 것으로 취급하고(그리고 적절하게 무시해야 하며) 자신들이 사용할 수 있는 수준의 지원이 없는 모든 at-규칙, 속성, 속성 값, 키워드, 및 기타 구문 구성 요소를 그렇게 해야 한다. 특히, 사용자 에이전트는 절대로 단일 다중-값 속성 선언에서 지원되지 않는 구성 요소 값은 선택적으로 무시하고 지원되는 값은 존중해서는 안 된다: 어떤 값이 유효하지 않은 것으로 간주된다면 (지원되지 않는 값은 반드시 그렇게 간주되어야 하므로), CSS는 전체 선언이 무시되도록 요구한다.

불안정 및 독점 기능의 구현

향후 안정적인 CSS 기능과의 충돌을 피하기 위해, CSSWG는 모범 사례를 따를 것불안정 기능과 독점 확장의 CSS 구현에 대해 권고한다.

비-실험적 구현

명세가 후보 권고(Candidate Recommendation) 단계에 도달하면, 비-실험적 구현이 가능해지며, 구현자는 명세에 따라 올바르게 구현되었음을 입증할 수 있는 어떤 CR-레벨 기능에 대해서든 접두사 없는 구현을 릴리스해야 한다.

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

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

CR 종료 기준

이 명세가 제안 권고(Proposed Recommendation)로 진전하기 위해서는, 각 기능에 대해 최소 두 개의 독립적이고 상호운용 가능한 구현이 있어야 한다. 각 기능은 서로 다른 제품 집합에 의해 구현될 수 있으며, 모든 기능이 단일 제품에 의해 구현되어야 한다는 요구사항은 없다. 이 기준의 목적을 위해, 우리는 다음 용어를 정의한다:

독립적
각 구현은 서로 다른 당사자에 의해 개발되어야 하며, 다른 적격 구현이 사용한 코드를 공유, 재사용, 또는 파생할 수 없다. 이 명세의 구현과 무관한 코드 구간은 이 요구사항에서 면제된다.
상호운용 가능
공식 CSS 테스트 스위트의 해당 테스트 케이스를 통과하거나, 구현이 웹 브라우저가 아닌 경우 동등한 테스트를 통과하는 것. 이러한 사용자 에이전트(UA)를 상호운용성 주장에 사용하려면, 테스트 스위트의 모든 관련 테스트에 대해 동등한 테스트가 생성되어야 한다. 또한 이러한 UA가 상호운용성 주장에 사용되려면, 상호운용성 목적을 위해 같은 방식으로 그 동등한 테스트를 통과할 수 있는 추가 UA가 하나 이상 있어야 한다. 동등한 테스트는 동료 검토 목적을 위해 공개적으로 이용 가능해야 한다.
구현
다음을 만족하는 사용자 에이전트:
  1. 명세를 구현한다.
  2. 일반 대중에게 제공된다. 구현은 판매/배포 제품 또는 기타 공개적으로 이용 가능한 버전일 수 있다 (즉, 베타 버전, 프리뷰 릴리스, 또는 "nightly build"). 미출시 제품 릴리스는 안정성을 입증하기 위해 최소 한 달 동안 기능을 구현해 왔어야 한다.
  3. 실험적이지 않다 (즉, 테스트 스위트를 통과하기 위해 특별히 설계되었고, 향후 일반 사용을 의도하지 않는 버전이 아니다).

이 명세는 최소 6개월 동안 후보 권고(Candidate Recommendation)로 유지된다.

색인

이 명세에서 정의한 용어

참조로 정의된 용어

참고 문헌

규범적 참고 문헌

[COLORIMETRY]
Colorimetry, Fourth Edition. CIE 015:2018. 2018. URL: http://www.cie.co.at/publications/colorimetry-4th-edition
[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-CONDITIONAL-3]
Chris Lilley; David Baron; Elika Etemad. CSS Conditional Rules Module Level 3. 15 August 2024. CRD. URL: https://www.w3.org/TR/css-conditional-3/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS Syntax Module Level 3. 24 December 2021. CRD. URL: https://www.w3.org/TR/css-syntax-3/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 22 March 2024. CRD. URL: https://www.w3.org/TR/css-values-3/
[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/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 4. 30 July 2019. CR. URL: https://www.w3.org/TR/css-writing-modes-4/
[CSS2]
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/CSS2/
[CSSOM-VIEW-1]
Simon Fraser; Emilio Cobos Álvarez. CSSOM View Module. 16 September 2025. WD. URL: https://www.w3.org/TR/cssom-view-1/
[MEDIAQUERIES-3]
Florian Rivoal. Media Queries Level 3. 21 May 2024. REC. URL: https://www.w3.org/TR/mediaqueries-3/
[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

정보 제공용 참고 문헌

[CSS-FONTS-4]
Chris Lilley. CSS Fonts Module Level 4. 1 February 2024. WD. URL: https://www.w3.org/TR/css-fonts-4/
[Display-P3]
A; et al. Display P3. 2022-02. URL: https://www.color.org/chardata/rgb/DisplayP3.xalter
[HTML401]
Dave Raggett; Arnaud Le Hors; Ian Jacobs. HTML 4.01 Specification. 27 March 2018. REC. URL: https://www.w3.org/TR/html401/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[ITU-R-BT-2020-2]
Parameter values for ultra-high definition television systems for production and international programme exchange. October 2015. URL: https://www.itu.int/rec/R-REC-BT.2020/en
[RFC2879]
G. Klyne; L. McIntyre. Content Feature Schema for Internet Fax (V2). August 2000. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc2879
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. Selectors Level 4. 22 January 2026. WD. URL: https://www.w3.org/TR/selectors-4/
[SRGB]
Multimedia systems and equipment - Colour measurement and management - Part 2-1: Colour management - Default RGB colour space - sRGB. URL: https://webstore.iec.ch/publication/6169
[XML-STYLESHEET]
James Clark; Simon Pieters; Henry Thompson. Associating Style Sheets with XML documents 1.0 (Second Edition). 28 October 2010. REC. URL: https://www.w3.org/TR/xml-stylesheet/

속성 색인

정의된 속성이 없다.

@media 서술자

이름 초기값 유형
any-hover none | hover 불연속
any-pointer none | coarse | fine 불연속
aspect-ratio <ratio> 범위
color <integer> 범위
color-gamut srgb | p3 | rec2020 불연속
color-index <integer> 범위
device-aspect-ratio <ratio> 범위
device-height <length> 범위
device-width <length> 범위
grid <mq-boolean> 불연속
height <length> 범위
hover none | hover 불연속
monochrome <integer> 범위
orientation portrait | landscape 불연속
overflow-block none | scroll | paged 불연속
overflow-inline none | scroll 불연속
pointer none | coarse | fine 불연속
resolution <resolution> | infinite 범위
scan interlace | progressive 불연속
update none | slow | fast 불연속
width <length> 범위