ใช้การค้นหาสไตล์ (@container style()) เพื่อทริกเกอร์รูปแบบตามบริบทโดยไม่ต้องฮาร์ดโค้ดสิ่งที่สร้างหรือตอบสนองต่อแต่ละบริบท ซึ่งจะช่วยลดการเชื่อมโยงระบบการออกแบบ รวมถึงปรับปรุงความสามารถในการขยายและการห่อหุ้มคอมโพเนนต์
เช่น กฎ section.featured { --surface: featured } สามารถทำเครื่องหมายบริบท และหน้า Landing Page อาจใช้บริบทนั้นเป็นค่าเริ่มต้นผ่าน main { --surface: featured } ด้วย จากนั้นคอมโพเนนต์จะเลือกใช้เพื่อตอบสนองต่อ --surface: featured: การ์ดจะแสดงป้ายโปรโมชัน ปุ่มจะเปลี่ยนเป็นตัวแปรที่เติมสีโดยค่าเริ่มต้น และอื่นๆ
การค้นหาสไตล์ช่วยให้ทั้ง 2 ฝ่ายแยกออกจากกัน โดยแพลตฟอร์มที่แสดงจะไม่ระบุชื่อองค์ประกอบที่ปรับให้เข้ากับแพลตฟอร์ม และคอมโพเนนต์จะไม่ตรวจสอบสิ่งที่สร้างบริบท ทั้ง 2 ฝั่งสามารถขยายได้อย่างอิสระ ไม่ว่าจะเป็นคอมโพเนนต์ใหม่หรือแพลตฟอร์มที่แนะนำใหม่ โดยไม่ต้องแตะอีกฝั่งหนึ่ง ตัวเลือกสืบทอด (เช่น .featured .button) จะบังคับให้เกิดผลตรงกันข้าม กล่าวคือ ตัวเลือกต้องเข้ารหัสความสัมพันธ์ทั้ง 2 ด้าน และต้องเปลี่ยนแปลงเมื่อมีการเปลี่ยนแปลงด้านใดด้านหนึ่ง
กรณีที่ควรใช้คู่มือนี้
คู่มือนี้ครอบคลุมการเปลี่ยนแปลงด้านลักษณะการทำงาน ซึ่งก็คือคอมโพเนนต์ที่ตัดสินใจว่าจะแสดงผลอะไร จัดเรียงตัวเองอย่างไร หรือนำเสนอตัวแปรใดเพื่อตอบสนองต่อบริบท เช่น การซ่อนหรือแสดงป้าย การเปลี่ยนทิศทางเลย์เอาต์ หรือการสลับตัวแปรปุ่ม
หากต้องการเปลี่ยนแปลงระดับโทเค็นแทน เช่น โหมดความหนาแน่น ธีม หรือโทเค็นลำดับสูงอื่นๆ ที่เปลี่ยนค่าอย่างสม่ำเสมอ เช่น ระยะห่างจากขอบและสีในคอมโพเนนต์ต่างๆ โปรดดูความสามารถในการปรับเปลี่ยนตามบริบทของโทเค็นการออกแบบ
การเลือกเครื่องมือที่เหมาะสม
ใช้การค้นหาสไตล์เมื่อความสัมพันธ์ตามบริบททั้ง 2 ด้านอาจเปลี่ยนแปลงอย่างเป็นอิสระ องค์ประกอบใหม่อาจเริ่มสร้างบริบท หรือคอมโพเนนต์ใหม่อาจเริ่มตอบสนองต่อบริบทนั้น การเปลี่ยนเส้นทางนี้คุ้มค่าในแง่ของความสามารถในการขยายและการห่อหุ้ม และการค้นหาสไตล์จะข้ามขอบเขต Shadow DOM ที่ตัวเลือกสืบทอดทำไม่ได้ เมื่อไม่จำเป็นต้องใช้ความยืดหยุ่นดังกล่าว ให้เลือกใช้เครื่องมือที่ง่ายกว่า ดังนี้
- ตัวเลือกสืบทอด (
.toolbar .button): ความสัมพันธ์แบบคงที่และใช้ครั้งเดียวซึ่งไม่สามารถนำมาใช้ซ้ำหรือขยายได้ หลักการ YAGNI มีผลบังคับใช้ อย่าเพิ่มการอ้างอิงทางอ้อมที่คุณจะไม่ใช้ - การค้นหาขนาด (
@container (min-width: …)): การเปลี่ยนแปลงเลย์เอาต์และความหนาแน่นที่ขับเคลื่อนโดยพื้นที่ว่าง ไม่ใช่สถานะเชิงความหมาย - การค้นหาสไตล์ (
@container style(…)): สถานะเชิงความหมาย — สิ่งที่คอมโพเนนต์ควรแสดงผล จัดเรียง หรือนำเสนอในบริบทที่กำหนด
คำสั่งการติดตั้งใช้งาน
- กำหนดแฟล็กบริบทเชิงความหมายโดยใช้คุณสมบัติที่กำหนดเองของ CSS ในคอนเทนเนอร์
- อย่าตั้งค่า
container-typeสำหรับการค้นหาสไตล์ เนื่องจากจะค้นหาคุณสมบัติที่กำหนดเองซึ่งรับค่ามาจากระดับบนสุดที่ใกล้ที่สุด และไม่จำเป็นต้องมีบริบทการจำกัดที่ชัดเจน - จำเป็น: ใช้
@container style(--property: value)เพื่อใช้รูปแบบตามเงื่อนไขกับองค์ประกอบสืบทอด การค้นหาสไตล์ไม่สามารถจับคู่กับองค์ประกอบที่มีการตั้งค่าพร็อพเพอร์ตี้ได้ โดยจะจับคู่ได้เฉพาะองค์ประกอบสืบทอดเท่านั้น - ควรใช้การค้นหาสไตล์มากกว่าตัวเลือกลูกหลานเมื่อความสัมพันธ์ต้องขยายได้หรือข้ามขอบเขตคอมโพเนนต์/Shadow DOM (ดูการเลือกเครื่องมือที่เหมาะสมด้านบน) แต่ให้ใช้ตัวเลือกลูกหลานสำหรับความสัมพันธ์แบบคงที่และแบบครั้งเดียวซึ่งการอ้อมไม่มีประโยชน์
ตัวอย่างการใช้งาน
/* 1. Set the context on a layout container */
.featured {
--surface: featured; /* Semantic context flag for children */
}
/* 2. Component reacts to inherited flag */
.button {
/* Default: Outlined informational style */
background: transparent;
border: 1px solid currentColor;
}
.badge {
/* Default: Hidden — only revealed in featured surfaces */
display: none;
}
@container style(--surface: featured) {
.button {
/* Automatic switch to Filled promotional style */
background: var(--brand-accent);
color: white;
border: none;
}
.badge {
/* Reveal decorative elements only in featured context */
display: block;
}
}
กลยุทธ์สำรอง
จนกว่าการค้นหาสไตล์คอนเทนเนอร์จะพร้อมใช้งานอย่างแพร่หลาย ให้เลเยอร์การค้นหาเหล่านั้นเป็นการเพิ่มประสิทธิภาพแบบต่อเนื่อง โดยจัดส่งค่าเริ่มต้นที่อิงตามตัวเลือกซึ่งทำงานได้ทุกที่ และให้การค้นหาสไตล์ลบล้างค่าเริ่มต้นเมื่อรองรับ ใช้ :where() ในตัวเลือกบริบทเพื่อให้การค้นหาสไตล์ (ความเฉพาะเจาะจงเดียวกัน ลำดับแหล่งที่มาภายหลัง) ชนะโดยอัตโนมัติ
/* Default styles — work everywhere */
.button {
background: transparent;
border: 1px solid currentColor;
}
.badge {
display: none;
}
/* Selector-based contextual styles — broad browser support */
:where(.featured) .button {
background: var(--brand-accent);
color: white;
border: none;
}
:where(.featured) .badge {
display: block;
}
/* Progressive enhancement: style queries override when supported */
@container style(--surface: featured) {
.button {
background: var(--brand-accent);
color: white;
border: none;
}
.badge {
display: block;
}
}
ตัวเลือกสำรองจะเชื่อมโยงการจัดรูปแบบตามบริบทกับชื่อคลาส ซึ่งจะเชื่อมโยงคอมโพเนนต์กับตำแหน่ง DOM เมื่อการค้นหาสไตล์ได้รับการรองรับอย่างกว้างขวางแล้ว คุณจะนำกฎ :where() ออกได้