ตัวเลือกคลาส Pseudo-class ใหม่ของ CSS :is() และ :where()

การเพิ่มเล็กๆ น้อยๆ เหล่านี้ในไวยากรณ์ตัวเลือก CSS จะมีผลอย่างมาก

เมื่อเขียน CSS บางครั้งคุณอาจได้รายการเครื่องมือเลือกที่ยาวมากเพื่อกำหนดเป้าหมายองค์ประกอบหลายรายการที่มีกฎสไตล์เดียวกัน เช่น ถ้าต้องการปรับสีแท็ก <b> ที่พบในองค์ประกอบส่วนหัว ก็เขียนดังนี้

h1 > b, h2 > b, h3 > b, h4 > b, h5 > b, h6 > b {
  color: hotpink;
}

แต่คุณอาจใช้ :is() แทนเพื่อปรับปรุงความชัดเจนในการอ่านและหลีกเลี่ยงตัวเลือกที่ยาวเกินไป

:is(h1,h2,h3,h4,h5,h6) > b {
  color: hotpink;
}

ความอ่านง่ายและความสะดวกของเครื่องมือเลือกที่สั้นลงเป็นเพียงส่วนหนึ่งของคุณค่าที่ :is() และ :where() นำมาสู่ CSS ในโพสต์นี้ คุณจะได้ดูไวยากรณ์และค่าของตัวเลือกเสมือนที่ทำงานได้ 2 รายการนี้

ภาพเปรียบเทียบก่อนและหลังใช้ :is() แบบอินฟินิตี้

ความเข้ากันได้กับเบราว์เซอร์

:is()

การรองรับเบราว์เซอร์

  • Chrome: 88
  • Edge: 88
  • Firefox: 78
  • Safari: 14

แหล่งที่มา

:where()

การรองรับเบราว์เซอร์

  • Chrome: 88
  • Edge: 88
  • Firefox: 78
  • Safari: 14

แหล่งที่มา

พบกับ :is() และ :where()

เหล่านี้คือตัวเลือกคลาสจำลองที่ใช้งานได้ โปรดสังเกต () ที่ส่วนท้ายและวิธีที่เริ่มต้นด้วย : ให้คิดว่าการเรียกฟังก์ชันแบบไดนามิกเหล่านี้เป็นรันไทม์ที่จับคู่องค์ประกอบ เมื่อเขียน CSS คุณจะจัดกลุ่มองค์ประกอบเข้าด้วยกันได้ตรงกลาง ช่วงต้น หรือช่วงท้ายของเครื่องมือเลือก นอกจากนี้ ยังเปลี่ยนความเฉพาะเจาะจงได้ด้วย ซึ่งจะช่วยให้คุณลบล้างหรือเพิ่มความเฉพาะเจาะจงได้

การจัดกลุ่มตัวเลือก

:where() จะทำสิ่งใดก็ได้ที่ :is() ทำได้เกี่ยวกับการจัดกลุ่ม ซึ่งรวมถึงการใช้ที่ใดก็ได้ในตัวเลือก การฝัง และการซ้อน ความยืดหยุ่นของ CSS ที่คุณรู้จักและชื่นชอบอย่างเต็มรูปแบบ ลองดูตัวอย่างต่อไปนี้

/* at the beginning */
:where(h1,h2,h3,h4,h5,h6) > b {
  color: hotpink;
}

/* in the middle */
article :is(header,footer) > p {
  color: gray;
}

/* at the end */
.dark-theme :where(button,a) {
  color: rebeccapurple;
}

/* multiple */
:is(.dark-theme, .dim-theme) :where(button,a) {
  color: rebeccapurple;
}

/* stacked */
:is(h1,h2):where(.hero,.subtitle) {
  text-transform: uppercase;
}

/* nested */
.hero:is(h1,h2,:is(.header,.boldest)) {
  font-weight: 900;
}

ตัวอย่างตัวเลือกแต่ละรายการข้างต้นแสดงให้เห็นถึงความยืดหยุ่นของคลาสจำลองที่ใช้งานได้จริง 2 รายการนี้ หากต้องการค้นหาส่วนของโค้ดที่อาจได้รับประโยชน์จาก :is() หรือ :where() ให้มองหาตัวเลือกที่มีคอมมาหลายตัวและการใช้ตัวเลือกซ้ำ

การใช้ตัวเลือกแบบง่ายและแบบซับซ้อนด้วย :is()

หากต้องการทบทวนตัวเลือก ลองดูโมดูลตัวเลือกใน "เรียนรู้เกี่ยวกับ CSS" ลองดูตัวอย่างตัวเลือกที่เรียบง่ายและซับซ้อนต่อไปนี้เพื่อช่วยแสดงให้เห็นภาพของความสามารถ

article > :is(p,blockquote) {
  color: black;
}

:is(.dark-theme.hero > h1) {
  font-weight: bold;
}

article:is(.dark-theme:not(main .hero)) {
  font-size: 2rem;
}

จนถึงตอนนี้ :is() และ :where() ใช้แทนกันได้ทางไวยากรณ์ ได้เวลาดูว่ามีความแตกต่างกันอย่างไร

ความแตกต่างระหว่าง :is() กับ :where()

:is() และ :where() แตกต่างกันอย่างมากในแง่ความเฉพาะเจาะจง หากต้องการทบทวนความเฉพาะเจาะจง โปรดดูโมดูลความเฉพาะเจาะจงใน Learn CSS

กล่าวโดยสรุป

  • :where() ไม่มีความเฉพาะเจาะจง
    :where() จะบีบอัดความเฉพาะเจาะจงทั้งหมดในรายการตัวเลือกที่ส่งผ่านเป็นพารามิเตอร์ฟังก์ชัน ฟีเจอร์นี้คือฟีเจอร์ตัวเลือกแบบแรก
  • :is() ใช้ความเฉพาะเจาะจงของตัวเลือกที่เฉพาะเจาะจงที่สุด
    :is(a,div,#id) มีคะแนนความเฉพาะเจาะจงของรหัส 100 คะแนน

การใช้ตัวเลือกที่เฉพาะเจาะจงที่สุดจากรายการเป็นข้อผิดพลาดที่ฉันพบเมื่อตื่นเต้นกับการแบ่งกลุ่มมากเกินไป เราปรับปรุงความอ่านง่ายได้เสมอด้วยการย้ายตัวเลือกที่มีความเฉพาะเจาะจงสูงไปยังตัวเลือกของตัวเอง ซึ่งจะไม่ส่งผลกระทบมากนัก ตัวอย่างที่แสดงให้เห็นถึงสิ่งที่เราหมายถึงมีดังนี้

article > :is(header, #nav) {
  background: white;
}

/* better as */
article > header,
article > #nav {
  background: white;
}

จาก :where() ผมกำลังรอเห็นข้อเสนอไลบรารีเวอร์ชันที่ไม่เฉพาะเจาะจง การแข่งขันที่เฉพาะเจาะจงระหว่างสไตล์ของผู้แต่งกับสไตล์ของคลังอาจสิ้นสุดลง จะไม่มีความเฉพาะเจาะจงที่จะแข่งขันกันเมื่อเขียน CSS CSS พัฒนาฟีเจอร์การจัดกลุ่มแบบนี้มาเป็นเวลานานแล้ว ฟีเจอร์นี้พร้อมใช้งานแล้ว แต่ยังคงเป็นพื้นที่ที่เรายังไม่รู้จักมากนัก สนุกกับการสร้างสไตล์ชีตที่เล็กลงและนำคอมมาออก

รูปภาพโดย Markus Winkler ใน Unsplash