メディアクエリ レベル4

W3C 候補勧告ドラフト

この文書の詳細情報
このバージョン:
https://www.w3.org/TR/2021/CRD-mediaqueries-4-20211225/
最新公開バージョン:
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)
(Disruptive Innovations)
(Mozilla)
この仕様の編集提案:
GitHub エディター

概要

メディアクエリは、ドキュメントの描画とは独立して、ユーザーエージェントや表示デバイスの値や機能をテスト・取得することを著者に可能にします。これらは CSS の @media ルール内で、ドキュメントに条件付きでスタイルを適用するためや、HTML や JavaScript などの様々な文脈や言語で使用されます。

メディアクエリ レベル4では、メディアクエリ、メディアタイプ、メディア機能の仕組みと構文について説明します。これは、メディアクエリ レベル3で定義された機能を拡張し、置き換えます。

CSSは、構造化されたドキュメント(HTML や XML など)の描画方法を画面、印刷などで記述するための言語です。

この文書のステータス

このセクションは、発行時点でのこの文書のステータスについて説明します。 最新のW3C公開文書や この技術レポートの最新の改訂版は W3C技術レポートインデックス(https://www.w3.org/TR/) で確認できます。

この文書は CSSワーキンググループ によって 候補勧告ドラフト として 勧告トラック を用いて公開されました。 候補勧告ドラフトとしての公開は、 W3Cおよびその会員による承認を意味するものではありません。 候補勧告ドラフトには、 ワーキンググループが次の候補勧告スナップショットに含める予定の 以前の候補勧告からの変更点が統合されています。

この文書はドラフトであり、 今後更新、置換、 または他の文書によって廃止される可能性があります。 作業途中の文書以外として引用することは適切ではありません。

ご意見は GitHubでイシューを提出(推奨)することでお送りください。 タイトルに仕様コード“mediaqueries”を含めてください(例: “[mediaqueries] …コメントの概要…”)。 すべてのイシューとコメントはアーカイブされています。 または、(アーカイブあり) 公開メーリングリスト www-style@w3.org へフィードバックを送ることも可能です。

この文書は 2021年11月2日W3Cプロセス文書に従って管理されています。

この文書はW3C特許ポリシーの下で運営されているグループによって作成されました。 W3Cはグループ成果物に関連して提出された特許開示の公開リストを管理しています。 このページには特許開示方法の説明も含まれています。 ある個人が特許について実際に知っていて、その個人が 必須クレームを含むと考える場合は W3C特許ポリシー第6節に従って情報開示しなければなりません。

現時点では暫定的な相互運用性または実装レポートはありません。

以下の機能はリスクありとされており、CR期間中に削除される可能性があります:

“リスクあり”はW3Cプロセスにおける専門用語であり、必ずしもその機能が削除や遅延の危険にさらされていることを意味しません。ワーキンググループが、その機能が適時に相互運用可能な実装に困難が生じる可能性があると考えていることを示し、プロポーズド勧告段階に移行する際に必要に応じてその機能を削除できるようにするものです(その機能を除いた新しい候補勧告を公開せずに済みます)。

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. メディアクエリ

メディアクエリは、 ドキュメントが表示されているユーザーエージェントやデバイスの特定の側面をテストする方法です。 メディアクエリは(ほぼ)常にドキュメントの内容、 スタイリング、その他の内部的な要素とは独立しており、 「外部」の情報のみに依存します(他の機能が明示的にメディアクエリの解決に影響すると指定されている場合を除く)。

メディアクエリの構文は、 オプションのメディアクエリ修飾子、 オプションのメディアタイプ、 そして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. メディアクエリの組み合わせ

複数のメディアクエリをコンマ区切りで組み合わせて、メディアクエリリストを作成できます。

メディアクエリリストは、構成するメディアクエリのいずれかが真なら真となり、すべてが偽の場合のみ偽となります。

例えば、次のメディアクエリリストは、 メディアタイプscreenでカラー端末の場合、または メディアタイプprojectionでカラー端末の場合に真となります:
@media screen and (color), projection and (color) { … }

空のメディアクエリリストは真と評価されます。

例えば、これらは同等です:
@media all { … }
@media { … }

2.2. メディアクエリ修飾子

メディアクエリは、1つのメディアクエリ修飾子を前置できます。これは、後続のメディアクエリの意味を変更するキーワードです。

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 メディアタイプに一致しますが、only修飾子によって除外されます。
<link rel="stylesheet" media="only screen and (color)" href="example.css" />

注: onlyキーワードはメディアタイプの前にのみ使用できます。 メディア機能のみのメディアクエリや、not修飾子付きのものは、古いユーザーエージェントでは自動的に偽と見なされます。

注: この仕様の公開時点では、このような古いユーザーエージェントは非常に稀であり、only修飾子を使う必要はほとんどありません。

2.3. メディアタイプ

メディアタイプは、ドキュメントが表示されるユーザーエージェント端末の大まかなカテゴリです。 元のメディアタイプはHTML4で定義され、media属性として<link>要素に使用されました。

しかし、メディアタイプは端末ごとのスタイリングの違いを表現するには不十分であることが判明しています。 例えば、screenhandheldのような区分は、年月とともに大きく重複するようになっています。 ttytvなどは、通常のPCモニタとは異なる有用な違いを持っているため、異なるスタイリング対象にする価値がありますが、 メディアタイプの排他性の定義があるため、実用的な使い方が難しくなっています。 そのため、こうした特徴はメディア機能(例:gridscan)で表現する方が適しています。

そのため、以下のメディアタイプメディアクエリで使用できます:

all
すべての端末に一致します。
print
プリンターや、印刷プレビュー表示するウェブブラウザなど、印刷表示を再現する端末に一致します。
screen
print以外のすべての端末に一致します。

加えて、以下の非推奨メディアタイプが定義されています。 著者はこれらのメディアタイプを使用するべきではありません。 端末の特徴をより適切に表現できるメディア機能を選択することを推奨します。

ユーザーエージェントは以下のメディアタイプを有効として認識しなければなりませんが、何にも一致させてはいけません。

注: 今後、すべてのメディアタイプが非推奨になることが予想されます。重要な違いを捉える適切なメディア機能が定義されるためです。

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などのように、値が範囲から選ばれます。 任意の2つの値を比較して、どちらが小さいか、どちらが大きいかを判断できます。

両者の主な違いは、「range」メディア機能範囲型コンテキストで評価でき、名前に「min-」「max-」のプレフィックスを付けることができる点です。 これらのいずれかを行うことで、機能の意味が変わります。つまり、メディア機能が指定値と完全一致する場合に真となるのではなく、指定値以上/以下/等しい場合に真となります。

「(width >= 600px)」メディア機能は、 ビューポートの幅が600px以上のときに真になります。

一方、(width: 600px)は、ビューポートの幅が600px正確に一致する場合のみ真です。 それより小さい・大きい場合は偽になります。

2.4.2. メディア機能のブール型コンテキストでの評価

メディア機能は通常、CSSプロパティに似た構文を持ちますが、機能名のみで簡素に記述することもできます。例:(color)

このように記述した場合、メディア機能ブール型コンテキストで評価されます。 機能が0または値が0<dimension>、あるいはキーワードnone以外なら真となります。 それ以外は偽になります。

一部のメディア機能はこのように記述することを想定しています。

例えば、update(update)と書いて何らかの更新が利用可能かを判定したり、not (update)で反対を調べたりします。

値を明示的に与えることもでき、(update: fast)(update: slow)(update)と同じ意味ですし、(update: none)not (update)と同じです。

数値型のメディア機能widthなど)は、ブール型コンテキストで評価してもほぼ常にゼロ以上なので、実用的な意味はほぼありません。 一方、colorのように、ゼロ値に意味があるものもあり、(color)(color > 0)と同義です。これは端末が色表示可能かを示します。
キーワードを受理できるメディア機能のうち、ブール型コンテキストで意味を持つものは一部のみです。

例えば(pointer)は有用です。pointerには、端末にポインティングデバイスがないことを示すnone値があります。 一方、(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より大きければ真です。

残りの形は、機能名を2つの値比較の間に挟み、両方の比較が真なら真となります。

例:(400px < width < 1000px)は、ビューポート幅が400px超かつ1000px未満(いずれとも等しくない)なら真です。

「range」型メディア機能の中には負の範囲でfalseとされるものがあります。 これは、負値が有効でパースされるべきであり、メディア機能がその負値と等しい・未満・以下であるかを判定する場合は必ず偽になることを意味します。 一方、負値より大きい・以上かの判定は、関係が成立すれば真です。

注: もし負値がパース時に却下されていた場合、エラー処理規則によりunknown扱いとなります。 しかし実際には、端末のresolution-300dpiなのは「不明」ではなく、偽であることが分かっています。 同様に、可視端末なら表示領域の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]と比較して変更されています。 レベル3では、これらのプロパティに負値を使うと構文エラーとなり、構文エラー(禁止値も含む)はメディアクエリ全体が偽になります。 本レベルで定義されたunknown扱いとは異なります。 レベル3からアップデートする実装は、§ 2.5 メディア機能の組み合わせで定義されるより豊かな構文に対応する際、負値の扱いも変更するよう注意してください。意図しない意味付けが入り込まないようにしてください。

2.4.4. 範囲型機能への「min-」・「max-」プレフィックスの利用

上記のような範囲型メディア機能を範囲型コンテキストで評価する代わりに、 「min-」または「max-」プレフィックスを機能名に付けて、通常のメディア機能として記述できます。

これは、以下のように範囲型コンテキストで評価するのと同等です:

注: 「min-」「max-」はいずれも値を含む範囲比較なので、状況によっては制限となる場合があります。

例えば、 ビューポート幅のブレークポイントで異なるスタイルを定義しようとする際、「min-」「max-」を使う場合、 両方のクエリが同時に真にならないよう比較値をずらすのが一般的です。 ブレークポイントが320pxの場合、著者は次のように概念的に記述します:
@media (max-width: 320px) { /* ビューポート幅が320px以下のスタイル */ }
@media (min-width: 321px) { /* ビューポート幅が321px以上のスタイル */ }

これにより、ビューポート幅が320pxの時に両方のスタイルが同時適用されないことが保証されますが、 ピクセル密度が整数でない高dpi端末やズーム・拡大時などで 320pxと321pxの間の分数値に対応できないため、どちらのスタイルも適用されない場合があります。

この問題の回避策として、比較値の精度を高める方法があります。上記の例では、 2つ目の比較値を320.01pxに変更することで、端末のビューポート幅が隙間に入る可能性を大幅に減らせます。

@media (max-width: 320px) { /* ビューポート幅が320px以下のスタイル */ }
@media (min-width: 320.01px) { /* ビューポート幅が320.01px以上のスタイル */ }

ただし、このような場合は「>=」「<=」以外の比較も可能な範囲型コンテキストクエリを使う方が適切です:

@media (width <= 320px) { /* ビューポート幅が320px以下のスタイル */ }
@media (width > 320px) { /* ビューポート幅が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)のように記述してください。 この2つは意味が異なり、(hover)だけ真なら 前者は偽、後者は真となります。

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>生成規則には、キーワードonlynotandorは含まれません。

「<」「>」<delim-token>の後ろに「=」<delim-token>が続く場合、間に空白は許されません。

注: notandorキーワードと、後続の(の間には空白が必要です。 空白がないと<function-token>としてパースされてしまいます。 この点は上記文法で既にカバーされているため明示的に無効とされていません。 一方、)と後続キーワードの間には空白があっても問題ありません。

<media-in-parens>生成規則のパース時は、 <general-enclosed>分岐は、入力が前の分岐どちらにも一致しない場合のみ選択してください。<general-enclosed>は将来の文法拡張のために存在します。

3.1. メディアクエリの評価

<media-condition><media-condition-without-or>の各主要部分式は、以下のようにブール値と対応します:

<media-condition>
<media-condition-without-or>
子部分式の結果をそのまま返します。
<media-in-parens>
子項の結果を返します。
<media-not>
<media-in-parens>項の否定結果。 unknownの否定はunknownです。
<media-in-parens><media-and>*
<media-in-parens>子項と、<media-in-parens>すべてが真なら真、いずれかが偽なら偽、それ以外はunknownです。
<media-in-parens><media-or>*
<media-in-parens>子項と、<media-in-parens>すべてが偽なら偽、いずれかが真なら真、それ以外はunknownです。
<general-enclosed>
結果はunknownです。

著者は<general-enclosed>をスタイルシートで使用してはいけません。これは将来互換性のためだけに存在します。新しい構文追加によって既存の<media-condition>の多くが古いUAで無効にならないよう配慮されています。

<media-feature>
指定されたメディア機能の評価結果です。

上記のいずれかの生成規則の結果が2値ブールが期待されるコンテキストで使われる場合、「unknown」は「false」に変換されなければなりません。

注: つまり、例えばメディアクエリ@media規則で使われる場合、「unknown」は「false」として扱われ、マッチしません。

メディアクエリは「true」「false」「unknown」の三値論理を使用します。 具体的にはKleene三値論理です。 この論理では「unknown」は「真か偽かまだ確定できない」という意味です。

一般に、式の中にunknown値が現れると、その式もunknownになります。unknownをtrueに置き換えると結果が変わり、falseに置き換えても変わるためです。 唯一unknown値を除去できるのは、unknownがどちらであっても結果が変わらない式に使う場合です。 例えば「false AND unknown」は常にfalse、「true OR unknown」は常にtrueになります。

この論理は<general-enclosed>に真理値を割り当てる必要があるため採用されました。 標準的なブール論理では「false」のみが妥当ですが、これだとnot unknown(function)がtrueになり、混乱や望ましくない挙動を生みます。 Kleene三値論理を使うことで、unknownなものが最終的な結果に関係なければメディアクエリがマッチしなくなります。

3.2. エラー処理

前節の文法に合致しないメディアクエリは、パース時にnot allに置き換えられます。

注: 文法不一致はメディアクエリリスト全体を無効にするものではなく、問題のあるメディアクエリのみです。 上記のパース動作により、次のトップレベルのコンマで自動的に回復されます。

@media (example, all,), speech { /* 音声端末専用 */ }
@media &test, speech           { /* 音声端末専用 */ }

これら両方のメディアクエリリストは、パース時にnot all, speechに変換され、 真理値としてはspeechのみと同じです。

エラー回復はメディアクエリのトップレベルでのみ発生します。 無効な括弧ブロック内の内容はグループとしてnot allに変換されます。 例:

@media (example, speech { /* 音声端末用ルール */ }

括弧ブロックが閉じられていないため、スタイルシートの残り全体(途中で対応しない「)」が現れない限り)が含まれてしまい、 その全体がnot allメディアクエリに変換されます。

未知の<media-type>は一致しないものとして扱われます。

例えば、メディアクエリunknownは偽です。 unknownは未知のメディアタイプだからです。

しかしnot unknownは真になります。notが偽のメディアタイプを否定するためです。

一部キーワードは<media-type>として許可されておらず、パースを完全に失敗させます。 メディアクエリor and (color)は、orを未知のメディアタイプとして扱うのではなく、パース時にnot allに変換されます。

未知の<mf-name><mf-value>、または禁止された<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規則、 つまりメディアクエリはセミコロンで終了します。 以降のテキストは無効なセレクタと内容のスタイルルールとして扱われます。

4. ビューポート・ページ寸法メディア機能

4.1. 幅:width機能

名前: width
対象: @media
値: <length>
型: range

widthメディア機能は、出力デバイスの対象表示領域の幅を示します。 連続メディアの場合は、CSS2セクション9.1.1 [CSS2]で説明されているように、 ビューポートの幅(スクロールバーのサイズを含む)です。 ページメディアの場合は、CSS2セクション13.2 [CSS2]で説明されているようにページボックスの幅です。

<length>の解釈は§ 1.3 単位に従います。

width負の範囲でfalseとなります。

例:このメディアクエリは、25cmより幅の広い印刷出力でスタイルシートが使用されることを示します。
<link rel="stylesheet" media="print and (min-width: 25cm)" href="http://…" />
このメディアクエリは、ビューポート(ドキュメントがレンダリングされる画面や用紙の部分)の幅が400~700pxの端末でスタイルシートが使用されることを示します。
@media (400px <= width <= 700px) { … }
このメディアクエリは、ビューポート幅が20emより大きい場合にスタイルシートが使用されることを示します。
@media (min-width: 20em) { … }

em値はfont-sizeの初期値に対して相対的です。

4.2. 高さ:height機能

名前: height
対象: @media
値: <length>
型: range

heightメディア機能は、出力デバイスの対象表示領域の高さを示します。 連続メディアの場合は、スクロールバーのサイズも含めたビューポートの高さです。 ページメディアの場合は、ページボックスの高さです。

<length>の解釈は§ 1.3 単位に従います。

height負の範囲でfalseとなります。

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メディア機能は負の範囲でfalseとなります。

非正方形ピクセルのメディアを判定する場合、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放送をシミュレートできました。

インターレース画面上では、著者は非常に速い動きを避け、「コーミング」を防ぎ、詳細は1px以上の幅にして「twitter」を防ぐべきです。

progressive
「プログレッシブ」レンダリングの画面は、毎回全画面を描画し、特別な対処は不要です。

現代の画面やすべてのPC画面はプログレッシブレンダリングを採用しています。

例:セリフ体フォントの「足」はインターレース端末で「twitter」を誘発しやすい細かい特徴です。 scanメディア機能で判定し、「twitter」になりにくい代替フォントを使えます:
@media (scan: interlace) { body { font-family: sans-serif; } }

注: 執筆時点では、既知の実装はすべてscan: progressiveに一致し、scan: interlaceには一致しません。

5.3. コンソール表示検出:grid機能

名前: grid
対象: @media
値: <mq-boolean>
型: discrete

gridメディア機能は、出力デバイスがグリッドベースかビットマップかを判定します。 グリッドベースの場合(例:tty端末や固定フォントのみの携帯画面)は値が1、 それ以外は値が0です。

<mq-boolean>値型は、値が0または1<integer>です。 他の整数値は無効です。-0はCSS上常に0と同じ扱いなので、<mq-boolean>値としても有効です。

注: <mq-boolean>型はレガシー目的のみ存在します。 現在この機能を設計するなら、適切な名前付きキーワード型を使っていたでしょう。

例:狭いコンソール画面を検出します:
@media (grid) and (max-width: 15em) { … }

注: 執筆時点では、既知の実装はすべてgrid: 0に一致し、grid: 1には一致しません。

5.4. 表示更新頻度:update機能

名前: update
対象: @media
値: none | slow | fast
型: discrete

updateメディア機能は、出力デバイスがレンダリング後にコンテンツの見た目を変更できる能力を判定するためのものです。 受け付ける値は次の通りです:

none
一度レンダリングされるとレイアウトは更新できません。 例:紙への印刷物。
slow
レイアウトは通常のCSSルールに従って動的に変化できますが、出力デバイスは変更を滑らかなアニメーションのように素早く表示できません。 例:Eインク画面や極端に性能の低いデバイス。
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
ブロック軸でオーバーフローへの配慮がなく、溢れたコンテンツは表示されません。 例:屋外広告
scroll
ブロック軸の溢れたコンテンツは、ユーザーがスクロールして表示できます。 例:コンピュータ画面
paged
コンテンツはページ単位に分割され、ブロック軸で1ページから溢れた分が次ページに表示されます。 例:プリンター、電子書籍リーダー

noneまたはscrollに一致するメディアは連続メディアpagedに一致するメディアはページメディアと呼ばれます。

注: このメディア機能には将来的に、連続メディアとページメディア双方の特徴を持つハイブリッド型UAを表す値が追加される可能性があります。 例えば、Prestoレイアウトエンジン(現在は廃止)は「continuous」に似ていますが強制改ページを尊重する半ページ型表示モードを搭載していました。 現在このようなUAは知られていないため、本レベルでは誤った分類を避けるため値を追加しませんでした。 既存値で十分に表現できないUAを実装する場合は、ワーキンググループに連絡いただければ拡張を検討します。

5.6. インライン軸オーバーフロー:overflow-inline 機能

名前: overflow-inline
対象: @media
値: none | scroll
型: discrete

overflow-inlineメディア機能は、コンテンツがインライン軸で初期包含ブロックから溢れた場合のデバイスの挙動を示します。

none
インライン軸でオーバーフローへの配慮がなく、溢れたコンテンツは表示されません。
scroll
インライン軸の溢れたコンテンツは、ユーザーがスクロールして表示できます。

注: インラインオーバーフローをページとして扱う既知の実装はなく、そもそも概念的にも意味が薄いため、paged値はoverflow-inlineには存在しません。

6. カラーメディア機能

6.1. カラー深度:color機能

名前: color
対象: @media
値: <integer>
型: range

colorメディア機能は、出力デバイスの各カラーコンポーネントあたりのビット数を示します。 デバイスが非カラーの場合、値はゼロです。

color負の範囲でfalseとなります。

例:次の2つのメディアクエリは、すべてのカラー対応デバイスにスタイルシートを適用することを示します。
@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メディア機能は、出力デバイスのカラールックアップテーブルのエントリ数を示します。 デバイスがルックアップテーブルを使わない場合は値はゼロです。

color-index負の範囲でfalseとなります。

例:次の2つの方法で、すべてのカラーインデックス対応デバイスにスタイルシートを適用できます。
@media (color-index) { … }
@media (color-index >= 1) { … }
このメディアクエリは256以上のエントリを持つカラーインデックスデバイスにスタイルシートを適用することを示します:
<?xml-stylesheet media="(min-color-index: 256)"
  href="http://www.example.com/…" ?>

6.3. モノクロ画面:monochrome 機能

名前: monochrome
対象: @media
値: <integer>
型: range

monochromeメディア機能は、モノクロフレームバッファの1ピクセルあたりのビット数を示します。 デバイスがモノクロでない場合、出力デバイス値は0になります。

monochrome負の範囲でfalseとなります。

例:すべてのモノクロデバイスにスタイルシートを適用するには次のように記述します:
@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
型: discrete

color-gamutメディア機能は、UAおよび出力デバイスが対応するおおよその色域を示します。 つまり、UAが指定された空間の色を受け取った場合、出力デバイスがその色を表示できるか、または十分近い色を表示できるかどうかを示します。

注: このクエリは色域を概算で使っています。 第一に、表示ハードウェアには多くの違いがあります。 例えば、デバイスが「Rec. 2020」対応を主張しても、実際にはその全域よりかなり狭い範囲しか表示できない場合があります。 第二に、デバイスごとに異なる色域が非常に多く、すべて列挙するのは大変です。 多くの場合、著者は表示の正確な能力を知る必要はなく、sRGBより良いか、かなり良いかだけ分かれば十分です。 そのため、適切な画像を色プロファイル付きでユーザーに提供できます。

srgb
UAと出力デバイスが、おおよそsRGB色域以上をサポートできます。

注: 圧倒的多数のカラーディスプレイがこのクエリにtrueを返すと予想されます。

p3
UAと出力デバイスがDCI P3色空間以上の色域をおおよそサポートできます。

注: p3色域はsrgb色域より広く、包含します。

rec2020
UAと出力デバイスがITU-R BT.2020色空間以上の色域をおおよそサポートできます。

注: rec2020色域はp3色域より広く、包含します。

下記の表は、各色空間の主色の色度座標(chromaticity coordinates)を示します。定義は[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]、DCI P3は[SMPTE-EG-432-1-2010][SMPTE-RP-431-2-2011]、ITU-R BT.2020は[ITU-R-BT-2020-2]参照。

例:このメディアクエリはディスプレイがDCI P3色域をサポートする場合に適用されます:
@media (color-gamut: p3) {}

注: 出力デバイスの色域が十分広い場合や色域が他の色域の部分集合である場合、複数の値でtrueを返すことがあります。 そのため、この機能は「昇順」で使うのが最適です。(color-gamut: srgb)がtrueの場合にベース値を設定し、(color-gamut: p3)がtrueなら上書き、というようにします。

注: モノクロ表示などsrgb色域すらサポートしない出力デバイスもあります。 それらの判定には、否定のブール型コンテキストでこの機能を使えます:not (color-gamut)

7. インタラクションメディア機能

「インタラクション」メディア機能は、ユーザーがページとどうやりとりするかの様々な側面を反映します。

pointerおよびhoverの組み合わせに一致する端末の典型例:
pointer: none pointer: coarse pointer: fine
hover: none キーボードのみの操作、順次/空間(d-pad)フォーカスナビゲーション スマートフォン、タッチスクリーン 基本的なスタイラスデジタイザ(Cintiq、Wacom等)
hover: hover Nintendo Wiiコントローラー、Kinect マウス、タッチパッド、高度なスタイラスデジタイザ(Surface、Samsung Note、Wacom Intuos Pro等)

pointerhoverは「主」ポインティングデバイスの特性に関係し、 any-pointerany-hoverは利用可能性のあるすべてのポインティングデバイスの特性を判定できます。

注: この仕様はUAが「主」ポインティングデバイスをどう決定すべきかは定義しませんが、 想定されるのは、UAが端末・環境の知識、利用可能なポインティングデバイスの数や種類、どれが一般的/現在使われているかの知識を組み合わせて判断することです。 端末の主入力がポインティングデバイスでないが、補助的であまり使われないポインティングデバイスがある場合、UAは非ポインティングデバイスを主と見なすこともあります(pointer: none)。 また、UAはユーザー環境やUAの操作方式の変化に応じて主デバイスの種類を動的に変更する場合もあります。

注: pointerhoverany-pointerany-hoverは全て、ポインティングデバイスの特性や完全な不在に関するもので、 キーボードなど非ポインティングデバイスの入力の有無は判定できません。 著者は、これらの機能で一致する値にかかわらず、非ポインティング入力が存在する可能性も考慮すべきです。

pointerhoverはページの主なスタイルやインタラクションモード設計に使えますが(主ポインティングデバイスの特性や有無に基づく)、著者はany-pointerany-hoverも利用し、検出された全てのポインティングデバイスの可能性も配慮すべきです。

7.1. ポインティングデバイスの品質:pointer機能

名前: pointer
対象: @media
値: none | coarse | fine
型: discrete

pointerメディア機能は、マウスなどのポインティングデバイスの有無と精度を判定するために使用します。 複数のポインティングデバイスがある場合、 pointerメディア機能はUAによって決定される「主」ポインティングデバイスの特性を反映しなければなりません。 (すべての利用可能なポインティングデバイスの能力を判定するには、any-pointerメディア機能を参照してください。)

none
端末の主な入力手段にポインティングデバイスが含まれていません。
coarse
端末の主な入力手段に精度の低いポインティングデバイスが含まれています。 例:タッチスクリーンやモーションセンサー(XboxのKinectなど)。
fine
端末の主な入力手段に精度の高いポインティングデバイスが含まれています。 例:マウス、タッチパッド、ペン型デジタイザ。

coarsefineはどちらもポインティングデバイスの存在を示しますが、精度が異なります。 ズーム倍率1で複数の小さな隣接ターゲットを正確に選択するのが難しいデバイスはcoarseとみなされます。 ズームレベルの変更はこのメディア機能の値に影響しません。

注: UAがズーム機能を提供したり、補助的なポインティングデバイスの精度が異なる場合、 ユーザーはこのメディア機能の値がcoarseでも正確なクリックが可能な場合があります。 このメディア機能は「ユーザーが絶対に正確なクリックができない」ことを示すものではなく、「正確なクリックがしづらい」ことを示します。 著者はcoarseの場合、正確なクリックに依存しないページ設計を推奨されます。

アクセシビリティの観点から、ポインティングデバイスがfineでも、 UAはこのメディアクエリにcoarsenoneを返す場合があります。 これはユーザーがポインティングデバイスの操作が困難であることを示します。 また、主なポインティングデバイスが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
型: discrete

hoverメディア機能は、主ポインティングデバイスでページ上の要素をホバーできるかを判定します。 複数のポインティングデバイスがある場合、 hoverメディア機能はUAによって決定される「主」ポインティングデバイスの特性を反映しなければなりません。 (すべての利用可能なポインティングデバイスの能力を判定するには、any-hoverメディア機能を参照してください。)

none
主ポインティングデバイスがホバーできない、またはポインティングデバイスがないことを示します。 例:タッチスクリーン、基本的なペン型デバイス。

ホバーできるが操作が不便で通常の使い方ではない場合もこの値に一致します。 例:タッチスクリーンで長押しがホバー扱いになる場合はhover: noneに一致します。

hover
主ポインティングデバイスでページ上の部位を簡単にホバーできることを示します。 例:マウス、物理的に画面を指すデバイス(Nintendo Wiiコントローラーなど)。
例:マウスも使えるタッチスクリーン端末の場合、 hover メディア機能hover: noneに一致します。 主ポインティングデバイス(タッチスクリーン)がホバーできないためです。

ただし、オプションのマウスではホバー可能なので、 著者は「:hover」疑似クラスが「hover:none」端末でも絶対に一致しないと決めつけず、 ホバーに依存しないレイアウト設計を心がけてください。

アクセシビリティの観点から、ホバーが可能な端末でも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-pointerおよびany-hover機能

名前: any-pointer
対象: @media
値: none | coarse | fine
型: discrete
名前: any-hover
対象: @media
値: none | hover
型: discrete

any-pointerおよびany-hoverメディア機能は、pointerhoverと同じですが、ユーザーが利用可能なすべてのポインティングデバイスの能力の和(ユニオン)に対応します。 any-pointerの場合、異なる特性のデバイスがあれば複数値が一致します。

any-pointerany-hoverは、すべてのポインティングデバイスが対応するクエリでnoneに一致する場合、またはポインティングデバイスがまったくない場合のみnoneに一致しなければなりません。

any-pointerはポインティングデバイスの有無と精度を判定するために使います。 追加の非ポインティングデバイス入力は考慮されず、画面上のポインターを動かさないd-padやキーボード専用操作など他の入力手段の有無は判定できません。 'any-pointer:none'はポインティングデバイスが一切存在しない場合だけtrueになります。
伝統的なデスクトップ環境でマウスとキーボードがある場合、 'any-pointer:none'はマウスがあるためfalseになります。 非ポインター入力(キーボード)があっても同様です。
'any-hover:none'は、ポインティングデバイスが存在しない場合、またはすべてのポインティングデバイスがホバー機能を持たない場合のみtrueになります。 したがって、これはホバー可能なポインティングデバイスが存在するかどうかを判定するクエリとして理解すべきです。 すべてのデバイスがホバー不可かどうかは現状この機能や他のインタラクションメディア機能では判定できません。 また、d-padやキーボード専用操作などの非ポインティングデバイス入力も考慮されません。
タッチ対応ノートPCでマウスとタッチスクリーンがある場合、 'any-hover:none'はホバー可能なマウスがあるためfalseになります。 ホバー不可のポインティングデバイス(タッチスクリーン)があっても同様です。 異なるホバー能力を持つデバイスごとに異なるスタイルを出し分けることは現状できません。
ホバーや正確なポインティングに依存したページを、any-hoverany-pointerが少なくとも一つの入力機構にその能力があるという理由だけで設計すると、ユーザー体験が悪くなります。 ただし、著者は追加のポインティングデバイスが利用可能な場合に、スタイルや機能を調整する参考情報として使うことはできます。
多くのスマートTVには画面上のカーソル操作機能がありますが、多くの場合操作が難しい簡易なコントローラーです。

そのようなスマートTVのブラウザでは、coarsepointerany-pointer両方の値となり、著者は大きく押しやすいクリックターゲットを用意できます。

ユーザーがBluetoothマウスをTVとペアリングして便利に使うこともありますが、これはTVの主な操作方法ではありません。pointerは依然としてcoarseですが、any-pointercoarsefineの両方に一致します。

(any-pointer: fine)がtrueだからといって小さいクリックターゲットに切り替えるのは不適切です。 ユーザーの期待に反し、TVの主な操作方法でないマウスが使いにくい・そもそも手元にない、という不便を招きます。

逆に、同じTVでのスクロールを考えてみてください。 正確なポインティングデバイスがなければスクロールバー操作は困難です。 (pointer: coarse)がtrueなら代替手段を用意しつつ、 (any-pointer: fine)がtrueなら追加でスクロールバーも表示したり、 falseなら視覚的なノイズ低減のため完全に非表示にする、といった設計も可能です。

付録A: 非推奨メディア機能

以下のメディア機能非推奨です。 後方互換性のために残されていますが、新しく記述するスタイルシートには適していません。著者はこれらを使用しないでください。ユーザーエージェントは規定通りサポートしなければなりません。

ビューポート(またはページメディアの場合はページボックス)のサイズを判定するには、widthheightaspect-ratio メディア機能を使用すべきです。 device-widthdevice-heightdevice-aspect-ratioは、ドキュメントのレイアウトに使える領域とは関係なく、デバイスの物理サイズを指します。 device-* メディア機能はモバイルデバイス検出の代理として使われることもありますが、代わりにスタイリング対象のデバイスの特徴をより適切に表すメディア機能を使うべきです。

device-width

名前: device-width
対象: @media
値: <length>
型: range

device-widthメディア機能は出力デバイスのレンダリングサーフェスの幅を示します。 連続メディアの場合はWeb公開画面領域の幅です。 ページメディアの場合はページシートサイズの幅です。

device-width負の範囲でfalseです。

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

上記の例では、スタイルシートは800px未満の画面にのみ適用されます。 px単位は論理単位であり、単位セクションで説明されています。

注: デバイスが縦横切替できる場合、例えばポートレートとランドスケープ、 device-*メディア機能は現在の向きを反映します。

device-height

名前: device-height
対象: @media
値: <length>
型: range

device-heightメディア機能は出力デバイスのレンダリングサーフェスの高さを示します。 連続メディアの場合はWeb公開画面領域の高さです。 ページメディアの場合はページシートサイズの高さです。

device-height負の範囲でfalseです。

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

上記の例では、スタイルシートは600pxより高い画面にのみ適用されます。 px単位の定義はCSSの他の部分と同じです。

device-aspect-ratio

名前: device-aspect-ratio
対象: @media
値: <ratio>
型: range

'device-aspect-ratio'メディア機能は、device-widthメディア機能の値と'device-height'メディア機能の値の比率として定義されています。

例:スクリーンデバイスが正方形ピクセルで1280px(水平)・720px(垂直)の場合(一般に「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) { … }

変更履歴

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、 そして張俊芝 のコメントによってこの仕様が改善されました。

8. プライバシーとセキュリティの考慮事項

この仕様は新たなセキュリティ考慮事項を導入しません。

メディアクエリはCSSがページ環境の様々な側面を問い合わせることを可能にします。 これはスクリプトでは困難または不可能な情報も含みます。 これは潜在的にプライバシーのリスクとなり、ユーザーのフィンガープリンティングが強化される可能性がありますが、リスクは一般的に低いです。 最低限、同じ情報はユーザーエージェント文字列を調べることでスクリプトから推定可能でなければなりません。 ただし、UA文字列の偽装はメディアクエリには影響しないため、検出手法としてやや強力です。

とはいえ、メディアクエリで得られる情報は比較的粗く、この観点でのエントロピーへの寄与は小さいです。

以下のレガシーメディア機能(device-widthdevice-heightdevice-aspect-ratio)は、 UAの実行環境に関する情報を明確なメリットなく露出します。 これらは互換性維持のために残されていますが、プライバシーやセキュリティの観点から、UAは不正確な情報を返しても許容されています。

TAGは、編集者や作業グループが仕様によるリスクを評価するための自己レビュー質問票を作成しました。 回答は以下です。

この仕様は個人識別情報を扱いますか?
いいえ。
この仕様は高価値データを扱いますか?
いいえ。
この仕様はoriginの新しい状態をブラウジングセッションをまたいで保持しますか?
いいえ。
この仕様はウェブへ持続的なクロスオリジン状態を露出しますか?
いいえ。
この仕様は現在originがアクセスできない他のデータを露出しますか?
いいえ。
この仕様は新しいスクリプト実行/ロード機構を可能にしますか?
いいえ。
この仕様はoriginにユーザーの位置情報へのアクセスを許可しますか?
いいえ。
この仕様はoriginにユーザー端末のセンサーへのアクセスを許可しますか?
いいえ。
この仕様はoriginにユーザーのローカル計算環境の側面へのアクセスを許可しますか?
はい、上記本文で説明した通りです。
この仕様はoriginに他デバイスへのアクセスを許可しますか?
いいえ。
この仕様はoriginにユーザーエージェントのネイティブUIを制御する権限を与えますか?
いいえ。
この仕様はウェブへ一時的な識別子を露出しますか?
いいえ。
この仕様はファーストパーティ/サードパーティ文脈の挙動を区別しますか?
いいえ。
この仕様はユーザーエージェントの「シークレットモード」文脈でどのように動作すべきですか?
挙動の変更は不要です。
この仕様はユーザーのローカル端末にデータを永続化しますか?
いいえ。
この仕様には「セキュリティの考慮事項」および「プライバシーの考慮事項」セクションがありますか?
はい、このセクションが該当します。
この仕様はデフォルトのセキュリティ特性をダウングレードすることを許可しますか?
いいえ。

適合性

文書の慣例

適合性の要件は、記述的な断定とRFC 2119の用語の組み合わせで表現されています。規定部分における「MUST」、「MUST NOT」、「REQUIRED」、「SHALL」、「SHALL NOT」、「SHOULD」、「SHOULD NOT」、「RECOMMENDED」、「MAY」、「OPTIONAL」というキーワードは、RFC 2119で定義された通りに解釈されます。 ただし、読みやすさのため、この仕様ではこれらの単語はすべて大文字ではありません。

この仕様の本文は、明示的に非規定と記載されているセクション、例、および注記を除き、すべて規定です。[RFC2119]

この仕様の例は「例えば」という言葉で始まるか、class="example"で規定文から区別されて示されます。例:

これは情報提供的な例です。

情報提供的な注記は「Note」で始まり、class="note"で規定文から区別されます。例:

Note, これは情報提供的な注記です。

勧告は特別な注意を促すためにスタイルされ、他の規定文と区別するために<strong class="advisement">で示されます。例:UAはアクセシブルな代替手段を提供しなければなりません。

適合性クラス

この仕様への適合性は、以下の3つの適合性クラスに定義されています:

style sheet
CSSスタイルシート
renderer
UAで、スタイルシートの意味を解釈し、それを用いたドキュメントをレンダリングします。
authoring tool
UAで、スタイルシートを作成します。

スタイルシートが本仕様に適合するには、このモジュールで定義された構文を用いるすべての文が、汎用CSS文法および各機能固有の文法に従い有効でなければなりません。

レンダラーが本仕様に適合するには、スタイルシートを適切な仕様通りに解釈することに加え、本仕様で定義されたすべての機能を正しくパースし、ドキュメントを適切にレンダリングできる必要があります。ただし、デバイスの制限によりUAがドキュメントを正しくレンダリングできない場合でも、UAが不適合とみなされることはありません。(例:UAはモノクロモニターで色をレンダリングする必要はありません。)

オーサリングツールが本仕様に適合するには、汎用CSS文法およびこのモジュール内の各機能固有の文法に従って構文的に正しいスタイルシートを書き、またこのモジュールで記載されるスタイルシートの他の適合要件も満たしている必要があります。

部分実装

著者が将来互換性のあるパース規則を利用してフォールバック値を割り当てられるように、CSSレンダラーは、利用可能なレベルのサポートがないat規則、プロパティ、プロパティ値、キーワード、その他の構文要素を必ず無効として扱い、適切に無視しなければなりません。特に、ユーザーエージェントは単一の複数値プロパティ宣言において、サポートされていない成分値のみを選択的に無視し、サポートされている値だけを適用してはなりません。いずれかの値が無効(サポート外の値は必ず無効)とみなされる場合、CSSでは宣言全体を無視する必要があります。

不安定・独自機能の実装

将来の安定したCSS機能と衝突しないよう、CSSWGは将来互換性のためのベストプラクティスに従い、不安定機能および独自拡張の実装を推奨します。

非実験的実装

仕様が候補勧告段階に達したら、非実験的な実装が可能となり、実装者は仕様通りに正しく実装できているCRレベルの機能については、プレフィックスなしでリリースすべきです。

CSSの実装間で相互運用性を確立・維持するため、CSSワーキンググループは、非実験的なCSSレンダラーがW3Cに実装報告書(必要であればそのテストケースも)を提出することを推奨しています。提出されたテストケースはCSSワーキンググループによるレビュー・修正の対象となります。

テストケースや実装報告書の提出の詳細は、CSSワーキンググループのWebサイト https://www.w3.org/Style/CSS/Test/ で確認できます。質問は public-css-testsuite@w3.org メーリングリストまで。

候補勧告の終了基準

この仕様が提案勧告に進むには、各機能について少なくとも2つの独立した互換性のある実装が必要です。各機能は異なる製品群で実装されていて構いません。すべての機能を単一製品で実装する必要はありません。この基準のために、以下の用語を定義します:

independent
それぞれの実装は異なる団体によって開発され、他の該当実装で使われたコードを共有・再利用・派生してはなりません。仕様の実装に関係しないコード部分はこの要件から除外されます。
interoperable
公式CSSテストスイートの該当テストケース、またはWebブラウザ以外の場合は同等のテストに合格すること。テストスイートのすべての関連テストに同等のテストが作成されていることが必要であり、そのようなUAで互換性を主張するには、同じ方法でその同等テストに合格できる追加のUAが必要です。同等テストはピアレビューのために公開されなければなりません。
implementation
以下を満たすユーザーエージェント:
  1. 仕様を実装している。
  2. 一般公開されている。実装は製品版またはその他の公開版(ベータ版、プレビューリリース、nightly buildなど)であってよい。非製品版リリースは、機能を少なくとも1ヶ月間実装して安定性を示している必要がある。
  3. 実験的でない(テストスイート合格専用に設計され、今後通常利用される予定のないバージョンは該当しない)。

仕様は少なくとも6ヶ月間、候補勧告のままとなります。

索引

この仕様で定義されている用語

参照によって定義される用語

参考文献

規定参考文献

[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. 2021年12月3日. WD. URL: https://www.w3.org/TR/css-cascade-5/
[CSS-CONDITIONAL-3]
David Baron; Elika Etemad; Chris Lilley. CSS Conditional Rules Module Level 3. 2020年12月8日. CR. URL: https://www.w3.org/TR/css-conditional-3/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS Syntax Module Level 3. 2019年7月16日. CR. URL: https://www.w3.org/TR/css-syntax-3/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 2019年6月6日. CR. URL: https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2021年12月16日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 4. 2019年7月30日. CR. URL: https://www.w3.org/TR/css-writing-modes-4/
[CSS2]
Bert Bos; 他. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011年6月7日. REC. URL: https://www.w3.org/TR/CSS21/
[CSSOM-VIEW-1]
Simon Pieters. CSSOM View Module. 2016年3月17日. WD. URL: https://www.w3.org/TR/cssom-view-1/
[MEDIAQUERIES-3]
Florian Rivoal; 他. Media Queries. 2012年6月19日. REC. URL: https://www.w3.org/TR/css3-mediaqueries/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119

情報提供的参考文献

[CSS-FONTS-5]
Myles Maxfield; Chris Lilley. CSS Fonts Module Level 5. 2021年12月21日. WD. URL: https://www.w3.org/TR/css-fonts-5/
[HTML401]
Dave Raggett; Arnaud Le Hors; Ian Jacobs. HTML 4.01 Specification. 2018年3月27日. 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]
超高精細テレビジョンシステムのパラメータ値(制作・国際番組交換用). 2015年10月. URL: https://www.itu.int/rec/R-REC-BT.2020/en
[RFC2879]
G. Klyne; L. McIntyre. Content Feature Schema for Internet Fax (V2). 2000年8月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc2879
[SMPTE-EG-432-1-2010]
SMPTE技術ガイドライン - デジタルソース処理—D-シネマ用カラープロセッシング. 2010年. URL: http://ieeexplore.ieee.org/document/7289763/
[SMPTE-RP-431-2-2011]
SMPTE推奨プラクティス - D-シネマ品質 — 基準プロジェクタと環境. 2011年. URL: http://ieeexplore.ieee.org/document/7290729/
[SRGB]
マルチメディアシステムおよび機器 - 色測定と管理 - パート2-1: 色管理 - デフォルトRGB色空間 - sRGB. URL: https://webstore.iec.ch/publication/6169
[XML-STYLESHEET]
James Clark; Simon Pieters; Henry Thompson. XML文書とのスタイルシート関連付け 1.0(第2版). 2010年10月28日. REC. URL: https://www.w3.org/TR/xml-stylesheet/

プロパティ索引

定義されているプロパティはありません。

@media ディスクリプタ一覧

名称 初期値
any-hover none | hover discrete
any-pointer none | coarse | fine discrete
aspect-ratio <ratio> range
color <integer> range
color-gamut srgb | p3 | rec2020 discrete
color-index <integer> range
device-aspect-ratio <ratio> range
device-height <length> range
device-width <length> range
grid <mq-boolean> discrete
height <length> range
hover none | hover discrete
monochrome <integer> range
orientation portrait | landscape discrete
overflow-block none | scroll | paged discrete
overflow-inline none | scroll discrete
pointer none | coarse | fine discrete
resolution <resolution> | infinite range
scan interlace | progressive discrete
update none | slow | fast discrete
width <length> range