ใช้ HTML เชิงความหมายที่เข้าถึงได้โดยให้ช่องทำเครื่องหมายแต่ละช่องเชื่อมโยงกับป้ายกำกับของตนเอง ไม่ว่าจะโดยการฝัง <input> ไว้ใน <label> หรือโดยการจับคู่แอตทริบิวต์ for ของป้ายกำกับกับ id ของอินพุต
CSS สมัยใหม่มี 2 วิธีในการจัดรูปแบบช่องทำเครื่องหมาย ได้แก่ ปรับแต่งลักษณะที่ปรากฏแบบเนทีฟด้วย accent-color หรือลบล้างการนำเสนอเริ่มต้นด้วย appearance: none ในองค์ประกอบ <input type="checkbox">
การปรับแต่งแบบเนทีฟด้วย accent-color
หากต้องการจัดรูปแบบที่เรียบง่ายและสอดคล้องกับแบรนด์ซึ่งยังคงการแสดงผลแบบเนทีฟ ลักษณะการทำงานของแป้นพิมพ์ การตรวจสอบ และตัวบ่งชี้โฟกัสของระบบปฏิบัติการ ให้ใช้ accent-color
.checkbox-native {
accent-color: #1a73e8;
/* Sizing is controlled via relative units */
inline-size: 1.25em;
aspect-ratio: 1;
margin: 0;
cursor: pointer;
}
การจัดรูปแบบที่กำหนดเองอย่างเต็มรูปแบบด้วย appearance: none
ใช้ appearance: none เมื่อการออกแบบต้องการการควบคุมรูปร่าง ขนาด สถานะ หรือตัวบ่งชี้ของช่องทำเครื่องหมาย ซึ่งจะนำการจัดรูปแบบภาพเนทีฟออกโดยปล่อยให้ <input> เป็นเป้าหมายแบบอินเทอร์แอกทีฟ
ตั้งค่าขนาดสัมพัทธ์ที่ชัดเจนสำหรับ --checkbox-size และ --checkbox-icon-size เนื่องจาก appearance: none จะนำขนาดเริ่มต้นของเบราว์เซอร์ออก กำหนดให้ไอคอนมีขนาดเล็กกว่าช่องทำเครื่องหมายเพื่อให้มีพื้นที่สำหรับเส้นขอบและระยะห่างจากขอบของภาพ
/* Reusable SVG assets */
:root {
--icon-check: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3.5' stroke-linecap='round' stroke-linejoin='round'><polyline points='20 6 9 17 4 12'></polyline></svg>");
--icon-dash: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='4.5' stroke-linecap='round' stroke-linejoin='round'><line x1='5' y1='12' x2='19' y2='12'></line></svg>");
}
/* Custom checkbox */
.checkbox-custom {
--checkbox-size: 1.25em;
--checkbox-icon-size: 0.7em;
appearance: none;
display: inline-grid;
place-content: center;
inline-size: var(--checkbox-size);
aspect-ratio: 1;
margin: 0;
border: 2px solid currentColor;
cursor: pointer;
&::before {
content: "";
inline-size: var(--checkbox-icon-size);
aspect-ratio: 1;
background-color: currentColor;
mask: var(--checkbox-icon) no-repeat center / contain;
scale: 0;
@media (prefers-reduced-motion: no-preference) {
transition: scale 150ms ease;
}
@media (forced-colors: active) {
background-color: CanvasText;
}
}
&:checked {
--checkbox-icon: var(--icon-check);
}
&:indeterminate {
--checkbox-icon: var(--icon-dash);
}
&:is(:checked, :indeterminate)::before {
scale: 1;
}
&:focus-visible {
outline: 2px solid currentColor;
outline-offset: 2px;
}
&:disabled {
cursor: not-allowed;
opacity: 0.5;
}
}
สถานะไม่แน่นอน
คุณไม่สามารถตั้งค่าสถานะไม่แน่นอนผ่านแอตทริบิวต์ HTML ได้ ให้ตั้งค่าพร็อพเพอร์ตี้ indeterminate DOM ใน JavaScript (checkbox.indeterminate = true) และตรวจสอบว่าคลาสจำลอง :indeterminate มีลักษณะที่แตกต่างจากทั้งสถานะ :checked และสถานะที่ไม่ได้เลือกอย่างชัดเจน ดังนี้
- เนทีฟ (
accent-color): จัดรูปแบบโดยอัตโนมัติโดยเบราว์เซอร์โดยใช้accent-colorขององค์ประกอบ (ไม่จำเป็นต้องมีกฎ CSS:indeterminateเพิ่มเติม) - กำหนดเอง (
appearance: none): สลับ--checkbox-iconเป็นvar(--icon-dash)ใน.checkbox-custom:indeterminateตามที่แสดงด้านบน
const selectAll = document.querySelector("#select-all");
selectAll.indeterminate = true;
การช่วยเหลือพิเศษและการโต้ตอบ
- ควรใช้
:focus-visibleแทน:focusเพื่อจัดรูปแบบตัวบ่งชี้โฟกัสในช่องทำเครื่องหมายที่กำหนดเอง เพื่อให้โครงร่างที่ชัดเจนปรากฏขึ้นสำหรับการไปยังส่วนต่างๆ ด้วยแป้นพิมพ์โดยไม่แสดงเมื่อคลิกตัวชี้ - อย่าใช้
outline: noneหรือซ่อนตัวบอกสถานะโฟกัสในช่องทำเครื่องหมาย ควรตรวจสอบว่าช่องทำเครื่องหมายหรือ
<label>ที่รวมอยู่มีเป้าหมายการแตะแบบอินเทอร์แอกทีฟอย่างน้อย44px x 44pxขณะที่ยังคงขนาดช่องทำเครื่องหมายแบบภาพไว้ในหน่วยที่เกี่ยวข้อง ดังนี้label { display: inline-flex; align-items: center; gap: 0.65rem; min-block-size: 44px; cursor: pointer; }ควรระบุตัวแปรสไตล์
:disabledที่ลดความทึบแสงและตั้งค่าcursor: not-allowedเพื่อสื่อถึงสถานะที่ไม่ได้ใช้งานอย่างชัดเจน
ปัญหาที่ควรทราบเมื่อใช้ accent-color
การแสดงผล accent-color ของเบราว์เซอร์จะแตกต่างกันไป
สำหรับตัวบ่งชี้ที่มักจะวาดทับพื้นหลังสีเฉพาะจุด เช่น เครื่องหมายช่องทำเครื่องหมายและจุดปุ่มตัวเลือก เบราว์เซอร์อาจใช้การดำเนินการที่แตกต่างกัน ดังนี้
- โดยทั่วไป Chromium และ Firefox จะเลือกสีตัวบ่งชี้ที่ตัดกัน
- Safari อาจคงตัวบ่งชี้สีขาวไว้ในโหมดสว่างหรือตัวบ่งชี้สีดำในโหมดมืดแทน ขณะที่แก้ไขสีเฉพาะจุดด้านหลัง การปรับนี้ไม่ได้ให้คอนทราสต์ที่เพียงพอสำหรับทุกสีที่ระบุเสมอไป ดังนั้นให้ทดสอบชุดค่าผสมที่สำคัญใน Safari ซึ่งรวมถึงรูปแบบสีทั้งสว่างและมืด อย่าคิดว่า Safari จะเลือกสีตัวบ่งชี้ที่ให้คอนทราสต์ที่ดีที่สุดโดยอัตโนมัติ
กลยุทธ์สำรอง
การสำรองและการรองรับเบราว์เซอร์สำหรับ accent-color
พร็อพเพอร์ตี้ accent-color เป็นการเพิ่มประสิทธิภาพแบบต่อเนื่อง
เบราว์เซอร์ที่ไม่รองรับพร็อพเพอร์ตี้นี้จะละเว้นและใช้สี UI เริ่มต้น