Tutorial ini menjelaskan cara membuat navigasi utama situs yang mudah diakses.
Ada banyak cara untuk membuat navigasi utama situs,
Untuk sebagian besar situs,
Membangun lapisan demi lapisan
Dalam tutorial ini,
Struktur dasar
Untuk navigasi dasar,<a>
dan beberapa baris CSS untuk meningkatkan gaya default dan tata letak 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.
- Umumkan 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 mana 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 link tersebut diberi gaya secara visual untuk 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 ini untuk memilih link aktif di CSS,active-page
menjadi tidak berlaku 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 manfaat 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 VoiceOver di Safari adalah Anda kehilangan semua keuntungan ini,list-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 burger
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. - Penting untuk menggunakan
insertBefore
,bukan appendChild
,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 membutuhkan 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(
,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.
Transisi CSS berikut opacity
untuk membuat efek fade-in dan fade-out.
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);
}
Cara ini memastikan bahwa hanya orang yang tidak memiliki preferensi terhadap gerakan yang dikurangi yang akan melihat animasi tersebut.
Meningkatkan gaya visual fokus
Pengguna keyboard bergantung pada gaya fokus elemen untuk orientasi dan navigasi pada halaman.outline: none
),
Berikut adalah 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
karena tidak merusak tata letak,border
,background-color
atau box-shadow
,
Selamat! Anda telah membuat navigasi utama yang disempurnakan secara bertahap,
Selalu ada hal yang dapat ditingkatkan,
- Anda dapat mempertimbangkan untuk menangkap fokus di dalam navigasi atau membuat bagian halaman lainnya tidak aktif 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 disajikan secara horizontal.
menubar (peran) WAI-ARIA 1.Peran bilah menu digunakan untuk membuat bilah menu 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 serupa dengan interaksi panel menu biasa pada 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 berharap agar pintasan {i>keyboard<i} tertentu berfungsi dengan menu dan bilah menu.
- Enter dan Spasi untuk memilih item menu.
- Tombol panah ke 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 diawali dengan karakter yang diketik.
- Tekan 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