目次
はじめに
今回は、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...
https://github.com/whatwg/html/issues/9799
また、本エントリ執筆時点での各ベンダの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