はじめに
Customizable Select Element Ep.9から、 appearance: base-select;
で提供される、CSEのデフォルトの見た目が決定された背景の議論をお話ししています。
Ep.9では、<option>::checkmark
が現状の見た目となった背景について深掘りました。
今回は、::picker-icon
部分について取り上げます。
2024/12/9時点でのselectの各パーツの定義
Customizable Select Elementの関連仕様
ボタン要素右の矢印アイコン
CSEのデフォルトのスタイルでは、ポップオーバー部分をトリガーする<button>
の右に「▼」矢印アイコンが表示されます。
初期段階では、この矢印アイコンはselect::after
として実装されていましたが、後に::select-arrow
となり、現在では::picker-icon
となっています。
デフォルトスタイルを決めるIssueの初期段階では、select::after
という既存の擬似要素をそのまま使用して提案されていました。(現在はこのIssueの親コメントの内容は最新のものに変わっている)
もともと::before
や::after
で実装されていたのは、::before
や::after
が「diplay: none;
などで簡単に上書きできる」という要件を満たしつつ、UAスタイルシートでの実装も容易だったためです。
しかし、デフォルトの擬似要素に加えて、::before``::after
を要素に当てたいというユースケースも考えられます。
例えば、<li>
のデフォルトの行頭文字はBulletで::marker
としてレンダーされますが、<li>
に::marker
だけでなく::before
でも「何か別の要素(🎄)」を配置したい場合、以下のように記述できます。
::marker
を上書きする
しかし、もし::marker
が存在せず、UAスタイルシートにli::before
でBulletが実装されていた場合はどうでしょうか。<li>
の::before
はもうUAによって使われているため、Bulletと「何か別の要素(🎄)」の二つを配置することは困難です。
これに関して、デフォルトでは::select-arrow
などの新しい擬似要素を提案するべきとの指摘があり、TPAC 2024のOpen UIとCSSWGのJoint Sessionで話し合われる運びになりました。
先ほどの::marker
のようなケースのみならず、既存の::before``::after
をUAで使用するとさまざまな考慮事項が発生します。
例えば、Authorスタイルシートの::after
を使ってボタン要素右の矢印アイコンを全く独自のものに置き換えるケース考えてみましょう。
以下のように、UAスタイルシートがボタン要素右の矢印アイコンを::after
で実装すると、以下をやらねばならなくなります。
- UAスタイルシートの
select::after
に何が当たっているかDevToolsを開いて確認する - Authorスタイルシートで以下の3つのプロパティを上書きする
- 独自のアイコンにするためのスタイルを当てる
一方、UAが、::before
::after
ではなく新しい擬似要素で実装すると、新しい擬似要素をdisplay: none;
するだけで、デフォルトの矢印アイコンを削除でき、Authorスタイルシートでの上書きが容易になります。
加えて、目的に沿った命名の擬似要素を定義することで、要素の目的を明確にできるという利点もあります。
こうした議論の結果、既存の::after
ではなく、新しく擬似要素を定義するという結論に至りました。
RESOLUTION: create new pseudo elements for checkmark and dropdown icon for base appearance select instead of using ::before and ::after in the UA stylesheet ACTION: Tab and fantasai to make better words for this in the css-pseudo spec
擬似要素のカテゴリ
新しい擬似要素を実際に仕様書に記載する際、擬似要素をTree-AbidingとするかElement-Backedにするかという話がありました。
擬似要素は2種類に大別でき、Tree-AbidingとElement-Backedはそれぞれ以下のような特徴があります。
tree-abiding
な擬似要素: TreeにAbide(従う・倣らう)要素。それ自体は要素としてBox Treeの中には存在しない。レンダーするコンテンツは、content
プロパティ内に指定する e.g.::before
,::after
,::select-arrow
(::picker-icon
)
Tree-Abiding擬似要素
element-backed
な擬似要素: Tree Abidingの中でも、Box Tree内のイチ要素となるもの e.g.::part()
,::picker
Element-Backed擬似要素
::selected-arrow
は、元々select::after
として定義&実装されていたように、それ自体はBox Treeの中には存在しないtree-abiding
な擬似要素なので、仕様書にもtree-abiding
な擬似要素とカテゴライズされることになりました。
gregwhitworth RESOLVED: add pseudo-elements for the select button and option checkmarks which are fully stylable pseudo-elements with content specified by the content property https://logs.csswg.org/irc.w3.org/css/2024-10-24/
::selected-arrow
、::picker-icon
に決定される
::selected-arrow
は暫定的な名前だったため、要素に対する議論&投票が行われ、最終的に::picker-icon
に決定され、Chromiumの実装に反映されました。
RESOLVED: go with ::picker-icon https://github.com/w3c/csswg-drafts/issues/10908#issuecomment-2489173316
以下は、デフォルトの::picker-icon
をカスタマイズした例です。
デモ:
今回はポップオーバーを開閉するボタン要素右の矢印アイコン、::picker-icon
を取り上げました。
-
appearance: base-select;
の見た目は、どのようにして決まったのか- 選択された
<option>
のデフォルトチェックマーク - ポップオーバーを開閉するボタン要素右の矢印アイコン
- ボタン要素や選択肢ポップオーバーの色
- その他のスタイル
- 選択された
上記Issueに記されているデフォルトスタイルになった背景について、次回からも引き続き見ていこうと思います。
それでは、また明日⛄
See you tomorrow!