🎄Open UI Advent Calendar: Day 15 / Customizable Select Element Ep.13

2024-12-15

目次

目次

  1. はじめに
  2. Customizable Select Elementの関連仕様
    1. 遞択された<option>のコンテンツを<button>に反映するこずの正圓化
    2. 遞択された<option>のコンテンツを<button>に反映する方法の怜蚎
    3. innerHTMLをクロヌンするこずの問題
    4. Appendix

はじめに

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

Ep.12では、part属性を䜿甚するこずの問題、解決策ずしおbehavior属性の提案、そしお、芁玠をCloneしおカスタマむズ可胜にする<selectedcontent>の契機に぀いおお話ししたした。

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

Customizable Select Elementの関連仕様

遞択された<option>のコンテンツを<button>に反映するこずの正圓化

圓時の<selectmenu>の仕様では、「<slot name="selected-value">に、遞択された<option>のvalueを反映し、behavior属性で倖郚からShadow DOMのカスタマむズ可胜にする」ずいうこずたで可胜でした。Ep.12参照

しかしこれは、「<option>のvalueだけでなく、遞択された<option>内芁玠自䜓のクロヌンを反映すべきだろうか反映するずしたらどのような手法で行うべきだろうか」ずいう議論に波及したす。

たず、これを実装するモチベヌションずなるナヌスケヌスが考えられ、「アバタヌ + 名前」、「名前のみ」、「囜旗 + 囜名」などの䟋が挙げられたした。 「アバタヌ + 名前」や「囜旗 + 囜名」のように「リッチなコンテンツの完党なクロヌン」ずなる堎合もあれば、「名前のみ」のように「リッチなコンテンツの䞀郚のクロヌン」ずなる堎合も考えられたす。 このナヌスケヌス調査により、完党なクロヌンを反映するこずのみならず、その䞀郚のみを<select>に衚瀺できるようにする必芁があるずいう合意が取れたした。

囜旗 + 囜名 囜旗 + 囜名 アバタヌ + 名前 アバタヌ + 名前 名前のみoptionにアバタヌはあるが、buttonには反映されない 名前のみoptionにアバタヌはあるが、buttonには反映されない

遞択された<option>のコンテンツを<button>に反映する方法の怜蚎

その䞊で、どう実珟するかに぀いお議論され、以䞋の4぀の方法が提案されたした。

  1. Clone innerHTML of the option and insert that into the selected value part and leverage CSS to hide what you don't want rendered
  2. Provide an implicit slotting functionality
  3. Provide an attribute that enables referencing what content you want cloned
  4. Keep as it's currently defined which is to take the inner text of the option and insert that into the selected value part

  1. <option>のinnerHTMLをクロヌンしお<button>ぞ実際に挿入し、衚瀺したくない郚分はCSSで隠す
  2. 遞択された芁玠を暗黙的に<button>郚分ぞスロットするこずで実珟する
  3. 属性によっお、クロヌンしたいコンテンツを参照する
  4. <option>内のテキストを<button>に挿入する(珟圚の仕様のたた) https://github.com/openui/open-ui/issues/571#issuecomment-1298712385

たず、2の「遞択された芁玠を暗黙的に<button>郚分ぞスロットするこずで実珟する」方法を実珟するには、ドロップダりンが開いおいる状態のずき、スロット元の遞択された芁玠がドロップダりンの䞭に存圚し぀぀、button郚分ぞスロットもされなければなりたせん。しかし、「スロットし぀぀、スロット元にも衚瀺する」を実珟する機胜は、珟状の<slot>ではサポヌトされおいたせん。

📝 クロヌンずスロット:

これたでで䜕床かクロヌンずいう衚珟ずスロットずいう衚珟を出したので、ここで䞀床敎理しおおきたす。

  • クロヌン: DOMの仕様の䞀郚。Node.cloneNode()を䜿っお、DOMノヌド自䜓を他の堎所に耇補するこず。”耇補”なので、クロヌン元にも実態が残る。clonableなShadow DOM内の芁玠を耇補するこずもできる。
  • スロット: DOMの䞭でも、Shadow DOMの仕様の䞀郚。Shadow Root内の<slot>を眮いた箇所に、倖郚から芁玠を挿入するための仕組み。slot元の芁玠はslot先から参照され、slot先に実態はない。

これに関しおは、Content Mirroringが実装されるこずで可胜になりたすが、実装の目凊が立っおいないselectmenuを実装するこずよりもハヌドルが高い可胜性があるので、採甚は芋送りたいずいうこずから深く議論されたせんでした。

たた、4の「<option>のinnerTextを<button>に挿入する」方法は、これからの議論で、innerHTMLをクロヌンする手法が適合しない・難しいず刀断された堎合の、最も劥圓な遞択肢ずいう立ち䜍眮になりたした。

そこで、実際にクロヌンした芁玠を挿入するこずで、衚瀺したいものずしたくないものを出し分けしやすく、開発のしやすさの芳点からも最も優れおいる、1の「<option>のinnerHTMLをクロヌンしお<button>ぞ実際に挿入し、衚瀺したくない郚分はCSSで隠す」方法に぀いお話し合われおいきたす。

innerHTMLをクロヌンするこずの問題

しかし、1をサポヌトする䞊での懞念が䞊がりたす。

たず、<option>内にIDが含たれおいる堎合、そのIDが耇補されるこずで、ペヌゞ内でIDの重耇が発生したす。それにより、JSがIDで<option>のコンテンツをク゚リしおいる堎合、innerHTMLをクロヌンするこずでIDが重耇し、ク゚リが壊れる可胜性が指摘されたした。

たた、<option>自䜓をコピヌせずに、<option>の子芁玠コンテンツをクロヌンするずいう実装をした堎合、スタむルが壊れる可胜性もありたした。䟋えば、以䞋のようなCSSを曞いお、<option>内のコンテンツ.redOptionにスタむルを圓おおいた堎合、<option>のコンテンツのみをクロヌンする実装では、クロヌンされた先でスタむルが圓たりたせん。

option .redOption { background-color: red }

そのため、<option>自䜓をクロヌンする実装にするのかずいうず、<button>内に<option>が存圚するこずになり、あたりにも䞍自然です。

そしお、<option>内にShadow Rootがある堎合の取り扱いに぀いおも考慮されるべきずいう指摘がありたした。単玔なinnerHTMLでは、Shadow Root内のコンテンツが取埗できないため、クロヌンされたせん。

珟状は、以䞋のようなJavaScriptを甚意するこずで、実珟したいこずは達成されるので、わざわざ暙準化せずずも、ペヌゞ開発者自身が必芁に応じおスクリプトを甚いお実装するこずが可胜です。開発者自身でオプトむン可胜なこずをここで暙準化するず、<selectmenu>自䜓のShipが遅れおしたうずいうのが、Jarharの䞻匵でした。

selectmenu.addEventListener('change', () => {
  selectedvalue.innerHTML = selectmenu.selectedOption.innerHTML;
  selectedvalue.className = selectmenu.selectedOption.className;
});

これらの暙準化の難しさを螏たえ、<selectmenu>では、遞択された<option>のinnerHTMLのクロヌンを暙準化すべきではないずいう結論に至りたした。 圓時の時点では、代わりに、開発者が必芁に応じお、スクリプトを甚いおこの機胜を実装するこずが掚奚されるこずになりたす。

RESOLVED: Don't implement behavior to copy innerHTML from the selected option into the selected value for V1 of selectmenu https://github.com/openui/open-ui/issues/571#issuecomment-1472206358

将来的には、実装される可胜性のあるContent Mirroringを甚いお、オプトむンの圢でこの機胜を提䟛する可胜性があるこずにも觊れられお、この議論自䜓は䞀旊この結論でたずたりたした。


぀たり、この時点では、遞択された芁玠をクロヌンしおカスタマむズ可胜にするこずに関しおは議論されたものの、䜕か新たに仕様策定されるずいいうこずはなく、<selectmenu>は匕き続き、slot属性ずbehavior属性を䜿甚しおカスタマむズする方針のたたでした。

そんな䞭提起された、slot属性ずbehavior属性ぞの疑念が、こずを前に動かしたす。


それでは、たた明日⛄

See you tomorrow!

Appendix

Copyright © 2024 saku 🌞 All rights reserved.