การจัดสไตล์ตัวควบคุมแบบฟอร์ม เช่น องค์ประกอบ <select>
ได้รับการรายงานว่าเป็นปัญหาหลักของนักพัฒนาซอฟต์แวร์มาหลายปีแล้ว และเราก็พยายามหาวิธีแก้ปัญหานี้ แม้ว่างานนี้จะซับซ้อนและใช้เวลานาน แต่เรากําลังใกล้จะเปิดตัวฟีเจอร์นี้ องค์ประกอบ select เวอร์ชันที่ปรับแต่งได้อยู่ในระยะที่ 2 อย่างเป็นทางการใน WHATWG โดยมีความสนใจในการใช้งานข้ามเบราว์เซอร์อย่างมาก และมีต้นแบบให้คุณทดสอบได้จาก Chrome Canary 130
ลองใช้และแสดงความคิดเห็น
ตรวจสอบว่าการติดตั้ง Chrome Canary อัปเดตเป็นเวอร์ชัน 130 แล้ว และคุณเปิดใช้ Flag ฟีเจอร์แพลตฟอร์มเว็บเวอร์ชันทดลองไว้ คุณเปิด Flag นี้ได้โดยไปที่ chrome://flags ในแถบที่อยู่ แล้วเปิด #experimental-web-platform-features จากนั้นคุณควรจะเห็นตัวอย่าง Codepen ในโพสต์นี้ หรือจะดูคอลเล็กชัน Codepen นี้เพื่อดูทั้งหมดในที่เดียวก็ได้
ใช้แบบฟอร์มนี้เพื่อแสดงความคิดเห็นเกี่ยวกับฟีเจอร์ โดยใช้เวลาเพียง 3 นาที
มาเจาะลึกฟีเจอร์ของ Select API ที่กําหนดเองได้ ซึ่งสร้างขึ้นจากแท็ก HTML Select ที่มีอยู่
เลือกใช้ <select>
เวอร์ชันใหม่
หากต้องการเลือกใช้ลักษณะการทำงานใหม่ ให้ใช้พร็อพเพอร์ตี้ appearance
ของ CSS ทั้งในปุ่มเลือกในหน้าเว็บและเครื่องมือเลือก หากต้องการเลือกใช้ ให้ตั้งค่า appearance: base-select
บนองค์ประกอบ <select>
และ ::picker(select)
::picker(select)
เป็นองค์ประกอบจำลองใหม่ที่ User Agent ระบุ ซึ่งมีผลกับองค์ประกอบ <select>
ที่ได้รับการเลือกให้ใช้ลักษณะการทำงานใหม่โดยใช้ appearance: base-select
เท่านั้น องค์ประกอบจำลองเครื่องมือเลือกนี้คือป๊อปอัปที่ปุ่มเลือกพื้นฐานเรียกให้แสดง คุณเลือกรับทั้ง 2 รายการได้ดังที่แสดงในโค้ดต่อไปนี้
select,
::picker(select) {
appearance: base-select;
}
คุณเลือกเลือกใช้เฉพาะปุ่มในหน้าได้ แต่เลือกเลือกใช้เฉพาะป๊อปอัปเครื่องมือเลือกโดยไม่เลือกใช้ปุ่มในหน้าไม่ได้ ระบบจะสร้าง ::picker(select)
เพียงครั้งเดียวเมื่อมีการใช้ appearance: base-select
กับ <select>
ตอนนี้คุณก็พร้อมปรับแต่งองค์ประกอบที่เลือกแล้ว ตัวเลือกแบบใหม่ที่กำหนดค่าได้มาพร้อมกับสไตล์เริ่มต้นบางสไตล์ที่ดูเหมือนกันในเบราว์เซอร์และระบบปฏิบัติการต่างๆ ตัวเลือกที่ปรับแต่งเริ่มต้นจะมีลักษณะดังนี้เมื่อเทียบกับตัวเลือกที่มีอยู่ใน Chrome บน macOS
รายละเอียดของส่วนต่างๆ
เมื่ออยู่ในโหมดเลือกแบบปรับแต่งใหม่ องค์ประกอบใหม่ที่คุณมีสิทธิ์เข้าถึงมีดังนี้
- selectedoption
: แสดง HTML ภายในของตัวเลือกที่เลือกอยู่
- option::before
: มีเครื่องหมายถูกเพื่อระบุว่าตัวเลือกที่เลือกอยู่ในปัจจุบันเป็นสิ่งอํานวยความสะดวกในการช่วยเหลือพิเศษเริ่มต้น (อาจมีการเปลี่ยนแปลง)
- ::picker(select)
: ข้อความป๊อปอัปที่มีเนื้อหาทั้งหมดนอก button
ภายในตัวเลือกที่กำหนดเองได้
คุณจัดรูปแบบส่วนใดก็ได้ของรายการที่เลือก เช่น คุณสามารถเพิ่มเนื้อหาแบบไม่โต้ตอบซึ่งกำหนดเองภายในองค์ประกอบ <option>
จัดสไตล์ปุ่มในหน้าเว็บที่เปิดเมนูแบบเลื่อนลงแบบเลือก และจัดสไตล์รายการตัวเลือกแบบเลื่อนลง (::picker(select)
)
นอกจากนี้ คุณยังจัดสไตล์ button
, ตัวบ่งชี้ลูกศรที่นำมาเอง และเพิ่มเนื้อหาที่ต้องการภายในและรอบๆ องค์ประกอบต่างๆ ได้ด้วย นอกจากการเพิ่มเนื้อหาแล้ว คุณยังซ่อนองค์ประกอบใหม่และสไตล์เริ่มต้นเหล่านี้ได้ด้วย เช่น หากไม่ต้องการใช้เครื่องหมายถูกตัวบ่งชี้ในองค์ประกอบสมมติ ::before ของตัวเลือก ให้ใช้ CSS ต่อไปนี้
/* Remove the default checkmark from the selected option */
option::before {
display: none;
}
แม้ว่าจะมีองค์ประกอบภายในรายการที่เลือกได้ไม่จำกัด แต่เบราว์เซอร์จะจัดกลุ่มทุกอย่างที่อยู่นอกองค์ประกอบ <button>
ไว้ในองค์ประกอบจำลอง ::picker(select)
ซึ่งจะทํางานแบบป๊อปอัปที่ยึดกับปุ่ม <button>
นี้จะสลับ ::picker(select)
ระบบจะยกตัวเลือกและองค์ประกอบอื่นๆ ภายใน select โดยตรงไปยัง ::picker(select)
หรือคุณจะนํา Wrapper ของคุณเองมาเพื่อจัดสไตล์ก็ได้ ไวลด์การ์ดนี้จะวางไว้ภายในองค์ประกอบจำลอง ::picker(select)
ด้วย
<select>
<button>
<selectedoption></selectedoption>
</button>
// Everything else that will go into the ::picker(select) popover
</select>
<select>
ที่ปรับแต่งได้แบบใหม่ใช้ฟังก์ชันการทำงานจากป๊อปอัปและตำแหน่งของจุดยึด ซึ่งสร้างขึ้นด้วยเทคโนโลยีพื้นฐาน 2 อย่างนี้ ซึ่งหมายความว่ารายการตัวเลือกแบบเลื่อนลงภายในรายการแบบเลือกจะทําหน้าที่เป็นป๊อปอัปที่ยึดกับปุ่มทริกเกอร์ที่เปิดรายการแบบเลือก
คุณสามารถใช้การวางตำแหน่งแอตทริบิวต์ "แองเคอร์" เพื่อจัดสไตล์ป๊อปอัป ::picker(select)
นี้ (รวมถึงทำให้ป๊อปอัปยึดกับองค์ประกอบอื่นๆ) รูปแบบเนื้อหานี้ยังหมายความว่ารูปแบบภาพเคลื่อนไหวของเลเยอร์บนสุดจะทำงานร่วมกับรายการตัวเลือกเพื่อสร้างเอฟเฟกต์ภาพเคลื่อนไหวของการเปิดและปิด
ปรับปรุงองค์ประกอบ <select>
ที่มีอยู่
ก่อนหน้านี้ ทีม Chrome กำลังพัฒนาแนวคิดเกี่ยวกับองค์ประกอบ <selectlist>
สิ่งที่อธิบายไว้ในโพสต์นี้คือฟีเจอร์ที่ออกแบบใหม่เพื่อนำองค์ประกอบ <select>
ที่มีอยู่มาใช้ซ้ำแทน
ประโยชน์หลักอย่างหนึ่งของการใช้องค์ประกอบ <select>
ที่มีอยู่ซ้ำคือความสามารถในการปรับปรุงองค์ประกอบ HTML พื้นฐานอย่างต่อเนื่อง เมื่อเทียบกับองค์ประกอบใหม่เอี่ยม การใช้ <select>
ซ้ำจะยังคงแสดงผลเนื้อหาที่มีความหมายในหน้าเว็บ ตัวอย่างต่อไปนี้แสดงรายการที่เลือกซึ่งปรับแต่งเองเทียบกับสิ่งที่ผู้ใช้ในเบราว์เซอร์ที่ไม่รองรับจะเห็น
การจัดรูปแบบพื้นฐาน
การเปลี่ยนแปลงอาจเป็นเรื่องง่ายๆ เช่น การจัดสไตล์ภาพองค์ประกอบที่เลือก เช่น อัปเดตสไตล์ปุ่ม สไตล์โฮเวอร์และโฟกัส หรือพื้นหลังของตัวเลือกที่เลือก หลังจากเลือกใช้ appearance: base-select
แล้ว ให้ใช้ CSS ที่ต้องการกับส่วนที่คุณเลือก
หากต้องการปรับแต่งตัวบ่งชี้ลูกศร ให้เพิ่มปุ่มและลูกศรของคุณเองภายในส่วน "เลือก"
<select>
<button>
<selectedoption></selectedoption>
<span>
// Arrow here
</span>
</button>
// Everything else that will go into the ::picker(select) popover
</select>
จากนั้นจัดรูปแบบลูกศรโดยทำดังนี้
/* style the arrow */
button span {
/* arrow styles */
transition: rotate 0.2s;
}
/* adjust arrow styles when the picker is open */
select:open button span {
rotate: -180deg;
}
เนื้อหาที่ซับซ้อนภายในตัวเลือก
ดำเนินการต่อด้วยความสามารถในการเพิ่มและจัดรูปแบบเนื้อหานอกเหนือจากสตริงภายในองค์ประกอบ <option>
ภายใน <select>
ตัวอย่างพื้นฐานคือการเพิ่มรูปภาพธงข้างชื่อประเทศในเมนูแบบเลื่อนลง โดยให้เพิ่มองค์ประกอบรูปภาพข้างข้อความตัวเลือก
<option value="france">
<img src="img/flag_of_france.svg" alt="" />
<span>France</span>
</option>
ตัวอย่างที่ซับซ้อนมากขึ้นอาจรวมถึงรูปโปรไฟล์ ชื่อ และข้อมูลอื่นๆ เพื่อช่วยให้คุณตัดสินใจเลือกรายการในเมนูแบบเลื่อนลง
<option value="eur">
<img src="euro-flag.png" alt="" />
<div class="currency">
<div class="currency-short">EUR</div>
<div class="currency-long">Euro</div>
</div>
<div class="symbol" aria-hidden="true">€</div>
</option>
จัดสไตล์ตัวเลือกที่เลือก
คุณอาจต้องการให้ตัวเลือกที่เลือกแสดงในสถานะที่เลือกแตกต่างจากในเมนูแบบเลื่อนลง ตัวอย่างของ UI นี้คือ UI ของ Gmail ซึ่งจะนําป้ายกำกับออกเมื่อเลือกตัวเลือกเพื่อประหยัดพื้นที่ โดยเชื่อมต่อกับองค์ประกอบ <selectedoption>
เพื่อจัดรูปแบบ <option>
ประกอบด้วยมาร์กอัปต่อไปนี้ทั้งหมด
<option value="reply-all">
<img class="material-symbol" src="material-symbol-reply.png">
<span class="text">Reply all</span>
</option>
ตอนนี้ให้ใช้ display: none
ใน .text
ภายใน <selectedoption>
เพื่อซ่อนเนื้อหาข้อความและแสดงเฉพาะไอคอน
selectedoption .text {
display: none;
}
ตัวเลือกแบบอินเทอร์แอกทีฟ
ควบคุมการจัดสไตล์ของ ::picker(select)
ได้อย่างเต็มรูปแบบ โดยต่อยอดจากเดโมก่อนหน้าเพื่อให้เป็นแบบอินเทอร์แอกทีฟเมื่อวางเมาส์เหนือและโฟกัส ในการแสดงตัวอย่างนี้ จะใช้ฟังก์ชัน calc-size() ใหม่เพื่อสร้างภาพเคลื่อนไหวของช่องเลือกจากการแสดงไอคอนเป็นการแสดงตัวเลือกเต็มความกว้างเมื่อวางเมาส์เหนือ หรือในกรณีที่ตัวเลือกมีโหมดโฟกัสที่มองเห็นได้
/* base styles when picker is open but not interacted with */
::picker(select) {
width: var(--icon-width);
transition: width 0.5s;
}
/* animate the text in on hover & focus */
::picker(select):hover,
select:has(option:focus-visible)::picker(select) {
/* auto width! */
width: calc-size(auto, size + 0.5rem);
}
ข้อจํากัดและหมายเหตุการช่วยเหลือพิเศษ
พลังที่ยิ่งใหญ่มาพร้อมกับความรับผิดชอบอันใหญ่ยิ่ง ฟีเจอร์นี้มีข้อจำกัดบางอย่างเพื่อให้เข้าถึงสิ่งต่างๆ ได้อยู่เสมอ
- นอกเหนือจากองค์ประกอบ
<option>
แล้ว ระบบยังไม่อนุญาตให้ใช้องค์ประกอบแบบอินเทอร์แอกทีฟ (โฟกัสได้) ใดๆ ใน<select>
เช่น ปุ่มหรือองค์ประกอบอื่นๆ ขณะนี้รูปแบบเนื้อหาที่เสนอใช้ได้เฉพาะองค์ประกอบ<div>
,<span>
,<option>
,<optgroup>
,<img>
,<svg>
และ<hr>
เท่านั้น - ปุ่มแยกกำลังอยู่ในขั้นทดลองขณะที่เราหาวิธีเข้าถึงได้
ในอนาคต เราคาดว่ารูปแบบเนื้อหาจะขยายการให้บริการให้มีความยืดหยุ่นมากขึ้นเมื่อเราพัฒนาประสบการณ์การใช้งานเหล่านี้ให้เข้าถึงได้ง่ายขึ้น
บทสรุป
เรายินดีที่จะได้เห็นความคืบหน้าของฟีเจอร์นี้ผ่านกลุ่มทำงานและหน่วยงานมาตรฐาน และแชร์ความคืบหน้าขณะที่เราสร้างต้นแบบและประเมินรูปร่างของฟีเจอร์นี้ หากพบปัญหาใดๆ ที่ไม่ทำงานตามที่คาดไว้ โปรดแจ้งให้เราทราบ
และในขณะที่ฟีเจอร์นี้ยังอยู่ระหว่างการพัฒนา เรายินดีรับฟังความคิดเห็นของคุณผ่านแบบฟอร์มความคิดเห็นสั้นๆ นี้
ขอขอบคุณที่ช่วยให้มั่นใจว่าเราดำเนินการนี้อย่างถูกต้องและช่วยให้สร้างตัวควบคุมแบบฟอร์มที่เข้าถึงได้และปรับแต่งได้บนเว็บได้ง่ายขึ้น