CSSフォームコントロールのスタイリング レベル 1

W3C 第一公開作業草案,

この文書についての詳細
このバージョン:
https://www.w3.org/TR/2025/WD-css-forms-1-20250325/
最新公開バージョン:
https://www.w3.org/TR/css-forms-1/
編集者草案:
https://drafts.csswg.org/css-forms-1/
履歴:
https://www.w3.org/standards/history/css-forms-1/
フィードバック:
CSSWG Issues リポジトリ
仕様内のインライン
編集者:
(Apple Inc.)
この仕様への編集を提案:
GitHub エディター

概要

この CSS モジュールは、フォームコントロールとその各種部品をスタイル付けするさまざまな方法を定義する。

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

この文書のステータス

この節は、この文書の公開時点におけるステータスを説明する。 現在の W3C 公開文書の一覧 およびこの技術レポートの最新改訂版は、 https://www.w3.org/TR/ にある W3C 標準および草案索引で 確認できる。

この文書は、 CSS ワーキンググループにより、勧告 トラックを用いた第一公開作業草案として 公開された。 第一公開作業草案としての公開は、 W3C およびそのメンバーによる承認を意味しない。

これは草案文書であり、 いつでも他の文書により更新、置換 または廃止される可能性がある。 作業中のもの以外としてこの文書を引用することは不適切である。

フィードバックは、 GitHub に issue を提出すること(推奨)により送信し、 タイトルには次のように仕様コード “css-forms” を含めること: “[css-forms] …コメントの概要…”。 すべての issue とコメントはアーカイブされる。 あるいは、フィードバックは(アーカイブ済みの)公開メーリングリスト www-style@w3.org に送信できる。

この文書は、2023年11月3日 W3C プロセス文書により管理される。

この文書は、W3C 特許ポリシーの下で活動するグループにより作成された。 W3C は、当該グループの成果物に関連して行われた特許 開示の公開一覧を維持しており、 そのページには特許を開示するための手順も含まれている。 自身が必須請求項を 含むと信じる特許について実際の知識を有する個人は、 W3C 特許 ポリシー第 6 節に従って情報を開示しなければならない。

1. 序論

この節は非規範的である。

ユーザーエージェントは長い間、フォームコントロールをスタイル付けするための非標準的な方法を提供してきた。 しかし、これらのコントロールはすべてユーザーエージェント間で一貫せずに実装されており、 作者に不要な摩擦を生じさせている。

このモジュールは、相互運用可能に使用できるよう十分な詳細さで、 一連のフォームコントロール部品を定義することを目的とする。

また、フォームコントロールをカスタマイズする新しい方法もいくつか定義し、 以前はカスタムコントロールをゼロから実装することでしか可能でなかった一般的なユースケースを扱う。 それは多くの作業を要し、 正しく行うのが難しく、しばしばアクセシビリティまたはプラットフォーム規約のいずれかを壊していた。

2. 基本外観へのオプトイン: appearance: base

appearance の定義をここに移す。

名前: appearance
新しい値: base

フォームコントロールに適用されると、base はそのコントロールを基本外観状態に置く。

基本 外観を持つコントロールは、標準 CSS および以下で定義される疑似要素を用いて一貫してスタイル付けでき、 UA 間で一貫する上書き可能なデフォルトスタイルを適用する。 コントロールがその状態にある場合、ユーザーエージェントは付録 A: 基本外観ユーザーエージェントスタイルシートのスタイルをその コントロールに適用する。

ユーザーエージェントは、§ 4 疑似要素で定義される疑似要素も有効にしなければならない。これらの疑似要素(::picker() を除く)は常に、 それらのappearance起点要素から継承する。ユーザーエージェントは、 appearance: inherit !important 宣言を使用してこれを実装してよい。

注: この継承は、作者が同じコントロールにネイティブ部品と 非ネイティブ部品を混在させることを防ぐ。

2.1. 基本外観の設計原則

次の設計原則は、フォームコントロール向けの基本外観スタイルシートの設計に適用される。 重要度の高い順に示す:

  1. スタイルはすべてのユーザーエージェントで同一である。

  2. コントロールは追加のスタイルなしで、それ自体で認識可能かつ使用可能である。

  3. コントロールは WCAG 2.2 AA 標準を 100% 満たす。

  4. スタイルはコントロール間で一貫している…

    1. …見た目と操作感において。

    2. …コード内での定義方法において。

    3. …サイズ設定と相互作用において。

  5. 複雑なリセットスタイルシートを必要とせず、ウェブサイトのブランディングに容易に適応できる:

    1. 最小限のコードを使用し、上書きが容易である。

    2. それ自体の強い voice & tone を持たず、可能な限り視覚的に単純である。

    3. 可能な限り新しいスタイルを定義するのではなく、ページのスタイルを継承する。

    4. 調整に対して堅牢である…

      1. …それ自身が変更された場合(例: フォント、ボーダー、レイアウトの変更)。

      2. …文脈内に置かれた場合(例: flex や grid の子になる準備ができている)。

  6. 包括的である:

    1. 各コントロールのすべての状態を網羅する。

    2. すべての書字モードと配色をサポートする。

特に HTML フォームコントロールについては、これらの原則は 付録 A: 基本外観ユーザーエージェントスタイルシートで定義される必須ユーザーエージェントスタイルシートを通じて適用される。

2.2.

実装、実験、 bikeshedding、およびユーザーエージェントスタイルシートの改善を通じて、これらの例を洗練する。

これらの例の主な目的は、基本外観の設計原則が実際にどのように適用されるかを示すことである。

個々のコントロールに基本 外観を適用するには、次のコードを使用する:

input, textarea, meter, progress, button, select {
  appearance: base;
}

注: 次の例で使用されるフォームレイアウトは 詳細に述べない。

2.2.1. デフォルトのユーザーエージェント色

次に、ルート要素からデフォルトのライトモード色およびダークモード色をそれぞれ継承する基本 外観色を示す:

ライト配色の基本外観のスクリーンショット ダーク配色の基本外観のスクリーンショット

2.2.2. 色/フォントのカスタマイズ

次に、基本外観の上に行われるカスタマイズの例を示す:

form {
  font-family: "American Typewriter";
  background-color: rgb(254, 252, 221);
  color: rgb(131, 17, 0);
}

input, textarea, meter, progress, button, select {
  appearance: base;
}

茶色の文字と淡い黄色の背景を持つカスタマイズされた基本外観のスクリーンショット

form {
  font-family: "Courier New";
  font-size: 14px;
  background-color: rgb(0, 0, 0);
  color: rgb(0, 249, 0);
}

input, textarea, meter, progress, button, select {
  appearance: base;
}

緑色の文字と黒い背景を持つカスタマイズされた基本外観のスクリーンショット

3. ピッカーのスタイル付け

3.1. ::picker() 疑似要素

::picker() 疑似要素は、ページからポップアウトするフォームコントロールの部分を表す。

::picker() = ::picker( <form-control-identifier>+ )
<form-control-identifier> = select

::picker() 疑似要素は、起点要素基本外観をサポートし、かつポップアップピッカーを持つ場合にのみ一致する。 指定された <form-control-identifier> は、 起点要素一意なピッカー 名にも一致しなければならない。たとえば、 select 要素に対する一意なピッカー名select である。

::picker() 疑似要素がレンダリングされるためには、それとその起点要素の両方が、算出された appearance として base を持たなければならない。

次のスタイルは、基本外観を select ピッカーと select に適用し、ピッカーに追加のスタイルを加える:
select, select::picker(select) {
  appearance: base;
}
select::picker(select) {
  border: 5px solid red;
  background-color: blue;
}

注: ::picker() の非関数形式は、 新しいピッカーがサポートされるようになったときに意図しないピッカーのスタイル付けを防ぐため、現在は動作しない。 すべてのフォームコントロールピッカーに対するスタイル付けが確定したら、この非関数形式はすべてのピッカーで動作する。

4. 疑似要素

フォームコントロールは、作者が個別にスタイル付けしたい多くの部品で構成されるため、 ユーザーエージェントが個々のフォームコントロール用の疑似要素を提供する必要がある。

以下の節では、最も一般的なユースケースを網羅しようとする一連の疑似要素を導入し、 それらをユーザーエージェント間で一貫した方法で扱えるようにする。

HTML に適用されるフォームコントロール疑似要素の参考概要
コントロール 疑似要素
<progress>
├─ ''::track''
│  └─ ''::fill''
└─ ''::thumb''
<meter>
<input type=checkbox switch>
<input type=range>
<input type=checkbox> ::checkmark
<input type=radio>
<input type=file> ::file-selector-button
<input type=date>

§ 4.8 日付/時刻入力フィールドの部品のスタイル付け: ::field-component および ::field-separator 疑似要素を参照

<input type=datetime-local>
<input type=time>
<input type=month>
<input type=week>
<input>(type なし) § 4.5 テキストフィールドの部品のスタイル付け: ::field-text および ::clear-icon 疑似要素を参照
<input type=text>
<input type=search>
<input type=email>
<input type=password>
<input type=tel>
<input type=url>
<input type=number> § 4.7 数値フィールドの部品のスタイル付け: ::step-control, ::step-up および ::step-down 疑似要素を参照
<input type=color> ::color-swatch
<textarea> § 4.6 textarea の部品のスタイル付け: ::placeholder および ::field-text 疑似要素を参照
<select> ::picker-icon
<option> ::checkmark
ボタン

図を追加する。

4.1. ピッカーを開くアイコン: ::picker-icon 疑似要素

::picker-icon 疑似要素は、 ピッカーの存在を示すアイコンを表すコントロールの部分を表す。 これは、起点要素基本外観を持ち、かつピッカーを開く場合にのみ生成される。 これは完全にスタイル付け可能な疑似要素であり、その起点要素から継承する。

::picker-icon は、起点要素の子であるかのようにボックスを生成し、::after 疑似要素により生成される任意のボックスの後に置かれ、 content により指定される内容を持つ。

4.2. ファイルセレクターボタン: ::file-selector-button 疑似要素

::file-selector-button 疑似要素は、UA がそのようなボタンをレンダリングする場合に、 ファイルピッカーを開くために使用されるボタンを表す。

通常これは、 button 要素の内側にある input 要素(type=file)を対象とする。 これは要素に裏付けられた疑似要素である。

たとえば、次の例は ファイルセレクターボタンの周囲に緑色のボーダーを 表示するはずである:
::file-selector-button { border: 3px solid green }

4.3. チェックマークのスタイル付け: ::checkmark 疑似要素

::checkmark 疑似要素は、項目がチェックされているかどうかのインジケーターを表し、 チェックボックス、ラジオ、および option 要素上に存在する。

これは、起点要素:checked 疑似クラスをサポートし、かつ基本外観を持つか、または 基本外観を持つ祖先を持つ場合にのみ生成される。 これは完全にスタイル付け可能な疑似要素であり、その起点要素から継承する。

チェックボックスおよびラジオ要素については、これは起点要素の子であるかのようにボックスを生成し、::before::after 疑似要素により生成されるボックスの間に置かれ、content により指定される内容を持つ。

option 要素については、これは起点 要素の子であるかのようにボックスを生成し、::before 疑似要素により生成される任意のボックスの前に置かれ、content により指定される内容を持つ。

次の例は、チェックマークの背景画像を変更する:
::checkmark { background-image: url(...) }

これは :indeterminate と組み合わせて、不定状態のチェックマークをスタイル付けするためにも使用できる:

:indeterminate::checkmark { background-image: url(...) }

4.4. スライダー状コントロールの部品のスタイル付け: ::thumb, ::track および ::fill 疑似要素

命名はまだ 議論中である。[Issue #9830]

スライダー状 コントロールとは、進行状況を表すフォームコントロールである。 その進行状況はユーザーにより調整可能な場合がある。

次の疑似要素は、それらの異なる部品をスタイル付けするために提供される:

::thumb
::thumb 疑似要素は、 ユーザーがコントロールの進行状況を調整できる部分を表す。

注: 通常、ほとんどのユーザーエージェントではネイティブに 円としてレンダリングされる。

::track
::track 疑似要素は、コントロールの進行済み部分と未進行部分の 両方を含む部分を表す。
::fill
::fill 疑似要素は、 コントロールの進行済み部分を含む部分を表す。

コントロールの進行状況が未確定である場合(<progress indeterminate> のような場合)、 ユーザーエージェントはこの部分の inline-size をゼロにしなければならない。

これらの疑似要素は完全に スタイル付け可能な疑似要素であり、その構造は次のとおりである:

<input type="range">
├─ ::track
│  └─ ::fill
└─ ::thumb

スライダー状コントロールの一覧はホスト言語に依存する。HTML では、 これは次に対応する:

4.5. テキストフィールドの部品のスタイル付け: ::field-text および ::clear-icon 疑似要素

::placeholder
::placeholder 疑似要素は、 placeholder テキストを含む input の部分を表す。
::field-text
::field-text 疑似要素は、 編集可能なテキストを含む input の部分を表す。
::clear-icon
::clear-icon 疑似要素は、 ユーザーエージェントにより提供される場合に、クリックされたとき ユーザーが input をクリアできる input の部分を表す。

appearance: textfield の場合、ユーザーエージェントは この部品を生成してはならない。

::field-text::clear-icon は兄弟でなければならない。

autofill で使用される部品を 収集する。

それを実装するユーザーエージェント向けに、 パスワード表示切り替えについて何かを定義するか? [Issue #11845]

::placeholder::field-text とどのように相互作用するかを定義する。[Issue #11844]

4.6. textarea の部品のスタイル付け: ::placeholder および ::field-text 疑似要素

::placeholder
::placeholder 疑似要素は、 placeholder テキストを含む textarea の部分を表す。
::field-text
::field-text 疑似要素は、 編集可能なテキストを含む textarea の部分を表す。

リサイザーについて何かを定義する。[Issue #11850]

::placeholder::field-text とどのように相互作用するかを定義する。[Issue #11844]

4.7. 数値フィールドの部品のスタイル付け: ::step-control, ::step-up および ::step-down 疑似要素

これらの疑似要素は数値入力用に提供される。これらは完全に スタイル付け可能な疑似要素である。

::step-control
::step-control 疑似要素は、 上下ボタンを含む数値入力の部分を表す。
::step-up
::step-up 疑似要素は、 作動したときに数値入力内の値を増加させるボタンを表す。
::step-down
::step-down 疑似要素は、 作動したときに数値入力内の値を減少させるボタンを表す。

それらの構造は次のように定義される:

<input type="number">
├─ ::field-text
└─ ::step-control
   ├─ ::step-up
   └─ ::step-down
次のコントロール:
<input type="number">

は次のように再スタイル付けできる:

[ + 2 - ]

実際の画像を挿入する。

次のスタイルを使用する:

input[type=number] {
  appearance: base;
  &::step-control {
    display: contents;
  }
  &::step-up {
    order: 1;
    content: "+";
  }
  &::field-text {
    order: 2;
  }
  &::step-down {
    order: 3;
    content: "-";
  }
}

appearance: textfield の場合、ユーザーエージェントはこの部品を生成してはならない。

4.8. 日付/時刻入力フィールドの部品のスタイル付け: ::field-component および ::field-separator 疑似要素

::field-component
::field-component 疑似要素は、 日付/時刻コンポーネント値を含むコントロールの部分を表す。
::field-separator
::field-separator 疑似要素は、 ユーザーエージェントがそれらの部分を提供する場合に、日付/時刻コンポーネント値を区切る コントロールの部分を表す。

これらの疑似要素は兄弟である。コントロールの正確な構造は国際化 およびホスト言語により決定されるが、 ユーザーエージェント間で一貫していなければならない。

次のコントロール:
<input type="date">

は、米国ロケールでは次のようにレンダリングされる場合がある:

[ 08 / 22 / 2024 [v]]

実際の画像を挿入する。

結果のツリーは次のとおりである:

<input type="date">
├─ ::field-component (08)
├─ ::field-separator (/)
├─ ::field-component (22)
├─ ::field-separator (/)
├─ ::field-component (2024)
└─ ::picker-icon

4.9. 色スウォッチ: ::color-swatch 疑似要素

名前は ::swatch と ::color-swatch のどちらにすべきか? [Issue #11837]

::color-swatch 疑似要素は、選択された色値を表示する コントロールの部分を表す。

たとえば、次の例は input とその色スウォッチを丸くするはずである:
input[type=color], ::color-swatch { border-radius: 100%; }

4.10. ベンダー疑似要素拡張との互換性

可能な場合、ユーザーエージェントは非標準疑似要素を実装するためにエイリアス化を使用すべきである。

不可能な場合、ユーザーエージェントは標準疑似要素を appearance: base 用に予約し、非標準のものは appearance: none 用に使用しなければならない。

5. 疑似クラス

5.1. 異なる meter 状態の対象化: :low-value / :high-value / :optimal-value 疑似クラス

これが UA ロジックを再現できることを確認する。[Issue #11336]

これらを HTML の 定義にリンクする。

:low-value 疑似クラスは、 meter 要素の値が low HTML 属性により指定される値を下回る場合に一致する。

:high-value 疑似クラスは、 meter 要素の値が high HTML 属性により指定される値を上回る場合に一致する。

:optimal-value 疑似クラスは、 meter 要素の値が optimum / low / high HTML 属性により決定される範囲内にある場合に一致する。

5.2. リストボックスである select の対象化

何かを定義する。[Issue #7422]

6. control-value() 関数

これは 実装の準備ができていない。これに関する issue を提出する。

データ漏出に関して、 プライバシー上の影響を検討する。[Issue #11860]

より多くの 型を追加することを検討する。[Issue #11842]

control-value() 関数は、それが置かれたフォーム コントロールの現在値に算出される。フォームコントロールでない要素に使用された場合、 空文字列を返す。

<control-value()> = control-value( <type>? )

<type> = '<' [ number | string ] '>'

疑似要素に使用された場合、これはその起点要素に対して評価される。

たとえば、range 入力の値をその隣に表示するには:
input[type=range]::after {
  content: control-value();
}

7. ウィジェットのスタイル付け

field-sizing/accent-color/input-security をこの仕様に移すか?

7.1. スライダー状コントロールの向きの変更: slider-orientation

このプロパティを作り直す。

名前: slider-orientation
値: auto | left-to-right | right-to-left | top-to-bottom | bottom-to-top
初期値: auto
適用対象: すべての要素
継承: no
パーセンテージ: n/a
算出値: 指定どおり
正規順序: 文法どおり
アニメーション型: 離散
auto
スライダー状 コントロールの向きは、書字モードおよび方向により定義される。
left-to-right
スライダー状 コントロールは水平にレンダリングされ、::fill はコントロール内で左揃えされる。
right-to-left
スライダー状 コントロールは水平にレンダリングされ、::fill はコントロール内で右揃えされる。
top-to-bottom
スライダー状 コントロールは垂直にレンダリングされ、::fill はコントロール内で上揃えされる。
bottom-to-top
スライダー状 コントロールは垂直にレンダリングされ、::fill はコントロール内で下揃えされる。

付録 A: 基本外観ユーザーエージェントスタイルシート

HTML に移す。

この節は 実装により洗練する必要がある。

色入力スタイルは 洗練する必要がある。[Issue #11837]

基本

input,
textarea,
button,
::file-selector-button,
select,
meter,
progress {
    color: inherit;
    font: inherit;
    box-sizing: border-box;
    background-color: transparent;
}

レイアウト

input:not([type=file], [type=range]),
textarea,
button,
::file-selector-button,
::track,
select,
meter,
progress {
  border: 1px solid currentColor;
  background-color: transparent;
}

スライダー

meter、progress、 switch および range input のスタイル付けを洗練する。

::track {
  height: 1em;
}

::fill {
  height: 100%;
  background-color: currentColor;
}

::thumb {
  border-radius: 0;
  border: none;
  background-color: currentColor;
  appearance: none;
  width: 1em;
  height: 100%;
}

チェックボックスと ラジオ

input:is([type=checkbox]:not([switch]), [type=radio]) {
    width: 1em;
    height: 1em;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    content: '';
}

input[type=radio] {
    border-radius: 100%;
}

input[type=checkbox]:not([switch]):checked::checkmark {
    content: '\2713' / '';
}

input[type=radio]:checked::checkmark {
    background-color: currentColor;
    display: inline-block;
    border-radius: inherit;
    height: 100%;
    width: 100%;
}

Select と button

select {
  /* Base appearance select always sizes based on its contents. */
  field-sizing: content !important;
}

button,
::file-selector-button,
select,
input:is([type="color"], [type="button"], [type="reset"], [type="submit"]) {
  border: 1px solid currentColor;
  background-color: transparent;
  color: inherit;
  /* Padding prevents the text from sticking to the borders.
   * optically centered to account for half leading */
  padding-block: 0.25em;
  padding-inline: 0.5em;

  /* <select>s and <button>s should have border-radius to be
   * distinct from <input>s: https://github.com/w3c/csswg-drafts/issues/10857#issuecomment-2520875011*/
  border-radius: 0.5em;

  /* These min-size rules ensure accessibility by following WCAG rules:
   * https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html
   * The 1.2em is there to make sure that options without text don't change
   * the block size of the button. */
  min-block-size: max(24px, 1lh);
  min-inline-size: 24px;

  /* box-sizing comes from existing UA styles which happen to
   * already be interoperable. */
  box-sizing: border-box;

  /* Push picker icon to the right of the box and have some space
   * in between it and the text. */
  display: inline-flex;
  gap: 1em;

  user-select: none;
}
:is(button, select, input:is([type="color"], [type="button"], [type="reset"], [type="submit"])):enabled:hover,
:enabled::file-selector-button:hover {
  background-color: color-mix(in lab, currentColor 10%, transparent);
}
:is(button, select, input:is([type="color"], [type="button"], [type="reset"], [type="submit"])):enabled:active,
:enabled::file-selector-button:active {
  background-color: color-mix(in lab, currentColor 20%, transparent);
}
:is(button, select, input:is([type="color"], [type="button"], [type="reset"], [type="submit"])):disabled,
:disabled::file-selector-button {
  color: color-mix(in srgb, currentColor 50%, transparent);
}

select > button:first-child {
  /* Prevents button from setting font, color, or background-color */
  all: unset;

  /* Prevents duplicate box decorations */
  display: contents;

  /* Prevents button activation behavior so select can handle events */
  interactivity: inert;
}
select option {
  /* These min-size rules ensure accessibility by following WCAG rules:
   * https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html
   * Unset if the author provides a child button element.
   * The 1lh is there to make sure that options without text don't change
   * the block size of the option. */
  min-inline-size: 24px;
  min-block-size: max(24px, 1lh);

  /* Centers text within the block (vertically). From OpenUI discussion:
   * https://github.com/openui/open-ui/issues/1026#issuecomment-2103187647. */
  align-content: center;

  /* centering + gap between checkmark and option content */
  /* also easily reversed, when checkmark should be inline-end */
  display: flex;
  align-items: center;
  gap: 0.5em;

  /* Makes options with long text widen picker instead
   * of making options tall. */
  white-space: nowrap;
}
select option:enabled:hover {
  background-color: color-mix(in lab, currentColor 10%, transparent);
}
select option:enabled:active {
  background-color: color-mix(in lab, currentColor 20%, transparent);
}
select option:disabled {
  color: color-mix(in lab, currentColor 50%, transparent);
}
select option::checkmark {
  content: '\2713' / '';
}
select option:not(:checked)::checkmark {
  visibility: hidden;
}

select optgroup {
  /* font-weight makes optgroups visually distinct from options. */
  font-weight: bolder;
}

select optgroup option {
  /* Undo font-weight:bolder rule from optgroups. */
  font-weight: normal;
}

select legend,
select option {
  /* spacing ownership moves to children */
  /* space inline from border edges */
  /* this creates a full bleed hover highlight */
  padding-inline: 0.5em;
}

select::picker-icon {
  /* margin-inline-start pushes the icon to the right of the box */
  margin-inline-start: auto;
  display: block;
  content: counter(-ua-disclosure-open, disclosure-open);
}

::picker(select) {
  /* Same properties as popover and dialog */
  color: CanvasText;
  background-color: Canvas;
  border: 1px solid;

  /* box-sizing is set to match the button. */
  box-sizing: border-box;

  /* Remove [popover] padding which
   * prevents options from extending to edges */
  padding: 0;

  /* Anchor positioning and scrollbars */
  inset: auto;
  margin: 0;
  min-inline-size: anchor-size(self-inline);
  min-block-size: 1lh;
  /* Go to the edge of the viewport, and add scrollbars if needed. */
  max-block-size: stretch;
  overflow: auto;
  /* Below and span-right, by default. */
  position-area: block-end span-inline-end;
  position-try-order: most-block-size;
  position-try-fallbacks:
    /* First try above and span-right. */
    block-start span-inline-end,
    /* Then below but span-left. */
    block-end span-inline-start,
    /* Then above and span-left. */
    block-start span-inline-start;
}

付録 B: 探索

基本スタイル付けの提案

この節では、フォームスタイル付け問題を解決するためのいくつかの提案を概説する。

プロトタイプ

もともと fantasai により提案されたこの考えは、 少数の「プロトタイプ」要素をスタイル付けできる、というものである。 ブラウザー UI 設計者は、その後それらの要素のスタイル付けを受け取り、 その設計を自分たちの UI に外挿できる。 最低限、テキスト、背景、ボーダーのようなものを使用できる。 限界として、内部 padding、border-radius などのようなものも使用されるかもしれない。

@control button {
  <declaration-list>
}

@control input {
  <declaration-list>
}

input::selection {
  <declaration-list>
}

...
次のスタイルを使用できるようになる:

ほとんどのフォームコントロールは、カレンダーウィジェットや時計であっても、 何らかの形でこれら 3 つのプリミティブの組み合わせである。UA に これら 3 つのプリミティブ、おそらくさらに 1 つか 2 つのスタイル付けが与えられれば、 残りをどのようにスタイル付けするかを理解できる。

たとえば、カレンダーウィジェットは月、年、それらを移動するためのいくつかのボタン、 それらをクリックして直接編集できる機能、 および月の日付の表現を持つかもしれない。選択された日は選択されている。 おそらくボタンは :hover または :focus 時にのみ表示される -- UA が決定する。しかし UA は、ボタンが特定の青の色合い、特定の border-radius と drop-shadow を持つべきことを知っている。 カレンダーは入力フィールドの色で表示され、選択された日は選択色で表示され、 あらゆる点でページ内の他の入力フィールドの見た目と一致する。

これで、作者は、たとえば年と月名の間隔や、 年を変更するボタンの矢印が塗りつぶしか輪郭のみか、装飾的なものかを決めることはできない。 また、月とその下の日フィールドの間に 5px の間隔を持つ黒い実線の半ボーダーを 設けるべきだと決めることもできない。しかしカレンダーはページに属しているように見え、 UA は横に広いが縦に短いスマートウォッチに搭載する場合に、月と年を横に置いた方がよい 別のカレンダーレイアウトを、何も壊すことなく考案できる。

iOS 時刻ピッカー
黒い領域は ボタン色である。その非常に薄い透明版を ガラス色にできる。ローラーは入力色である。
Android 時刻ピッカー
もっと文脈がなければ 判別しにくいが、右側のものについては、 時計面とデジタル表示は @input 色で、強調された部分は highlight 色、 Done ボタンはボタンのスタイル付けであり、 時計面の周囲の影付き領域はボタン背景と同じ色である。

反転システム色

もともと Florian と Tab によりスケッチされたこの考えは、 UI 設計者が UI に色を付ける際に選択できる 抽象的な色の集合を定義することである。

Android 色抽出 API 提案からの、Tab の提案する色集合:

(light はおよそ 75% の明度、normal はおよそ 50%、dark はおよそ 25%; vibrant は少なくとも 30% の彩度、理想的には 100%、muted は最大 40% の彩度、理想的には 30%)

これで 11 色になり、その多くはウェブページ自身の配色から描画可能であるべきである。 少なくともいくつかを指定すれば、それらの一部を自動生成できる。 たとえば "normal-vibrant" 色から light/dark バリアントを生成したり、 必要に応じてテキスト色を白/黒に自動設定したりできる。

ただし、入力 UI が、ページの残り部分と同じ方法でその色を使用する保証はない。

その他のコントロール固有の提案

<progress> および <meter> のスタイル付け

<select> と <datalist> のスタイル付け提案および/またはホワイトボード写真を挿入する。

Select/Datalist ドロップダウン

  1. colorbackground の両方が設定されている場合にのみスタイル付けを許可する。

  2. Option コンテナー:

    • 背景

    • ボーダー

    • padding

  3. option

    • padding

    • ボーダー

    • border-collapse?

    • 背景

    • display-inside は許可され、自動的に block 化される

    • margin、position、float、width、height は不可

すべての option は contain:paint かつ BFC である。

入力 UI の例

この節では、スクリーンショットを撮れる限り多くの入力 UI 例を集める。 特に、少し「奇妙」なものになりがちなモバイルデバイス上の例を対象とする。

時刻ピッカー

iOS 時刻ピッカー
Android 時刻ピッカー 1
Android 時刻ピッカー 2

日付ピッカー

Android 日付ピッカー

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

この仕様について、新たなプライバシーに関する考慮事項は報告されていない。

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

この仕様について、新たなセキュリティに関する考慮事項は報告されていない。

謝辞

この提案への意見について、Aditya Keerthi、Anne van Kesteren、Elika Etemad、Jen Simmons、Joey Arhar、Jon Davis、Simon Fraser および Theresa O’Connor に感謝する。

input[type=range] のスタイル付けについて詳細な 分析を行った Ana Tudor に感謝する。

適合性

文書の規約

適合性要件は、 記述的な表明と 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 が文書を正しくレンダリングできないことは、 UA を非適合にするものではない。(たとえば、UA はモノクロモニターで 色をレンダリングすることを要求されない。)

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

部分実装

作者が前方互換な構文解析規則を利用してフォールバック値を 割り当てられるようにするため、CSS レンダラーは、使用可能なサポート水準を持たない 任意の at-rule、プロパティ、プロパティ値、キーワード、 およびその他の構文構成物を無効として扱い(かつ適切に 無視)しなければならない。特に、ユーザーエージェントは、単一の 複数値プロパティ宣言において、サポートされない構成値を選択的に 無視し、サポートされる値を尊重してはならない。何らかの値が無効と見なされる場合 (サポートされない値はそう扱われなければならない)、CSS は宣言全体が 無視されることを要求する。

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

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

非実験的実装

仕様が勧告候補段階に到達すると、 非実験的実装が可能になり、実装者は、仕様に従って正しく実装されていることを 実証できる任意の CR レベル機能について、 接頭辞なしの実装をリリースすべきである。

CSS の実装間の相互運用性を確立および維持するため、 CSS ワーキンググループは、非実験的 CSS レンダラーに対し、 任意の CSS 機能の接頭辞なし実装をリリースする前に、実装レポート (および必要であれば、その実装レポートに使用したテストケース)を W3C に提出することを求める。 W3C に提出されたテストケースは、CSS ワーキンググループによるレビューおよび修正の対象となる。

テストケースおよび実装レポートの提出に関するさらなる情報は、 CSS ワーキンググループのウェブサイト https://www.w3.org/Style/CSS/Test/ で確認できる。 質問は public-css-testsuite@w3.org メーリング リストに送るべきである。

索引

この仕様により定義される用語

参照により定義される用語

参照文献

規範的参照文献

[CSS-BACKGROUNDS-3]
Elika Etemad; Brad Kemper. CSS Backgrounds and Borders Module Level 3. 2024年3月11日. CRD. URL: https://www.w3.org/TR/css-backgrounds-3/
[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-COLOR-4]
Chris Lilley; Tab Atkins Jr.; Lea Verou. CSS Color Module Level 4. 2024年2月13日. CRD. URL: https://www.w3.org/TR/css-color-4/
[CSS-CONTENT-3]
Elika Etemad; Dave Cramer. CSS Generated Content Module Level 3. 2019年8月2日. WD. URL: https://www.w3.org/TR/css-content-3/
[CSS-PSEUDO-4]
Daniel Glazman; Elika Etemad; Alan Stearns. CSS Pseudo-Elements Module Level 4. 2022年12月30日. WD. URL: https://www.w3.org/TR/css-pseudo-4/
[CSS-UI-4]
Florian Rivoal. CSS Basic User Interface Module Level 4. 2021年3月16日. WD. URL: https://www.w3.org/TR/css-ui-4/
[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/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[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
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. Selectors Level 4. 2022年11月11日. WD. URL: https://www.w3.org/TR/selectors-4/

プロパティ索引

名前 初期値 適用対象 継承 % 値 アニメーション型 正規順序 算出値
slider-orientation auto | left-to-right | right-to-left | top-to-bottom | bottom-to-top auto すべての要素 no n/a 離散 文法どおり 指定どおり

Issue 索引

appearance の定義をここに移す。
実装、実験、bikeshedding、およびユーザーエージェントスタイルシートの改善を通じて、 これらの例を洗練する。
図を追加する。
命名はまだ議論中である。 [Issue #9830]
autofill で使用される部品を収集する。
それを実装するユーザーエージェント向けに、パスワード表示切り替えについて何かを定義するか? [Issue #11845]
::placeholder::field-text とどのように相互作用するかを定義する。 [Issue #11844]
リサイザーについて何かを定義する。 [Issue #11850]
::placeholder::field-text とどのように相互作用するかを定義する。 [Issue #11844]
実際の画像を挿入する。
実際の画像を挿入する。
名前は ::swatch と ::color-swatch のどちらにすべきか? [Issue #11837]
これが UA ロジックを再現できることを確認する。 [Issue #11336]
これらを HTML の定義にリンクする。
何かを定義する。 [Issue #7422]
これは実装の準備ができていない。これに関する issue を提出する。
データ漏出に関して、プライバシー上の影響を検討する。 [Issue #11860]
より多くの型を追加することを検討する。 [Issue #11842]
field-sizing/accent-color/input-security をこの仕様に移すか?
このプロパティを作り直す。
HTML に移す。
この節は実装により洗練する必要がある。
色入力スタイルは洗練する必要がある。 [Issue #11837]
meter、progress、switch および range input のスタイル付けを洗練する。
<progress> および <meter> のスタイル付け
<select> と <datalist> のスタイル付け提案および/またはホワイトボード写真を挿入する。