:has() คลาสเทียมเชิงความสัมพันธ์
เลือกองค์ประกอบแม่ตามองค์ประกอบลูกด้วยคลาสเทียมเชิงความสัมพันธ์ :has() ที่ทรงพลัง
:has() คลาสเทียมเชิงความสัมพันธ์ เป็นบทเรียน CSS Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน CSS Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส CSS Academy มีบทเรียนทั้งหมด 4 บทเรียน
:has() คืออะไร
คลาสเทียม :has() ใช้เลือกองค์ประกอบเมื่อองค์ประกอบนั้นมีองค์ประกอบลูกหลานที่ตรงกับอาร์กิวเมนต์ มักเรียกกันว่า "ตัวเลือกแม่" เพราะช่วยให้จัดสไตล์องค์ประกอบแม่ตามองค์ประกอบลูกได้ ซึ่งเป็นความสามารถที่ CSS ไม่เคยมีมาก่อน
ไวยากรณ์พื้นฐาน
.card:has(img) เลือกองค์ประกอบ .card ใด ๆ ที่มีองค์ประกอบลูกหลาน img อาร์กิวเมนต์คือรายการตัวเลือกสัมพัทธ์ ซึ่งเป็นตัวเลือก CSS ที่ถูกต้องใด ๆ ที่อธิบายองค์ประกอบโดยสัมพันธ์กับองค์ประกอบเป้าหมาย
การจัดสไตล์องค์ประกอบแม่
จัดสไตล์พื้นที่บรรจุฟอร์มเมื่อมีช่องป้อนข้อมูลที่ไม่ถูกต้อง: form:has(:invalid) { border-color: red; } จัดสไตล์ส่วนที่มีหัวเรื่อง: section:has(h2) { padding-top: 2rem; } องค์ประกอบแม่จะเปลี่ยนรูปลักษณ์ตามสถานะขององค์ประกอบลูก
การเลือกองค์ประกอบพี่น้อง
:has() สามารถเลือกองค์ประกอบพี่น้องก่อนหน้าได้ ซึ่งเป็นสิ่งที่ + และ ~ ทำไม่ได้ h2:has(+ p) เลือกองค์ประกอบ h2 ที่มี p อยู่ถัดไปทันที li:has(~ .active) เลือกองค์ประกอบ li ที่มีองค์ประกอบพี่น้อง .active อยู่ถัดไป
การจัดสไตล์ตามสถานะฟอร์ม
ตอบสนองต่อความถูกต้องของฟอร์มในตัวโดยไม่ใช้ JavaScript: input:has(~ .error-msg) จัดสไตล์ช่องป้อนข้อมูลที่มีข้อความแสดงข้อผิดพลาดเป็นองค์ประกอบพี่น้อง label:has(+ input:required) จัดสไตล์ป้ายข้อความที่จับคู่กับช่องป้อนข้อมูลซึ่งจำเป็นต้องกรอก ทั้งหมดนี้ทำได้ด้วย CSS เพียงอย่างเดียว
สถานะการนำทาง
เน้นพื้นที่บรรจุการนำทางตามองค์ประกอบลูกที่กำลังทำงาน: nav:has(.active) ใช้สไตล์กับพื้นที่นำทางทั้งหมดเมื่อองค์ประกอบลูกใด ๆ มีคลาส active เหมาะสำหรับแสดงว่าส่วนใดของการนำทางเป็นส่วนปัจจุบันในระดับพื้นที่บรรจุ
การใช้ร่วมกับคลาสเทียมอื่น
.grid:has(.card:focus-within) จัดสไตล์ตารางกริดทั้งหมดเมื่อการ์ดใด ๆ ได้รับโฟกัสจากแป้นพิมพ์ .dropdown:has(:hover) ทำให้เมนูแบบเลื่อนลงเปิดอยู่ขณะวางตัวชี้เหนือองค์ประกอบลูกหลานใด ๆ ซึ่งสะอาดกว่าการต่อชุดตัวเชื่อมองค์ประกอบพี่น้องที่ซับซ้อน
สิ่งเทียบเท่าคิวรีสื่อใน CSS
.sidebar:has(nav) ใช้รูปแบบการจัดวางที่แตกต่างจาก .sidebar:not(:has(nav)) การจัดวางแบบมีเงื่อนไขโดยไม่ใช้ JavaScript: การมีอยู่หรือไม่มีอยู่ขององค์ประกอบลูกที่กำหนดจะเป็นตัวขับเคลื่อนการจัดวางขององค์ประกอบแม่ ทำให้ CSS ปรับตัวตามเนื้อหาและบริบทได้อย่างแท้จริง
ข้อควรพิจารณาด้านประสิทธิภาพ
:has() ที่ใช้อาร์กิวเมนต์ตัวเลือกแบบกว้าง (เช่น :has(*)) อาจใช้ทรัพยากรมาก เนื่องจากเบราว์เซอร์ต้องตรวจสอบทุกองค์ประกอบ ควรกำหนดอาร์กิวเมนต์ของ :has() ให้เฉพาะเจาะจง ใช้ :has(> .specific-child) (องค์ประกอบลูกโดยตรง) แทน :has(.specific-child) (องค์ประกอบลูกหลานใด ๆ) เมื่อทำได้
การรองรับของเบราว์เซอร์
:has() รองรับใน Chrome 105+, Safari 15.4+ และ Firefox 121+ และรองรับอย่างสมบูรณ์ตามมาตรฐานพื้นฐานตั้งแต่ช่วงปลายปี 2023 ไม่มีชุดเติมความเข้ากันได้สำหรับคุณสมบัตินี้ (เนื่องจากต้องใช้ JavaScript เพื่อจำลองการทำงาน) จึงควรใช้การเพิ่มความสามารถแบบค่อยเป็นค่อยไปสำหรับเบราว์เซอร์รุ่นเก่าที่คุณสมบัตินี้ไม่ใช่ส่วนสำคัญ
การแทนที่รูปแบบการใช้ JavaScript
รูปแบบที่ก่อนหน้านี้ต้องใช้ตัวรับฟังเหตุการณ์ของ JS ได้แก่ "เพิ่มคลาสให้แม่เมื่อลูกได้รับโฟกัส" "แสดงภาพซ้อนทับเมื่อมีตัวเรียกโมดัล" และ "จัดสไตล์ตารางกริดแตกต่างออกไปเมื่อมีรายการสามรายการพอดี" :has() จัดการรูปแบบทั้งหมดนี้ได้แบบประกาศ
ตรวจสอบความรู้
อะไรทำให้ :has() มีความพิเศษเมื่อเทียบกับตัวเชื่อม CSS ที่มีอยู่เดิมอย่าง + และ ~
สรุป
:has() เป็นคลาสเทียมเชิงความสัมพันธ์ที่แท้จริงตัวแรกของ CSS ซึ่งช่วยให้เลือกองค์ประกอบแม่และองค์ประกอบพี่น้องก่อนหน้าได้ คุณสมบัตินี้รองรับการจัดสไตล์ตามเนื้อหา การตอบสนองต่อสถานะฟอร์ม การเน้นการนำทาง และรูปแบบอีกมากมายที่ก่อนหน้านี้ต้องใช้การจัดการ DOM ด้วย JavaScript ทั้งหมดนี้ทำได้แบบประกาศใน CSS
คำถามที่พบบ่อย
บทเรียน “:has() คลาสเทียมเชิงความสัมพันธ์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “:has() คลาสเทียมเชิงความสัมพันธ์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส CSS Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส CSS Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “:has() คลาสเทียมเชิงความสัมพันธ์”
เลือกองค์ประกอบแม่ตามองค์ประกอบลูกด้วยคลาสเทียมเชิงความสัมพันธ์ :has() ที่ทรงพลัง คุณปฏิบัติ CSS Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน CSS Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน CSS Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “:has() คลาสเทียมเชิงความสัมพันธ์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน CSS Academy นี้ได้ไหม
ได้ บทเรียน CSS Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การซ้อน CSS แบบเนทีฟ
- :has() คลาสเทียมเชิงความสัมพันธ์
- @scope สำหรับรูปแบบตามขอบเขต
- View Transitions API