CSS環境変数モジュール レベル1

W3C最初の公開ワーキングドラフト

このドキュメントの詳細
このバージョン:
https://www.w3.org/TR/2025/WD-css-env-1-20250923/
最新版:
https://www.w3.org/TR/css-env-1/
編集者ドラフト:
https://drafts.csswg.org/css-env-1/
履歴:
https://www.w3.org/standards/history/css-env-1/
フィードバック:
CSSWG課題リポジトリ
仕様内でインライン
編集者:
Tab Atkins-Bittner (Google)
以前の編集者:
Dean Jackson (Apple)
この仕様への編集提案:
GitHubエディター

要約

この仕様は、環境変数の概念と、env()関数を定義します。これらはカスタムプロパティやvar()関数と同様に動作しますが、ドキュメント全体に対してグローバルに定義されます。環境変数は、ユーザーエージェントによって定義され、UAが特別にアクセスできる情報に基づいてページで使用できる値を提供したり、または制作者によって「グローバル」な変数として定義され、ドキュメント内のどこで使われても同じ値となることが保証されます。

CSSは、構造化文書(HTMLやXMLなど)の画面、紙などでのレンダリング方法を記述する言語です。

この文書の位置付け

このセクションは、本書の発行時点での文書の位置付けを説明します。 現在のW3C発行物とこの技術報告書の最新版は、 W3C標準およびドラフト一覧で確認できます。

本文書はCSS作業グループにより、最初の公開ワーキングドラフトとして勧告プロセスに従い公開されました。 最初の公開ワーキングドラフトとしての公開は、W3Cおよびその会員による承認を意味するものではありません。

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

ご意見は、GitHubで課題を提出(推奨)するか、 件名に仕様コード「css-env」を含めて、たとえば「[css-env] …コメントの要約…」のようにしてください。 すべての課題やコメントはアーカイブされています。 または、(アーカイブあり)パブリックメーリングリストwww-style@w3.orgへご連絡いただくこともできます。

本書は2025年8月18日版W3Cプロセス文書に従って管理されています。

本書はW3C特許ポリシーのもとで作業するグループによって作成されました。 W3Cはグループの成果物に関連してなされた特許開示の公開リストを管理しています。 そのページには特許の開示方法についても記載されています。 特許の存在を実際に知る個人は、 必須クレームが含まれていると考える場合、 W3C特許ポリシー第6節に従い情報を開示する必要があります。

1. はじめに

[css-variables-1]仕様は、「カスケーディング変数」の概念を定義しました。 これはカスタムプロパティの値から作られる著者定義の変数であり、 var()関数を使って任意の他のプロパティに代入できます。

本仕様は、これに関連しつつもより単純な環境変数の概念を定義します。 「カスケーディング変数」は、対応するカスタムプロパティの値が異なるとページ内で変化しますが、 環境変数は特定のドキュメント全体で「グローバル」であり、値はどこでも同じです。 env()関数を使ってその値を任意の場所に代入でき、 これはvar()関数と似ています。

これらの「グローバル」変数は、カスケーディング変数と比較して利点と欠点の両方があります:

ほとんどの環境変数は単一の値を持ちますが、 一部は「インデックス付き」で複数の値を一度に表現します。 たとえば、viewport-segment-*変数では複数のペインのサイズや位置などです。 こうしたインデックス付き変数を参照するには、変数名の後に1つ以上の整数を付けて指定します。 例:viewport-segment-width 1 0のようにして、 可能なリストやグリッドから1つの値を選択します。これは従来のプログラミング言語でvalues[0]のように要素を取り出すのに似ています。

2. 環境変数

CSSの環境変数は、<declaration-value>(0個以上のCSSトークンの並び、ほぼすべてのトークンが使用可能)に関連付けられた名前であり、 カスタムプロパティに似ています。環境変数はユーザーエージェントやユーザーによって定義できます。 (後者の場合、名前は<custom-property-name>となり、カスタム識別子の標準に従い`--`で始まります。)

UA定義の環境変数のセットはスクリプトから見えるべきか? もしそうなら、これらを公開するためのDocument上のAPIを定義すること。

著者が環境変数を追加する方法を定義すること。 できればJSとCSSの両方から。 CSSルールとJS定義の混在は簡単に混乱を招くことに注意(CSSFontFaceRuleとFontFaceの例のように)

以下のUA定義環境変数が公式に定義されており、必ずサポートされなければなりません。 追加のUA定義環境変数は、このリストに追加されるまでサポートしてはなりません

2.1. セーフエリアインセット変数

名前 次元数
safe-area-inset-top <length> 0(スカラー)
safe-area-inset-right <length> 0(スカラー)
safe-area-inset-bottom <length> 0(スカラー)
safe-area-inset-left <length> 0(スカラー)

セーフエリアインセットは、ビューポートの端からの上・右・下・左のインセットで矩形を定義する4つの環境変数です。矩形ディスプレイの場合はすべて0ですが、非矩形ディスプレイの場合、ユーザーエージェントが選択した矩形を形成し、その矩形内のすべてのコンテンツが表示され、いずれかのインセットを減らすと非矩形ディスプレイの特性により矩形内の一部コンテンツが見えなくなるようにします。これにより、制作者は必要なコンテンツのレイアウトをセーフエリア内に限定できます。

2.2. セーフエリア最大インセット変数

名前 次元数
safe-area-max-inset-top <length> 0(スカラー)
safe-area-max-inset-right <length> 0(スカラー)
safe-area-max-inset-bottom <length> 0(スカラー)
safe-area-max-inset-left <length> 0(スカラー)

セーフエリア最大インセットは環境変数で、セーフエリアインセット変数と連動しています。 セーフエリアインセット変数が動的値であるのに対し、 最大インセットは静的値であり、 動的なUAインターフェイスが格納されたときの 対応する動的値の最大値を表し、 レイアウトビューポートサイズが大きいビューポートサイズとなります。

2.3. ビューポートセグメント変数

名前 次元数
viewport-segment-width <length> 2
viewport-segment-height <length> 2
viewport-segment-top <length> 2
viewport-segment-left <length> 2
viewport-segment-bottom <length> 2
viewport-segment-right <length> 2

ビューポートセグメントは、ビューポートの論理的に独立した領域の位置とサイズを定義する環境変数です。ビューポートが1つ以上のハードウェア機能(折り目や複数ディスプレイ間のヒンジなど)によって分割されると、セグメントが作られます。 セグメントは、制作者が論理的に独立したものとして扱えるビューポートの領域です。

ビューポートセグメント環境変数は2次元を持ち、ハードウェアによる分割で作られる2次元グリッド内のx・y位置を表します。 左端のセグメントはx=0、右隣はx=1となり、同様に上端はy=0などとなります。

注: 特定のハードウェア構成では、仕切り自体がビューポート内で論理的な空間を占める場合があります。仕切りのサイズは、ビューポートセグメントの位置から計算できます。

ビューポートが左右2つのセグメントに分割されている場合、左側セグメントのインデックスは(0, 0)となり、その幅はenv(viewport-segment-width 0 0, 300px)で表せます。 右側セグメントはインデックス(1, 0)となります。 同様に、上下2分割の場合は上が(0, 0)、下が(0, 1)となります。

これらの変数は、2つ以上のセグメントがある場合のみ定義されます。 ハードウェアによるビューポート分割がない場合はビューポート単位を使うべきです。そうしないと、複数セグメント対応デバイスで意図通りに表示されません。

2.4. 推奨テキストズーム

名前 次元数
preferred-text-scale <number> 0(スカラー)

preferred-text-scale 環境変数は、ユーザーが好むテキスト拡大率(OSやUAの「標準」フォントサイズに対する調整値)を表します。 (text-size-adjustが効果を持つデバイスでは、 text-size-adjust: autoによって適用される拡大率です。)

たとえば、text-size-adjust:autoでテキストサイズが2倍になる場合は、 env(preferred-text-scale)2となります。

注: pem単位はこの情報と同じ意味です。1emcalc(1em * env(preferred-text-scale))と完全に等価です。 直接サイズ指定したい場合は、bsemの方が便利な長さ単位です。

この環境変数を正しく使うには注意が必要です。 デフォルトではテキスト拡大は自動適用されるため、 env(preferred-text-scale)pemを使うと 拡大率が二重に適用されてテキストやUIが大きくなりすぎます。

通常、制作者は以下のいずれかを選択します:

3. 環境変数の利用: env()記法

環境変数の値をCSSコンテキストで代入するには、 env() 関数を使用します:

env() = env( <custom-ident> <integer [0,∞]>*, <declaration-value>? )

env()関数は、 どの要素のどのプロパティの値の一部としても、また任意のatルールの記述子の値の一部としても、 その他CSS値が許可される様々な場所で利用できます。

env()が使用可能なすべての場所を定義すること。

env()の最初の引数は、代入される環境変数の名前を指定します。 1つ目の引数に続く整数は、その変数が配列的な環境変数であれば、 その次元に対するインデックスを表します。 カンマの後の引数は、指定されていればフォールバック値となり、 参照された環境変数が存在しない場合に 代入値として使われます。

注: フォールバック値の構文はカスタムプロパティ同様、カンマが使えます。 例:env(foo, red, blue)red, blueをフォールバック値として定義します。 つまり、最初のカンマ以降、関数の終わりまでがフォールバック値と見なされます。

プロパティが1つ以上のenv()関数を含み、 それらの関数が構文的に正しければ、 パース時点ではプロパティ全体の構文が有効と見なされます。 実際の構文検証は、env()関数が代入された後、計算時に行われます。

記述子が1つ以上のenv()関数を含み、 それらの関数が構文的に正しければ、 パース時点では宣言全体の構文が有効と見なされます。 実際の構文検証は、env()関数が代入された後に行われます。

プロパティまたは記述子でenv()を代入するには:
  1. env()関数の最初の引数で指定された名前が既知の環境変数名であり、 与えられた整数の個数がその名前で参照される環境変数の次元数と一致し、 インデックスの値が有効なサブ値に対応していれば、 そのenv()関数を指定された環境変数の値で置き換える。

  2. そうでなく、env()関数が第2引数としてフォールバック値を持つ場合は、 そのenv()関数をフォールバック値で置き換える。 フォールバック内にenv()参照があれば、それも代入する。

  3. それ以外の場合、そのenv()関数を含むプロパティや記述子は計算値時に無効となる。

どのタイミングで代入が行われるか定義すること。 var()の代入よりも前でなければならない。 あるいはenv()の代入をパース時に行い、 未知の変数名なら構文エラーとすべきか? var()のように計算時に行う理由はとくにない—これはカスタムプロパティの値が継承されてから var()で参照できるようにするためだった。

env()が他に使える場所が判明したら、その代入タイミング・方法も定義すること。

3.1. ショートハンドプロパティにおける環境変数

env()の代入がパース時に行われるなら、これは不要。

env()関数も ショートハンドプロパティに関して var()関数と同様の困難を引き起こします。 env()ショートハンドプロパティで使われた場合、 CSS Variables 1 § 3.2 ショートハンドプロパティにおける変数で定義されたものと同じ効果を持ちます。

4. プライバシーに関する考慮事項

本仕様で定義される環境変数潜在的にプライバシーに影響しうる情報です。 なぜなら、それらはページで元々利用できなかった追加情報を表しうるためです。 特に、ユーザーがページを閲覧しているデバイスに関する追加情報を 露出することで、フィンガープリントのベクトルとなる可能性があります。

これまでのところ、本仕様で定義された環境変数はCSSWGによるレビューを経て、 公開しても問題ないと判断されています。

5. セキュリティに関する考慮事項

この仕様はデバイスに関する新たな情報の一部を 読み取り専用で提供します。

本仕様で定義される環境変数は、 セキュリティ上機微な情報は何も露出しません。

適合性

文書上の規約

適合性要件は、 記述的な断言と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"で 規範テキストと区別されます。例:

注:これは情報的な注記です。

アドバイスは規範的なセクションであり、<strong class="advisement">で他の規範テキストと区別され、特に注意を喚起します。例: UAはアクセシブルな代替手段を必ず提供しなければなりません。

適合クラス

本仕様への適合性は、3つの適合クラスで定義されます:

スタイルシート
CSSスタイルシート
レンダラー
スタイルシートの意味を解釈し、それを使って文書をレンダリングするUA
オーサリングツール
スタイルシートを作成するUA

このモジュールで定義された構文を使うすべての文が 一般的なCSS文法および各機能ごとの個別文法に従って有効である場合、 スタイルシートは本仕様に適合しています。

レンダラーは、適切な仕様で定義されたとおりにスタイルシートを解釈することに加えて、 本仕様で定義されたすべての機能を正しくパースし、文書をそれに従ってレンダリングすることで本仕様に適合します。 ただし、デバイスの制約により文書を正しくレンダリングできない場合でもUAが非適合となるわけではありません(例:モノクロモニターで色を表示できなくてもよい)。

オーサリングツールは、一般CSS文法およびこのモジュール内の各機能の個別文法に従って構文的に正しいスタイルシートを書き、 このモジュールに記載されたすべてのスタイルシートの適合要件を満たす場合、本仕様に適合します。

部分的な実装

著者が将来互換なパース規則を活用してフォールバック値を指定できるように、 CSSレンダラーは、サポートできないatルール・プロパティ・プロパティ値・キーワードその他構文要素は無効として(適切に無視)しなければなりません。 特に、ユーザーエージェントは、複数値のプロパティ宣言でサポートされていない値だけを選択的に無視し、サポートされている値を適用してはなりません。 いずれかの値が無効(=未サポート値)と見なされる場合、CSSは宣言全体を無視することを要求します。

不安定機能および独自機能の実装

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

非実験的な実装

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

CSSの実装間の相互運用性を確立・維持するために、 CSS作業グループは、非実験的なCSSレンダラーがCSS機能のプレフィックスなし実装をリリースする前に 実装レポート(必要ならそのテストケースも)をW3Cに提出するよう求めています。 W3Cに提出されたテストケースはCSSWGによるレビュー・修正の対象となります。

テストケース・実装レポートの提出方法など詳細は CSS作業グループのウェブサイト https://www.w3.org/Style/CSS/Test/ を参照してください。 質問はpublic-css-testsuite@w3.orgまで。

索引

本仕様で定義された用語

参照による定義用語

参考文献

規範的参考文献

[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 5. 2022年1月13日. CR. URL: https://www.w3.org/TR/css-cascade-5/
[CSS-CONDITIONAL-3]
Chris Lilley; David Baron; Elika Etemad. CSS Conditional Rules Module Level 3. 2024年8月15日. CRD. URL: https://www.w3.org/TR/css-conditional-3/
[CSS-SIZE-ADJUST-1]
CSS Mobile Text Size Adjustment Module Level 1. Editor's Draft. URL: https://drafts.csswg.org/css-size-adjust-1/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS Syntax Module Level 3. 2021年12月24日. CRD. URL: https://www.w3.org/TR/css-syntax-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2024年3月12日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-VARIABLES-1]
Tab Atkins Jr.. CSS Custom Properties for Cascading Variables Module Level 1. 2022年6月16日. CR. URL: https://www.w3.org/TR/css-variables-1/
[CSSOM-VIEW-1]
Simon Fraser; Emilio Cobos Álvarez. CSSOM View Module. 2025年9月16日. WD. URL: https://www.w3.org/TR/cssom-view-1/
[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119

課題一覧

UA定義の環境変数のセットはスクリプトから見えるべきか? もしそうなら、Document上にそれを公開するAPIを定義すること。
著者が環境変数を追加する方法を定義すること。 できればJSとCSSの両方から。 CSSルールとJS定義の混在は簡単に混乱を招くことに注意(CSSFontFaceRuleとFontFaceの例のように)
env()が使用可能なすべての場所を定義すること。
どのタイミングで代入が行われるか定義すること。 var()の代入よりも前でなければならない。 あるいはenv()の代入をパース時に行い、 未知の変数名なら構文エラーとすべきか? var()のように計算時に行う理由はとくにない—これはカスタムプロパティの値が継承されてから var()で参照できるようにするためだった。
env()が他に使える場所が判明したら、その代入タイミング・方法も定義すること。
env()の代入がパース時に行われるなら、これは不要。