Tutorial ini menjelaskan cara membuat navigasi utama situs yang mudah diakses.
Ada banyak cara untuk membuat navigasi utama situs,
Untuk sebagian besar situs,
Mem-build lapisan demi lapisan
Dalam tutorial ini,
Struktur dasar
Untuk navigasi dasar,<a>
dan beberapa baris CSS untuk meningkatkan gaya dan tata letak default link Anda.
<a href="/home">Home</a>
<a href="/about-us">About us</a>
<a href="/pricing">Pricing</a>
<a href="/contact">Contact</a>
/* Define variables for your colors */
:root {
--color-shades-dark: rgb(25, 25, 25);
}
/* Use the alternative box model
Details: <https://web.dev/learn/css/box-model/> */
*{
box-sizing: border-box;
}
/* Basic font styling */
body {
font-family: Segoe UI, system-ui, -apple-system, sans-serif;
font-size: 1.6 rem;
}
/* Link styling */
a {
--text-color: var(--color-shades-dark);
border-block-end: 3px solid var(--border-color, transparent);
color: var(--text-color);
display: inline-block;
margin-block-end: 0.5 rem; /* See note at the bottom of this chapter */
margin-inline-end: 0.5 rem;
padding: 0.1 rem;
text-decoration: none;
}
/* Change the border-color on :hover and :focus */
a:where(:hover, :focus) {
--border-color: var(--text-color);
}
Hal ini berfungsi dengan baik untuk sebagian besar pengguna,
Berikut tindakan yang dapat Anda lakukan:
- Menandai halaman yang aktif.
- Mengumumkan jumlah item kepada pengguna pembaca layar.
- Tambahkan penanda dan izinkan pengguna pembaca layar mengakses navigasi secara langsung menggunakan pintasan.
- Sembunyikan navigasi di area pandang yang sempit.
- Meningkatkan gaya visual fokus.
Menandai halaman aktif
Untuk menandai halaman yang aktif,
<a href="/about-us" class="active-page">About us</a>
Masalah dengan pendekatan ini adalah bahwa pendekatan ini menyampaikan informasi tentang link yang aktif secara visual.
aria-current
(status) menunjukkan elemen yang mewakili item saat ini dalam penampung atau kumpulan elemen terkait.Token halaman yang digunakan untuk menunjukkan link dalam serangkaian link penomoran halaman, dengan gaya visual link yang mewakili halaman yang saat ini ditampilkan. [Accessible Rich Internet Applications (WAI-ARIA) 1. 1](https:/ / www. w3. org/ TR/ wai-aria/ #aria-current)
Dengan atribut tambahan,
<a href="/about-us" aria-current="page" class="active-page">About us</a>
Efek samping yang praktis adalah Anda dapat menggunakan atribut untuk memilih link aktif di CSS,active-page
tidak digunakan lagi.
<a href="/home">Home</a>
<a href="/about-us" aria-current="page">About us</a>
<a href="/pricing">Pricing</a>
<a href="/contact">Contact</a>
/* Change border-color and color for the active page */
[aria-current="page"] {
--border-color: var(--color-highlight);
--text-color: var(--color-highlight);
}
Mengumumkan jumlah item
Dengan melihat navigasi,
Cara yang baik untuk menyampaikan jumlah item di awal adalah menggabungkan setiap link dalam item daftar (<li>
),<ul>
).
<ul>
<li>
<a href="/home">Home</a>
</li>
<li>
<a href="/about-us" aria-current="page">About us</a>
</li>
<li>
<a href="/pricing">Pricing</a>
</li>
<li>
<a href="/contact">Contact</a>
</li>
</ul>
Saat pengguna pembaca layar menemukan daftar,
Berikut adalah demo navigasi yang digunakan dengan pembaca layar NVDA di Windows.
Sekarang Anda harus menyesuaikan gaya visual agar terlihat seperti sebelumnya.
/* Remove the default list styling and create a flexible layout for the list */
ul {
display: flex;
flex-wrap: wrap;
gap: 1rem;
list-style: none;
margin: 0;
padding: 0;
}
/* Basic link styling */
a {
--text-color: var(--color-shades-dark);
border-block-end: 3px solid var(--border-color, transparent);
color: var(--text-color);
padding: 0.1 rem;
text-decoration: none;
}
Menggunakan daftar dapat memiliki banyak keuntungan bagi pengguna pembaca layar:
- Mereka bisa mendapatkan jumlah total item sebelum berinteraksi dengan item tersebut.
- Mereka dapat menggunakan pintasan untuk berpindah dari item daftar ke item daftar.
- Mereka dapat menggunakan pintasan untuk berpindah dari daftar ke daftar.
- Pembaca layar dapat mengumumkan indeks item saat ini (misalnya,
"item daftar, dua dari empat").
Selain itu,
Detail penting tentang Voicelist-style: none
.<ul>
.
<ul role="list">
<li>
<a href="/home">Home</a>
</li>
...
</ul>
Menambahkan penanda
Dengan sedikit upaya,<ul>
dalam elemen <nav>
.
Menggunakan elemen <nav>
memiliki beberapa keunggulan.<header>
,<footer>
,<main>
,

Dalam daftar ini,<header>
,<nav>
,<main>
,<footer>
.
Jika memiliki navigasi seluruh situs,<nav>
.

Agar dapat dibedakan,aria-labelledby
atau aria-label
.
<nav aria-label="Main">
<ul>
<li>
<a href="/home">Home</a>
</li>
...
</ul>
</nav>
...
<nav aria-label="Select page">
<ul>
<li>
<a href="/page-1">1</a>
</li>
...
</ul>
</nav>
Jika label yang Anda pilih sudah ada di suatu tempat di halaman,aria-labelledby
dan mereferensikan label yang ada menggunakan atribut id
.
<nav aria-labelledby="pagination_heading">
<h2 id="pagination_heading">Select a page</h2>
<ul>
<li>
<a href="/page-1">1</a>
</li>
...
</ul>
</nav>
Label yang ringkas sudah cukup,

Menyembunyikan navigasi di area pandang yang sempit
Secara pribadi,
- Anda harus menyembunyikan daftar dengan cara yang mudah diakses.
- Navigasi harus dapat diakses dengan keyboard.
- Navigasi harus menyampaikan apakah navigasi tersebut terlihat atau tidak.
Menambahkan tombol tiga garis
Karena Anda mengikuti prinsip progressive enhancement,
Hal pertama yang diperlukan navigasi Anda adalah tombol tiga garis.

<nav id="mainnav">
...
</nav>
<template id="burger-template">
<button type="button" aria-expanded="false" aria-label="Menu" aria-controls="mainnav">
<svg width="24" height="24" aria-hidden="true">
<path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z">
</svg>
</button>
</template>
- Atribut
aria-expanded
memberi tahu software pembaca layar apakah elemen yang dikontrol tombol diperluas atau tidak. aria-label
memberi tombol nama yang disebut nama yang dapat diakses,alternatif teks untuk ikon tiga garis. - Anda menyembunyikan
<svg>
dari teknologi pendukung menggunakanaria-hidden
karena sudah memiliki label teks yang disediakan oleharia-label
. aria-controls
memberi tahu teknologi pendukung,yang mendukung atribut (misalnya JAWS), elemen mana yang dikontrol tombol.
const nav = document. querySelector ('#mainnav')
const list = nav. querySelector ('ul');
const burgerClone = document. querySelector ('#burger-template'). content. cloneNode (true);
const button = burgerClone . querySelector ('button');
// Toggle aria-expanded attribute
button. addEventListener ('click', e => {
// aria-expanded="true" signals that the menu is currently open
const isOpen = button. getAttribute ('aria-expanded') === "true"
button. setAttribute ('aria-expanded', !isOpen );
});
// Hide list on keydown Escape
nav. addEventListener ('keyup', e => {
if (e. code === 'Escape') {
button. setAttribute ('aria-expanded', false);
}
});
// Add the button to the page
nav. insertBefore (burgerClone , list);
- Pengguna akan merasa nyaman jika dapat menutup navigasi kapan saja mereka mau,
misalnya dengan menekan tombol Escape. - Sebaiknya gunakan
insert
,Before bukan append
,Child karena tombol harus menjadi elemen pertama dalam navigasi Anda. Jika pengguna keyboard atau pembaca layar menekan Tab setelah mengklik tombol, mereka berharap item pertama dalam daftar akan difokuskan. Jika tombol muncul setelah daftar, hal itu tidak akan terjadi.
Selanjutnya,
@media (min-width: 48em) {
nav {
--nav-button-display: none;
}
}
/* Reset button styling */
button {
all: unset;
display: var(--nav-button-display, flex);
}
Menyembunyikan daftar
Sebelum menyembunyikan daftar,
Pertama,<nav>
dari alur alami halaman dan tempatkan di sudut ujung atas area pandang.
@media (min-width: 48em) {
nav {
--nav-button-display: none;
--nav-position: static;
}
}
nav {
position: var(--nav-position, fixed);
inset-block-start: 1rem;
inset-inline-end: 1rem;
}
Selanjutnya,(—-nav-list-layout)
.
@media (min-width: 48em) {
nav {
--nav-button-display: none;
--nav-position: static;
}
ul {
--nav-list-layout: row;
}
}
ul {
display: flex;
flex-direction: var(--nav-list-layout, column);
flex-wrap: wrap;
gap: 1rem;
list-style: none;
margin: 0;
padding: 0;
}
Navigasi Anda akan terlihat seperti ini di area pandang yang sempit.

Daftar ini jelas memerlukan beberapa CSS.background-color
dan box-shadow
.
@media (min-width: 48em) {
nav {
--nav-button-display: none;
--nav-position: static;
}
ul {
--nav-list-layout: row;
--nav-list-position: static;
--nav-list-padding: 0;
--nav-list-height: auto;
--nav-list-width: 100%;
--nav-list-shadow: none;
}
}
ul {
background: rgb(255, 255, 255);
box-shadow: var(--nav-list-shadow, -5px 0 11px 0 rgb(0 0 0 / 0.2 ));
display: flex;
flex-direction: var(--nav-list-layout, column);
flex-wrap: wrap;
gap: 1rem;
height: var(--nav-list-height, 100vh);
list-style: none;
margin: 0;
padding: var(--nav-list-padding, 2rem);
position: var(--nav-list-position, fixed);
inset-block-start: 0; /* Logical property. Equivalent to top: 0; */
inset-inline-end: 0; /* Logical property. Equivalent to right: 0; */
width: var(--nav-list-width, min(22rem, 100vw));
}
button {
all: unset;
display: var(--nav-button-display, flex);
position: relative;
z-index: 1;
}
Daftar akan terlihat seperti ini di area pandang yang sempit,

Terakhir,
Sebelumnya,aria-expanded
.
@media (min-width: 48em) {
ul {
--nav-list-visibility: visible;
}
}
ul {
visibility: var(--nav-list-visibility, visible);
}
/* Hide the list on narrow viewports, if it comes after an element with
aria-expanded set to "false". */
[aria-expanded="false"] + ul {
visibility: var(--nav-list-visibility, hidden);
}
Anda harus menggunakan deklarasi properti seperti visibility: hidden
atau display: none
,opacity: 0
atau translateX(
untuk menyembunyikan daftar.opacity
atau translate
akan menghapus konten secara visual sehingga link tidak akan terlihat,visibility
atau display
akan menyembunyikannya secara visual dan membuatnya tidak dapat diakses,
Menganimasikan daftar
Jika Anda bertanya-tanya mengapa menggunakan visibility: hidden;
,display: none;
,hidden
dan visible
,transform
atau opacity
untuk membuat efek geser atau memudar.
CSS berikut mentransisikan opacity
untuk membuat efek memudar dan menghilang.
ul {
transition: opacity 0.6 s linear, visibility 0.3 s linear;
visibility: var(--nav-list-visibility, visible);
}
[aria-expanded="false"] + ul {
opacity: 0;
visibility: var(--nav-list-visibility, hidden);
}
Jika ingin menganimasikan gerakan,transition
dalam kueri media prefers-reduced-motion karena animasi dapat memicu mual,
ul {
visibility: var(--nav-list-visibility, visible);
}
@media (prefers-reduced-motion: no-preference) {
ul {
transition: transform 0.6 s cubic-bezier(.68 , -0.55 , .27 , 1.55 ), visibility 0.3 s linear;
}
}
[aria-expanded="false"] + ul {
transform: var(--nav-list-transform, translateX (100%));
visibility: var(--nav-list-visibility, hidden);
}
Hal ini memastikan bahwa hanya orang yang tidak memiliki preferensi untuk gerakan yang dikurangi yang akan melihat animasi.
Meningkatkan gaya visual fokus
Pengguna keyboard mengandalkan gaya fokus elemen untuk orientasi dan navigasi di halaman.outline: none
),
Berikut tampilan gaya fokus default pada link di Chrome 103.

Anda dapat meningkatkannya dengan memberikan gaya Anda sendiri dalam warna Anda sendiri.:focus-visible
,:focus
,:focus
akan terlihat oleh semua orang,:focus-visible
,
/* Remove the default :focus outline */
*:focus {
outline: none;
}
/* Show a custom outline on :focus-visible */
*:focus-visible {
outline: 2px solid var(--color-shades-dark);
outline-offset: 4px;
}
Dukungan browser untuk :focus-visible

Ada berbagai cara untuk menandai item saat difokuskan.outline
direkomendasikan karena tidak merusak tata letak,border
,background-color
atau box-shadow
,

Selamat! Anda telah membuat navigasi utama yang ditingkatkan secara progresif,
Selalu ada hal yang dapat ditingkatkan,
- Anda dapat mempertimbangkan untuk menangkap fokus di dalam navigasi atau membuat bagian halaman lainnya inert pada area pandang yang sempit.
- Anda dapat menambahkan link lewati di bagian atas halaman untuk memungkinkan pengguna keyboard melewati navigasi.
Jika Anda ingat bagaimana artikel ini dimulai,
Navigasi versus menu
Ada perbedaan yang jelas antara navigasi dan menu.
Elemen <nav>
memiliki peran navigasi ARIA implisit yang cukup untuk menyampaikan bahwa elemen tersebut adalah navigasi,
Peran navigasi
Kumpulan elemen navigasi (biasanya link) untuk menavigasi dokumen atau dokumen terkait.
navigasi (peran) WAI-ARIA 1.1
Peran menu
Menu sering kali merupakan daftar tindakan atau fungsi umum yang dapat dipanggil pengguna.
menu (peran) WAI-ARIA 1.Peran menu sesuai jika daftar item menu ditampilkan dengan cara yang mirip dengan menu di aplikasi desktop. 1
Peran menubar
Presentasi menu yang biasanya tetap terlihat dan biasanya ditampilkan secara horizontal.
menubar (peran) WAI-ARIA 1.Peran menubar digunakan untuk membuat menu bar yang mirip dengan yang ditemukan di aplikasi desktop Windows, Mac, dan Gnome. Panel menu digunakan untuk membuat kumpulan perintah yang konsisten dan sering digunakan. Penulis harus memastikan bahwa interaksi menubar mirip dengan interaksi menubar standar di antarmuka pengguna grafis desktop. 1
Peran menuitem
Opsi dalam serangkaian pilihan yang terdapat dalam menu atau menubar.
menuitem (peran) WAI-ARIA 1.1
Spesifikasinya sangat jelas di sini,
Kapan menu sesuai?
Penggunaan utama item menu bukanlah navigasi,
<ul>
<li>
Product 1
<button aria-expanded="false" aria-controls="options1">Edit</button>
<div role="menu" id="options1">
<button role="menuitem">
Duplicate
</button>
<button role="menuitem">
Delete
</button>
<button role="menuitem">
Disable
</button>
</div>
</li>
<li>
Product 2
...
</li>
</ul>
Implikasi penggunaan peran menu
Sangat penting untuk menggunakan peran menu ini dengan bijak karena banyak hal yang dapat salah.
Menu mengharapkan struktur DOM tertentu.menuitem
harus berupa item turunan langsung dari menu
.
<!-- Wrong, don't do this -->
<ul role="menu">
<li>
<a href="#" role="menuitem">Item 1</a>
</li>
</ul>
Pengguna yang cerdas mengharapkan pintasan keyboard tertentu berfungsi dengan menu dan menubar.
- Enter dan Spasi untuk memilih item menu.
- Tombol panah di semua arah untuk beralih antar-item.
- Tombol Home dan End untuk memindahkan fokus ke item pertama atau terakhir.
- a-z untuk memindahkan fokus ke item menu berikutnya dengan label yang dimulai dengan karakter yang diketik.
- Esc untuk menutup menu.
Jika pembaca layar mendeteksi menu,
Hal yang sama berlaku untuk pengguna keyboard yang mungkin berharap dapat menggunakan Shift dan Shift + Tab.
Ada banyak hal yang perlu dipertimbangkan saat Anda membuat menu dan menu bar,
Referensi Tambahan
- Fixing Lists oleh Scott O'hara.
- Don't Use ARIA Menu Roles for Site Nav oleh Adrian Roselli.
- Menu & Tombol Menu oleh Heydon Pickering.
- Menu WAI-ARIA,
dan alasan Anda harus menanganinya dengan sangat hati-hati oleh Marco Zehe. - Menyembunyikan konten dengan bertanggung jawab oleh Kitty Giraudel.
- :focus-visible Is Here oleh Matthias Ott.
Banner besar oleh Mick Haupt