🎄Open UI Advent Calendar: Day 22 / Customizable Select Element Ep.20
Published on
Customizable Select Elementのまとめ
Table of Contents
Table of Contents
はじめに
今回は、20 日をかけて連載してきた、Customizable Select Element についてまとめる、シリーズの最終エントリです。
Customizable Select Elementまとめ
Ep.1 から Ep.19 にかけて、Customizable Select Element の提案に関連する仕様の変遷を追ってきました。
- Ep.1:
- Prologue: Customizable Select Element。HTML Form Control の歴史から、Form Control のスタイルは CSS から制御することができず、ブラウザや OS に依存していたことを振り返る。
- Ep.2:
- ブラウザ戦争の激化と、OS に依存したコントロールの問題の顕在化。打開する動きとして、WaSP による Web 標準の台頭への動き、モダンブラウザの登場、より柔軟なスタイリングを可能にする CSS3 の登場へ。
- Ep.3:
- Web 標準化の動きが進んでもなお、Customizable でない Form Control の紹介。Customizable Select Element 提案の契機となるサーベイ結果。
- Ep.4:
- Greg や Mason による一連の調査を踏まえ、Domenic が Open UI で CSE の初期提案を行う。
- Ep.5:
- Open UI で CSE の Research が行われる。同時期に MS で
<selectmenu>
Explainer の作成。Explainer に基づいて、<selectmenu>
が Intent to Prototype に。
- Open UI で CSE の Research が行われる。同時期に MS で
- Ep.6:
<selectmenu>
が<selectlist>
にリネーム。既存の UI パターンとの混乱を避けるため。
- Ep.7:
<selectlist>
が<select>
にリネーム。<selectlist>
/<listbox>
は<select>
/<datalist>
の組み合わせでも実現可能&Progressive Enhancement の観点を考慮したため。
- Ep.8:
- 現状の CSE デフォルトスタイルの紹介。ここから、
appearance: base-select;
の見た目はどう決まったのかを探る。Ep.8 では、選択された<option>
のデフォルトチェックマークのスタイルの決定背景について。
- 現状の CSE デフォルトスタイルの紹介。ここから、
- Ep.9:
::picker-icon
のデフォルトスタイルの決定背景について。
- Ep.10:
::picker(select)
のデフォルトスタイル。特に、デフォルト Color から探る system-color/ color-scheme/ prefers-color-scheme の関係。
- Ep.11:
<selectedcontent>
提案のきっかけとなった Issue の紹介。選択された<option>
の value とスタイルを反映する初期の仕組みとして、part
属性とslot
属性。
- Ep.12:
part
属性を CSE の UA 実装で使用することの問題。part
属性をbehavior
属性にリネーム。Greg が、<option>
の value のみならず、<option>
の内部コンテンツ自体を<selectedcontent>
に反映する仕様を示唆する。
- Ep.13:
<option>
の内部コンテンツ自体を<selectedcontent>
に反映する方法の検討。innerHTML
を使用して内部コンテンツを反映する方法は見送り。slot
属性とbehavior
属性を用いた、value とスタイルの反映のみ可能なまま。
- Ep.14:
slot
属性とbehavior
属性使用への疑念。WHATWG の Domenic と、Open UI 側の間で議論が白熱する。結果として、「選択された<option>
を<button>
にスロットしてカスタマイズできるようにする」唯一の手段であった、slot
属性とbehavior
属性が使用廃止へ。
- Ep.15:
slot
属性とbehavior
属性が使用廃止を受けて、新しい CSE Anatomy が考案される。選択された<option>
の子 Node を、cloneNode()
で、<selectedoption>
の Light DOM にクローンする手法が提案される。これは、HTML 史上初となる、UA から Light DOM へ変更を加える実装の契機となるもの。
- Ep.16:
- Light DOM へのクローン追加実装か、はたまた Shadow DOM にするのか。WHATWG のみならず、CSSWG と合意形成がなされ、Light DOM へのクローン追加実装で確定。加えて、
<selectedcontent>
の実装に関する議論の現状、特に「クローンタイミング」に関する懸念を深掘る。
- Light DOM へのクローン追加実装か、はたまた Shadow DOM にするのか。WHATWG のみならず、CSSWG と合意形成がなされ、Light DOM へのクローン追加実装で確定。加えて、
- Ep.17:
- 「同期タイミング」「マイクロタスクタイミング」「CEReaction タイミング」、3つの異なるクローンタイミングのうち、どれを採用するのか問題。この時点では、パフォーマンスの面で優れた「マイクロタスクタイミング」が有力に。
- Ep.18:
- 「CEReaction タイミング」でのクローンが検討されるも、WHATNOT での議論の結果、「同期タイミング」でクローンを作成する方針に切り替わる。加えて、
<option>
内がリッチコンテンツの場合における、cloneNode()
の制限を紹介。
- 「CEReaction タイミング」でのクローンが検討されるも、WHATNOT での議論の結果、「同期タイミング」でクローンを作成する方針に切り替わる。加えて、
- Ep.19:
- そもそも「Node 変更検知のタイミング」を UA 側でコントロールする必要があるのか?という、Jake の問題提起に基づき、デフォルトでは変更検知でのクローンはせず、更新をトリガーする方法を別で提供する方法が採用される。
cloneNode()
の制限については、現在も議論中。
- そもそも「Node 変更検知のタイミング」を UA 側でコントロールする必要があるのか?という、Jake の問題提起に基づき、デフォルトでは変更検知でのクローンはせず、更新をトリガーする方法を別で提供する方法が採用される。
やり残したこと
この全 20 シリーズを通して追うことができた CSE の仕様は、おおよそ以下くらいです。
appearance: base-select;
を指定することによる、CSE デフォルトの見た目- 選択された Option にはチェックマークがつく
- ドロップダウン Icon のデフォルトの見た目
::picker(select)
のデフォルト色- その他デフォルトスタイルに関して:[css-ui] UA stylesheet for appearance base
<select>
· Issue #10857 · w3c/csswg-drafts
<selectedcontent>
には、選択された要素のクローンが作成された背景- 選択された
<option>
の変更を検知し、クローンを<selectedcontent>
に反映するタイミングに関して
主に次のようなトピックはやり残してしまいました。
- 現状の
<select>
を使用しつつ、段階的に移行できる手段としてappearance: base-select;
を提供している - なぜ CSS で CSE を Opt-in するようにしたのか
::picker(select)
が Top Layer であることを示す:open
の追加に関して<select>
の Content Model に関する検討<select>
のmultiple
、size
属性はサポートの可能性
その他、CSE に関する表層の Issue は以下にまとまっています。
Customizable `<select>` element · Issue #9799 · whatwg/html
This proposal includes parser, styling, and rendering changes to make the <select> element fully customizable by authors. Explainer: https://open-ui.org/components/customizableselect Spec PRs: #105...
また、本エントリ執筆時点での各ベンダの Standard Positions は次の通りです。
- WebKit
- Mozilla
Epilogue: Customizable Select Element
歴史的経緯から、スタイル設定や機能の拡張に関しての制限が大きく、これまで多くの開発者を悩ませてきた<select>
は、CSE の提案によって大きく変わりつつあります。
その過程で、UA からの Light DOM 変更や、Popover API、Anchor Positioning の提案など、これまでの Web では実現が不可能だった機能に対する標準化の議論がなされてきました。
進化的な仕様を多く包含したこの提案は、Form Control のほんの 1 要素である<select>
をカスタマイズ可能にするだけではなく、これまでの仕様では実現が難しかったさまざまな Web の新機能を実現する、大きな一歩となり得ます。
CSE のを構成する仕様の策定は現在進行形で行われています。最後の機能が Intent to Ship になるのが待ち遠しいですね!
それでは、また明日⛄
See you tomorrow!
Appendix
- select: Should
<selectedoption>
respond to mutations in the selected<option>
· Issue #825 · openui/open-ui - Add
<selectedcontent>
element by josepharhar · Pull Request #528 · w3c/html-aria - Define the
<selectedcontent>
element by josepharhar · Pull Request #10633 · whatwg/html - [html-aam] Addition: selectedoption element by scottaohara · Pull Request #2344 · w3c/aria
- 5370555: Implement
for StylableSelect