ข้ามไปเนื้อหาหลัก

CSS :has() เปลี่ยนวิธีเขียน hamburger nav ไปเลย

:has() ทำให้ hamburger menu เป็น CSS-only ได้จริงโดยไม่ต้อง JavaScript

ก่อนหน้านี้การทำ hamburger nav แบบ CSS-only ต้องอาศัย trick เช่น :checked + <label> ซึ่งต้องวาง element ในลำดับที่ถูกต้อง และ markup ดูแปลกๆ

ด้วย :has() เขียนได้แบบนี้:

/* ซ่อน nav โดยค่าเริ่มต้น */
nav { display: none; }

/* แสดงเมื่อ checkbox ถูก check */
header:has(.nav-toggle:checked) nav {
  display: block;
}

/* Animate hamburger เป็น × */
header:has(.nav-toggle:checked) .bar:nth-child(1) {
  transform: translateY(7px) rotate(45deg);
}

ไม่ต้อง JavaScript เลย และ markup ก็ natural กว่าเดิมมาก เพราะ header เป็น parent ที่ “รู้” ว่า checkbox ข้างในถูก check อยู่หรือเปล่า

Browser support ตอนนี้ครอบคลุมทุก browser หลักแล้ว (Chrome 105+, Firefox 121+, Safari 15.4+)