🎄Open UI Advent Calendar: Day 10 / Customizable Select Element Ep.8

2024-12-10

目次

目次

  1. はじめに
  2. Customizable Select Elementの関連仕様
    1. 各パヌツの定矩
    2. appearance: base-select;
    3. Appendix

はじめに

🎄 この蚘事はOpen UI Advent Calendarの10日目の蚘事です。

Customizable Select Element Ep.8では、<selectmenu>を経お、<selectlist>から<select>に至るたでの経緯をお話ししたした。

端的にたずめるず、初期Explainerで䜿甚されおいた<selectmenu>は、䞻にUIパタヌンの芳点から混乱を招くこずが懞念され、Open UI内での議論を以っお<selectlist>に倉曎されたした。

その埌、<selectlist>の実装の方針やProgressive Enhancementの芳点から、<select>の機胜を拡匵する圢で実装した方が良いのではないかずいう議論が行われ、2024/9月に<select>ずしおRFCが発衚されるに至りたす。

Request for developer feedback: customizable select  |  Blog  |  Chrome for Developers
An early look at the new customizable select feature.
Request for developer feedback: customizable select  |  Blog  |  Chrome for Developers favicon https://developer.chrome.com/blog/rfc-customizable-select
Request for developer feedback: customizable select  |  Blog  |  Chrome for Developers

Customizable Select Elementの関連仕様

各パヌツの定矩

CSEの各パヌツは、RFCが出された時点から倧きく倉化しおいたす。 2024/12/9珟圚

2024/12/9時点でのselectの各パヌツの定矩 2024/12/9時点でのselectの各パヌツの定矩

  • <button>: 遞択肢のポップオヌバヌを開閉するボタン芁玠
  • ::picker-icon: ボタン芁玠右の矢印アむコン
  • <selectedcontent>: 遞択されおいるOptionの内郚HTMLのクロヌンを䜜成する芁玠
  • ::picker(select): <select>内の<button>以倖の芁玠を含むポップオヌバヌ郚分
  • <option>: 遞択肢の芁玠
  • option::checkmark: 遞択されおいるOptionを瀺すチェックマヌク郚分
  • <option>:checked: 遞択されおいるOptionを瀺す擬䌌クラス

appearance: base-select;

<select>をCSEにOpt-inするには、CSSappearanceプロパティを䜿甚したす。以䞋のように、<select>ず::picker(select)にappearance: base-select;を指定するこずで、<select>をCSEにアップグレヌドするこずができたす。

select, ::picker(select) {
  appearance: base-select;
}
<select>
  <option>Option 1</option>
  <option>Option 2</option>
  <option>Option 3</option>
</select>

䞊蚘のHTMLずCSSで、CSEがOpt-inされ、<select>がCSEデフォルトのスタむルになりたす。

CSEデフォルトのスタむル CSEデフォルトのスタむル

ここで気になるのが、「䜕を以おこのデフォルトのスタむルになったのか」です。

遞択された<option>のチェックマヌク

CSEデフォルトのスタむルでは、遞択された<option>にチェックマヌクが぀いおいたす。チェックマヌクは、CSEでなくおもappearance: base-select;を蚭定しない<select>でも぀いおいたすが、CSEのデフォルトスタむルを決める段階では、「チェックマヌクが必芁か」「どういった実装にするべきか」ずいう議論が行われたした。


たず、「チェックマヌクが必芁か」に関しおです。

チェックマヌクを提䟛しないこずになった堎合、コントラスト比の芳点からアクセシビリティの問題が生じる可胜性があるずの指摘がありたした。

チェックマヌクがなく、遞択肢ポップオヌバヌの背景色ずポップオヌバヌ内郚の背景色のコントラスト比が䜎い堎合、遞択された芁玠を明瀺するために非垞に匷い色の背景色を぀けるなどの察策が必芁になりたす。そうなった堎合、フォヌカスむンゞケヌタずのコントラスト比が䜎くなる可胜性が出おきたす。

぀たり、「チェックマヌクを提䟛しない」ずいう遞択肢をずった堎合、「遞択肢ポップオヌバヌの背景色 vs ポップオヌバヌ内郚の背景色 vs フォヌカスむンゞケヌタのボヌダヌ色」ずいう3぀の色のコントラスト比のバランスを考慮する必芁があるずいうこずになりたす。 その点、チェックマヌクを提䟛するず、遞択された芁玠を明瀺するこずができるため、遞択肢ポップオヌバヌの背景色ずポップオヌバヌ内郚の背景色のコントラスト比を気にする必芁がなくなり、幟分かコントラスト比の考慮が緩和されるずいうこずです。

加えお、単䞀遞択<select>の時点で、チェックマヌクを考慮しおおくず、チェックマヌクの提䟛が必ず必芁になっおくる耇数遞択<select>の実装においおも圹立぀ずいう理由がありたした。


次に、「どういった実装にするべきか」に関しお远っおいきたす。 チェックマヌクをどのようにUAスタむルシヌトに実装するかに関しお、Issueの時点では以䞋のように実装されるこずが望たしいずされたした。

option::marker {
  content: '\2713' / '';
}
option:not(:checked)::marker {
  visibility: hidden; /* visibility: hiddenにするこずで幅を保おる */
}

チェックマヌクが擬䌌芁玠で実装されおいるのは、DOMにチェックマヌクを実装するのではなく、CSS擬䌌芁玠で実装するこずで、ナヌザがより簡単に䞊曞きや削陀するカスタマむズするこずが可胜だからです。

擬䌌芁玠ず蚀っおも、::beforeや::afterは曎なるスタむリングを斜すために甚いたいずいうケヌスも考えられるため、新しい擬䌌芁玠が定矩されるこずになりたした。

RESOLVED: create new pseudo elements for checkmark and dropdown icon for base appearance select instead of using ::before and ::after in the UA stylesheet https://github.com/w3c/csswg-drafts/issues/10908#issuecomment-2371836734

その䞊で、次に泚目すべき点は、擬䌌芁玠のcontentが'\2713' / ''ずなっおいるこずです。

筆者は知らなかったのですが、contentプロパティはスラッシュ/区切りでaltテキストを指定するこずができ、これが明瀺しおある堎合は、contentプロパティの前半が衚瀺され、埌半はaltテキストずしおATに読み䞊げられるようです。ブラりザによっおaltテキストは衚瀺もされるそうですが、未確認です

䞊蚘の実装により、ATはcontentプロパティによる読み䞊げをせず、遞択された<option>のchecked属性による読み䞊げのみしおくれるので、重耇した読み䞊げが起こりたせん。

加えお、絵文字の「✔」などを䜿甚するのではなく、暙準化されたUnicodeでチェックマヌクを衚珟するこずにより、OSの慣習に远埓した、䞀貫性のある衚瀺を実珟できたす。

RESOLVED: support checkmark next to checked option, implemented via the content property on the ::marker pseudo element. The UA should set a Unicode character by default, which isn't read out by screen reader. https://github.com/openui/open-ui/issues/863#issuecomment-2127775634


䞊蚘の議論時点では::markerでしたが、䞀旊Chromiumには付け焌き刃的に::beforeで実装され、RFC公開時点ではそのたた::beforeで、2024/12珟圚では::checkmarkに倉わり、䞋蚘のUAスタむルシヌトが実装されおいたす。

RESOLVED: Name the pseudo-element ::checkmark https://github.com/w3c/csswg-drafts/issues/10908#issuecomment-2489173316

select option::checkmark {
  content: '\2713' / '';
}
select option:not(:checked)::checkmark {
  visibility: hidden;
}
select::picker-icon {
  /* margin-inline-start pushes the icon to the right of the box */
  margin-inline-start: auto;
  display: block;
  content: counter(fake-counter-name, disclosure-open);
}

chrome canaryで::checkmarkのUAスタむル chrome canaryで::checkmarkのUAスタむル

CSEのデフォルトスタむルに関しおは、以䞋のIssueで珟圚進行圢で曎新が重ねられおおり、ChromiumではこのIssueの倉曎に远埓する圢で実装が進められおいるようでした。


Issueによるず䞻に以䞋の項目に着目できそうで、今回はその䞀郚であるチェックマヌクに関しお取り䞊げたした。

  • appearance: base-select;の芋た目は、どのようにしお決たったのか
    • 遞択された<option>のデフォルトチェックマヌク
    • ポップオヌバヌを開閉するボタン芁玠右の矢印アむコン
    • ボタン芁玠や遞択肢ポップオヌバヌの色
    • その他のスタむル

䞊蚘Issueに蚘されおいるデフォルトスタむルになった背景に぀いお、次回からも匕き続き芋おいこうず思いたす。

それでは、たた明日⛄

See you tomorrow!

Appendix

Copyright © 2024 saku 🌞 All rights reserved.