Accessible Responsive Navbar with Mobile Drawer Toggle
Struktur navigasi header sticky dengan Semantic HTML5, backdrop blur, fokus aksesibilitas ARIA, dan drawer menu responsif.
<header className="sticky top-0 z-50 bg-white/90 backdrop-blur-md border-b border-slate-200">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 h-16 flex items-center justify-between">
<a href="/" className="font-bold text-slate-900 text-lg tracking-tight">
Brand<span className="text-blue-600">Name</span>
</a>
<nav className="hidden md:flex items-center gap-6" aria-label="Main Navigation">
<a href="/layanan" className="text-sm font-medium text-slate-700 hover:text-blue-600 transition-colors">Layanan</a>
<a href="/tentang" className="text-sm font-medium text-slate-700 hover:text-blue-600 transition-colors">Tentang</a>
<a href="/portofolio" className="text-sm font-medium text-slate-700 hover:text-blue-600 transition-colors">Portofolio</a>
<a href="/kontak" className="px-4 py-2 text-sm font-semibold text-white bg-blue-600 hover:bg-blue-700 rounded-lg shadow-sm">Hubungi Kami</a>
</nav>
<button
type="button"
aria-expanded={isOpen}
aria-controls="mobile-menu"
onClick={() => setIsOpen(!isOpen)}
className="md:hidden p-2 text-slate-700 hover:bg-slate-100 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"
>
<span className="sr-only">Buka menu navigasi</span>
{isOpen ? <XIcon /> : <MenuIcon />}
</button>
</div>
</header>Fungsi & Cara Kerja Kode:
Menampilkan header situs web yang tetap berada di atas layar saat halaman digulir, menyembunyikan navigasi horizontal pada layar smartphone, dan beralih ke tombol toggle menu dengan dukungan penuh pembaca layar (screen reader).
Aksesibilitas (A11y):
- Menyertakan atribut aria-label="Main Navigation" pada elemen nav
- Atribut aria-expanded mencerminkan status buka/tutup menu secara dinamis
- Terdapat teks tersembunyi class="sr-only" untuk pembaca layar
- Tombol toggle memiliki outline focus-visible 2px yang jelas saat ditekan tombol Tab
Responsivitas Multi-Device:
- Breakpoint md: (768px) memisahkan tampilan navigasi horizontal desktop dari menu hamburger mobile
- Tinggi header terkunci pada h-16 (64px) untuk mencegah layout shift saat halaman dimuat