Menu

Tag nav HTML: Navbar, Menu dan Breadcrumb

Elemen <nav> menandai sekumpulan link navigasi utama. Pelajari cara membuat navbar dengan <nav> dan sebuah list, cara menandai halaman yang sedang dibuka, cara memberi label pada beberapa nav di satu halaman, dan cara membuat tombol menu mobile.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Bungkus menumu dengan <nav> dan letakkan link-linknya di dalam sebuah list. Flexbox mengubah list itu menjadi bar horizontal:

list-style: none dan padding: 0 menghapus bullet dan indentasi. display: block pada setiap link membuat padding-nya benar-benar memakan ruang di bar, sehingga seluruh kotak berpadding itu bisa diklik. Hapus baris display: flex dan menu yang sama berubah menjadi list vertikal, yang merupakan tampilan menu sidebar.

<nav> sendiri tidak terlihat seperti apa pun. Tugasnya adalah makna: screen reader menampilkannya sebagai landmark navigasi, sehingga pengguna bisa melompat ke menu, atau melewatinya, dengan satu tombol.

Tandai halaman yang sedang dibuka

Tambahkan aria-current="page" ke link halaman yang sedang ditampilkan. Atribut ini memberi tahu screen reader "kamu ada di sini", dan memberi CSS pegangan untuk menyorot link itu:

Pindahkan aria-current="page" ke link lain dan sorotannya ikut pindah. Mengatur gaya lewat atribut, bukan lewat class .active, menjaga tampilan dan aksesibilitas tetap sejalan: kamu tidak bisa punya salah satunya tanpa yang lain.

Beberapa nav di satu halaman: label dan breadcrumb

Satu halaman bisa punya menu utama, breadcrumb dan daftar isi, masing-masing di dalam <nav>-nya sendiri. Beri masing-masing sebuah aria-label, supaya screen reader mengumumkan "Breadcrumb navigation", bukan tiga entri "navigation" yang sama persis:

Breadcrumb memakai ordered list <ol> karena urutannya penting. Garis miringnya berasal dari CSS ::before, jadi screen reader tidak membaca "slash" di antara setiap item. Item terakhir adalah halaman saat ini dan bukan sebuah link.

Daftar isi

List berisi link ke bagian-bagian di halaman yang sama juga termasuk navigasi. Link #id melompat ke elemen dengan id tersebut; coba di preview:

Di sini labelnya berasal dari heading yang terlihat lewat aria-labelledby. Cara ini lebih baik daripada aria-label kalau heading-nya sudah tampil di layar.

Tombol menu mobile

Di layar sempit, menu biasanya disembunyikan di balik sebuah tombol. Pakai <button> sungguhan dengan aria-expanded, dan tetap letakkan link-linknya di dalam <nav>:

aria-expanded memberi tahu screen reader apakah menu sedang terbuka, dan atribut hidden menghapus list dari layar sekaligus dari accessibility tree selama menu tertutup. Di layar lebar, kamu akan menampilkan list itu dengan media query dan menyembunyikan tombolnya.

Kesalahan umum

  • Membungkus setiap kumpulan link dengan <nav>. Pakai untuk menu utama, breadcrumb, pagination dan daftar isi. Link di tengah teks bukan blok navigasi.
  • Tombol menu yang dibuat dari <div>. Elemen itu tidak bisa difokuskan atau ditekan dengan keyboard. Pakai <button>.
  • Beberapa nav tanpa label. Tambahkan aria-label atau aria-labelledby ke masing-masing supaya bisa dibedakan.
  • Hanya mewarnai link halaman saat ini. Tambahkan aria-current="page"; warna saja tidak diumumkan dan mungkin tidak terlihat oleh semua orang.
  • Link dengan href="#" di situs produksi. Untuk demo tidak masalah, tapi item menu sungguhan butuh URL sungguhan supaya tetap berfungsi saat dibuka di tab baru. Halaman link membahas cara kerja nilai href.

Pertanyaan yang sering diajukan

Apa itu tag nav di HTML?

<nav> adalah elemen semantik yang membungkus sekumpulan link navigasi utama, seperti menu situs, daftar isi atau breadcrumb. Screen reader mencantumkannya sebagai landmark navigasi, sehingga pengguna bisa langsung melompat ke sana.

Apakah link di dalam nav harus berada di dalam list?

Itu pola yang umum dan bagus: <ul> berisi item <li> membuat screen reader bisa mengumumkan berapa link yang ada di menu. Link biasa langsung di dalam <nav> juga valid, misalnya untuk dua atau tiga link dalam satu baris.

Apakah setiap kumpulan link butuh elemen nav?

Tidak. Pakai <nav> hanya untuk blok navigasi utama. Beberapa link di dalam paragraf atau daftar pendek link legal di footer tidak membutuhkannya, dan terlalu banyak landmark nav membuat masing-masing lebih sulit ditemukan.

Bagaimana cara membuat navbar horizontal?

Letakkan link di dalam <ul> di dalam <nav>, lalu beri list itu display: flex; list-style: none; padding: 0; dan sebuah gap. Flexbox menyusun item-itemnya dalam satu baris.

Bagaimana cara menampilkan halaman yang sedang dibuka di navbar?

Tambahkan aria-current="page" ke link halaman yang sedang dibuka pengguna, lalu atur gayanya dengan selector [aria-current="page"]. Screen reader juga akan mengumumkannya sebagai halaman saat ini.

Bolehkah satu halaman punya lebih dari satu nav?

Boleh, misalnya menu utama, jejak breadcrumb dan daftar isi. Beri masing-masing aria-label yang berbeda seperti "Main" atau "Breadcrumb" supaya pengguna screen reader bisa membedakannya.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai