ACCESSIBILITY DOCS
WCAG-GUIDELINES
Name
Description
Example
Output
WCAG 2.2 – Perceivable (Prinsip 1)Description: Informasi dan antarmuka harus dapat dipahami oleh indra pengguna.
Example:
Alt text pada gambar, transkrip video, kontras warna cukup.
Output: Konten dapat diakses
WCAG 2.2 – Perceivable (Prinsip 1)Informasi dan antarmuka harus dapat dipahami oleh indra pengguna.
Alt text pada gambar, transkrip video, kontras warna cukup.
Konten dapat diakses
WCAG 2.2 – Operable (Prinsip 2)Description: Antarmuka harus dapat dioperasikan oleh semua pengguna (keyboard, touch, voice).
Example:
Semua fungsi dapat diakses keyboard, cukup waktu membaca, hindari konten flashing.
Output: Navigasi inklusif
WCAG 2.2 – Operable (Prinsip 2)Antarmuka harus dapat dioperasikan oleh semua pengguna (keyboard, touch, voice).
Semua fungsi dapat diakses keyboard, cukup waktu membaca, hindari konten flashing.
Navigasi inklusif
WCAG 2.2 – Understandable (Prinsip 3)Description: Informasi dan operasi antarmuka harus dapat dimengerti.
Example:
Label formulir jelas, error disampaikan dengan teks, konsistensi navigasi.
Output: UI mudah dipahami
WCAG 2.2 – Understandable (Prinsip 3)Informasi dan operasi antarmuka harus dapat dimengerti.
Label formulir jelas, error disampaikan dengan teks, konsistensi navigasi.
UI mudah dipahami
WCAG 2.2 – Robust (Prinsip 4)Description: Konten harus cukup tangguh untuk ditafsirkan oleh berbagai user agent, termasuk assistive technology.
Example:
HTML valid, gunakan ARIA bila diperlukan, status disampaikan.
Output: Kompatibel dengan screen reader
WCAG 2.2 – Robust (Prinsip 4)Konten harus cukup tangguh untuk ditafsirkan oleh berbagai user agent, termasuk assistive technology.
HTML valid, gunakan ARIA bila diperlukan, status disampaikan.
Kompatibel dengan screen reader
Level A (Minimum)Description: Kriteria paling dasar. Tanpa ini beberapa pengguna tidak bisa mengakses.
Example:
Alt text untuk gambar, form label, tidak ada keyboard trap.
Output: Dapat diakses dasar
Level A (Minimum)Kriteria paling dasar. Tanpa ini beberapa pengguna tidak bisa mengakses.
Alt text untuk gambar, form label, tidak ada keyboard trap.
Dapat diakses dasar
Level AA (Standar)Description: Target umum untuk sebagian besar website. Mengatasi hambatan terbesar.
Example:
Kontras minimal 4.5:1, fokus terlihat, heading terstruktur.
Output: Aksesibilitas baik
Level AA (Standar)Target umum untuk sebagian besar website. Mengatasi hambatan terbesar.
Kontras minimal 4.5:1, fokus terlihat, heading terstruktur.
Aksesibilitas baik
Level AAA (Tertinggi)Description: Tingkat aksesibilitas tertinggi. Tidak semua konten bisa mencapai AAA.
Example:
Kontras 7:1, teks isyarat, tidak ada batas waktu.
Output: Aksesibilitas maksimal
Level AAA (Tertinggi)Tingkat aksesibilitas tertinggi. Tidak semua konten bisa mencapai AAA.
Kontras 7:1, teks isyarat, tidak ada batas waktu.
Aksesibilitas maksimal
SEMANTIC-HTML
Name
Description
Example
Output
<header>Description: Mendefinisikan bagian kepala halaman atau bagian.
Example:
<header><h1>Logo</h1><nav>...</nav></header>
Output: Screen reader kenali sebagai banner (jika dalam <body>)
<header>Mendefinisikan bagian kepala halaman atau bagian.
<header><h1>Logo</h1><nav>...</nav></header>
Screen reader kenali sebagai banner (jika dalam <body>)
<main>Description: Konten utama dokumen. Harus unik per halaman.
Example:
<main><article>...</article></main>
Output: Langsung lompat ke konten
<main>Konten utama dokumen. Harus unik per halaman.
<main><article>...</article></main>
Langsung lompat ke konten
<nav>Description: Navigasi utama. Gunakan aria-label jika ada banyak nav.
Example:
<nav aria-label="Main"><ul>...</ul></nav>
Output: Screen reader identifikasi navigasi
<nav>Navigasi utama. Gunakan aria-label jika ada banyak nav.
<nav aria-label="Main"><ul>...</ul></nav>
Screen reader identifikasi navigasi
<footer>Description: Bagian kaki halaman.
Example:
<footer><p>© 2025</p></footer>
Output: Dikenali sebagai contentinfo
<footer>Bagian kaki halaman.
<footer><p>© 2025</p></footer>
Dikenali sebagai contentinfo
<section>Description: Pengelompokan tematik, sebaiknya punya heading.
Example:
<section aria-labelledby="id"><h2 id="id">...</h2></section>
Output: Region terdefinisi
<section>Pengelompokan tematik, sebaiknya punya heading.
<section aria-labelledby="id"><h2 id="id">...</h2></section>
Region terdefinisi
<article>Description: Konten mandiri yang dapat berdiri sendiri.
Example:
<article><h2>Judul Artikel</h2>...</article>
Output: Screen reader bisa ringkas
<article>Konten mandiri yang dapat berdiri sendiri.
<article><h2>Judul Artikel</h2>...</article>
Screen reader bisa ringkas
<aside>Description: Konten sampingan, sering sebagai complementary.
Example:
<aside aria-label="Related articles">...</aside>
Output: Dapat dilewati
<aside>Konten sampingan, sering sebagai complementary.
<aside aria-label="Related articles">...</aside>
Dapat dilewati
Headings (h1-h6)Description: Struktur hierarki. Jangan lewati level.
Example:
<h1>Judul Halaman</h1><h2>Sub Judul</h2>
Output: Navigasi cepat dengan screen reader
Headings (h1-h6)Struktur hierarki. Jangan lewati level.
<h1>Judul Halaman</h1><h2>Sub Judul</h2>
Navigasi cepat dengan screen reader
ARIA-BASICS
Name
Description
Example
Output
roleDescription: Mendefinisikan peran elemen (bila tidak menggunakan elemen semantik).
Example:
<div role="button" tabindex="0" onclick="...">Klik</div>
Output: Diperlakukan sebagai tombol
roleMendefinisikan peran elemen (bila tidak menggunakan elemen semantik).
<div role="button" tabindex="0" onclick="...">Klik</div>
Diperlakukan sebagai tombol
aria-labelDescription: Memberikan label yang dapat dibaca oleh assistive technology.
Example:
<button aria-label="Tutup">×</button>
Output: Dibaca 'Tutup'
aria-labelMemberikan label yang dapat dibaca oleh assistive technology.
<button aria-label="Tutup">×</button>
Dibaca 'Tutup'
aria-labelledbyDescription: Merujuk id elemen lain sebagai label.
Example:
<h2 id="section-title">Berita</h2><section aria-labelledby="section-title">
Output: Region bernama
aria-labelledbyMerujuk id elemen lain sebagai label.
<h2 id="section-title">Berita</h2><section aria-labelledby="section-title">
Region bernama
aria-describedbyDescription: Merujuk deskripsi tambahan.
Example:
<input aria-describedby="hint"><span id="hint">Masukkan email</span>
Output: Deskripsi dibacakan setelah label
aria-describedbyMerujuk deskripsi tambahan.
<input aria-describedby="hint"><span id="hint">Masukkan email</span>
Deskripsi dibacakan setelah label
aria-hiddenDescription: Menyembunyikan elemen dari assistive technology.
Example:
<span aria-hidden="true">🎉</span>
Output: Ikon tidak dibacakan
aria-hiddenMenyembunyikan elemen dari assistive technology.
<span aria-hidden="true">🎉</span>
Ikon tidak dibacakan
aria-liveDescription: Menandakan wilayah dinamis yang akan diumumkan saat konten berubah.
Example:
<div aria-live="polite" id="notification">Pesan terkirim</div>
Output: Screen reader mengumumkan perubahan
aria-liveMenandakan wilayah dinamis yang akan diumumkan saat konten berubah.
<div aria-live="polite" id="notification">Pesan terkirim</div>
Screen reader mengumumkan perubahan
aria-atomicDescription: Apakah seluruh konten live region harus diumumkan.
Example:
aria-atomic="true"
Output: Semua konten dibaca ulang
aria-atomicApakah seluruh konten live region harus diumumkan.
aria-atomic="true"
Semua konten dibaca ulang
aria-relevantDescription: Tipe perubahan yang perlu diumumkan (additions, removals, text, all).
Example:
aria-relevant="additions"
Output: Hanya penambahan
aria-relevantTipe perubahan yang perlu diumumkan (additions, removals, text, all).
aria-relevant="additions"
Hanya penambahan
KEYBOARD-ACCESSIBILITY
Name
Description
Example
Output
tabindex="0"Description: Membuat elemen dapat difokuskan sesuai urutan DOM.
Example:
<div tabindex="0" role="button">Klik</div>
Output: Bisa Tab
tabindex="0"Membuat elemen dapat difokuskan sesuai urutan DOM.
<div tabindex="0" role="button">Klik</div>
Bisa Tab
tabindex="-1"Description: Dapat difokuskan lewat JavaScript, tidak dengan Tab.
Example:
<div tabindex="-1" id="modal">...</div>
Output: Fokus programatik
tabindex="-1"Dapat difokuskan lewat JavaScript, tidak dengan Tab.
<div tabindex="-1" id="modal">...</div>
Fokus programatik
Keyboard Event HandlingDescription: Tangani Enter dan Space untuk mengaktifkan, Escape untuk menutup.
Example:
button.addEventListener('keydown', (e) => { if (e.key === 'Enter' || e.key === ' ') activate() })Output: Interaksi keyboard penuh
Keyboard Event HandlingTangani Enter dan Space untuk mengaktifkan, Escape untuk menutup.
button.addEventListener('keydown', (e) => { if (e.key === 'Enter' || e.key === ' ') activate() })Interaksi keyboard penuh
Focus ManagementDescription: Pindahkan fokus ke elemen relevan setelah tindakan (contoh: setelah membuka modal).
Example:
modalOpen ? firstFocusable.focus() : trigger.focus()
Output: Tidak tersesat
Focus ManagementPindahkan fokus ke elemen relevan setelah tindakan (contoh: setelah membuka modal).
modalOpen ? firstFocusable.focus() : trigger.focus()
Tidak tersesat
No Keyboard TrapDescription: Pastikan pengguna keyboard bisa keluar dari semua komponen.
Example:
Modal: Escape tutup, Tab melingkar di dalam.
Output: Kebebasan navigasi
No Keyboard TrapPastikan pengguna keyboard bisa keluar dari semua komponen.
Modal: Escape tutup, Tab melingkar di dalam.
Kebebasan navigasi
FORMS-ACCESSIBILITY
Name
Description
Example
Output
<label>Description: Mengaitkan label dengan input melalui atribut for/id.
Example:
<label for="email">Email</label><input id="email" type="email">
Output: Klik label fokus ke input
<label>Mengaitkan label dengan input melalui atribut for/id.
<label for="email">Email</label><input id="email" type="email">
Klik label fokus ke input
aria-required / requiredDescription: Menandai input wajib.
Example:
<input aria-required="true" required>
Output: Diumumkan wajib
aria-required / requiredMenandai input wajib.
<input aria-required="true" required>
Diumumkan wajib
aria-invalidDescription: Menandai input yang tidak valid.
Example:
<input aria-invalid="true" aria-describedby="error-msg">
Output: Error diumumkan
aria-invalidMenandai input yang tidak valid.
<input aria-invalid="true" aria-describedby="error-msg">
Error diumumkan
Error Message (Live Region)Description: Tampilkan pesan error dengan aria-live untuk diumumkan.
Example:
<div id="error-msg" role="alert" aria-live="assertive">Email tidak valid</div>
Output: Langsung dibacakan
Error Message (Live Region)Tampilkan pesan error dengan aria-live untuk diumumkan.
<div id="error-msg" role="alert" aria-live="assertive">Email tidak valid</div>
Langsung dibacakan
COLOR-CONTRAST
Name
Description
Example
Output
Minimum Contrast (AA)Description: Teks normal minimal rasio 4.5:1, teks besar 3:1.
Example:
#333 di atas #fff → rasio 12.6:1 (lulus)
Output: Terbaca jelas
Minimum Contrast (AA)Teks normal minimal rasio 4.5:1, teks besar 3:1.
#333 di atas #fff → rasio 12.6:1 (lulus)
Terbaca jelas
Enhanced Contrast (AAA)Description: Teks normal minimal 7:1, teks besar 4.5:1.
Example:
#000 di atas #fff → 21:1
Output: Sangat kontras
Enhanced Contrast (AAA)Teks normal minimal 7:1, teks besar 4.5:1.
#000 di atas #fff → 21:1
Sangat kontras
Non-text ContrastDescription: Komponen UI dan grafik harus memiliki kontras minimal 3:1 terhadap latar.
Example:
Border input #ccc → kontras rendah, ganti #888
Output: Komponen terlihat
Non-text ContrastKomponen UI dan grafik harus memiliki kontras minimal 3:1 terhadap latar.
Border input #ccc → kontras rendah, ganti #888
Komponen terlihat
Jangan Hanya WarnaDescription: Informasi tidak boleh hanya disampaikan lewat warna.
Example:
Grafik: bedakan juga dengan pola atau label.
Output: Aksesibel untuk buta warna
Jangan Hanya WarnaInformasi tidak boleh hanya disampaikan lewat warna.
Grafik: bedakan juga dengan pola atau label.
Aksesibel untuk buta warna
ACCESSIBLE-NAMES
Name
Description
Example
Output
aria-label pada tombol ikonDescription: Tombol tanpa teks harus punya aria-label.
Example:
<button aria-label="Tutup dialog"><svg>...</svg></button>
Output: Nama aksesibel: 'Tutup dialog'
aria-label pada tombol ikonTombol tanpa teks harus punya aria-label.
<button aria-label="Tutup dialog"><svg>...</svg></button>
Nama aksesibel: 'Tutup dialog'
aria-labelledby untuk komponen kompleksDescription: Gabungkan beberapa ID untuk nama yang lebih deskriptif.
Example:
<div role="tablist" aria-labelledby="tablist-title"><h2 id="tablist-title">Pengaturan</h2>
Output: Nama aksesibel
aria-labelledby untuk komponen kompleksGabungkan beberapa ID untuk nama yang lebih deskriptif.
<div role="tablist" aria-labelledby="tablist-title"><h2 id="tablist-title">Pengaturan</h2>
Nama aksesibel
alt pada gambarDescription: Atribut alt memberikan deskripsi gambar.
Example:
<img src="chart.png" alt="Grafik penjualan kuartal 3 menunjukkan peningkatan 20%">
Output: Dibacakan
alt pada gambarAtribut alt memberikan deskripsi gambar.
<img src="chart.png" alt="Grafik penjualan kuartal 3 menunjukkan peningkatan 20%">
Dibacakan
MEDIA-ACCESSIBILITY
Name
Description
Example
Output
Caption & SubtitlesDescription: Sediakan teks untuk audio/video.
Example:
<track kind="captions" src="captions.vtt" srclang="en" label="English">
Output: Teks berjalan
Caption & SubtitlesSediakan teks untuk audio/video.
<track kind="captions" src="captions.vtt" srclang="en" label="English">
Teks berjalan
Audio DescriptionDescription: Deskripsi suara untuk konten visual penting.
Example:
<track kind="descriptions" src="desc.vtt">
Output: Penjelasan visual
Audio DescriptionDeskripsi suara untuk konten visual penting.
<track kind="descriptions" src="desc.vtt">
Penjelasan visual
TranskripDescription: Teks lengkap dari konten audio/video.
Example:
Tautan ke halaman transkrip di dekat video.
Output: Alternatif teks penuh
TranskripTeks lengkap dari konten audio/video.
Tautan ke halaman transkrip di dekat video.
Alternatif teks penuh
TESTING-TOOLS
Name
Description
Example
Output
Lighthouse (Audit A11y)Description: Alat bawaan Chrome DevTools untuk menilai aksesibilitas.
Example:
Buka DevTools > Lighthouse > Accessibility
Output: Skor a11y
Lighthouse (Audit A11y)Alat bawaan Chrome DevTools untuk menilai aksesibilitas.
Buka DevTools > Lighthouse > Accessibility
Skor a11y
axe DevToolsDescription: Ekstensi browser untuk menemukan masalah a11y otomatis.
Example:
Buka DevTools > axe DevTools > Scan all
Output: Daftar pelanggaran
axe DevToolsEkstensi browser untuk menemukan masalah a11y otomatis.
Buka DevTools > axe DevTools > Scan all
Daftar pelanggaran
WAVEDescription: Web Accessibility Evaluation Tool.
Example:
Kunjungi wave.webaim.org, masukkan URL.
Output: Laporan visual
WAVEWeb Accessibility Evaluation Tool.
Kunjungi wave.webaim.org, masukkan URL.
Laporan visual
Screen Reader Testing (NVDA/ VoiceOver)Description: Uji manual dengan screen reader untuk memastikan pengalaman pengguna.
Example:
Gunakan VoiceOver di Mac (Cmd+F5) atau NVDA di Windows.
Output: Navigasi non-visual
Screen Reader Testing (NVDA/ VoiceOver)Uji manual dengan screen reader untuk memastikan pengalaman pengguna.
Gunakan VoiceOver di Mac (Cmd+F5) atau NVDA di Windows.
Navigasi non-visual
BEST-PRACTICES
Name
Description
Example
Output
Skip Navigation LinkDescription: Tautan tersembunyi yang muncul saat fokus untuk langsung ke konten utama.
Example:
<a href="#main-content" class="skip-link">Skip to main content</a>
Output: Langsung ke <main id="main-content">
Skip Navigation LinkTautan tersembunyi yang muncul saat fokus untuk langsung ke konten utama.
<a href="#main-content" class="skip-link">Skip to main content</a>
Langsung ke <main id="main-content">
Gunakan Elemen SemantikDescription: Prioritaskan HTML semantik sebelum ARIA.
Example:
Gunakan <button> bukan <div role="button">
Output: Lebih mudah dan inklusif
Gunakan Elemen SemantikPrioritaskan HTML semantik sebelum ARIA.
Gunakan <button> bukan <div role="button">
Lebih mudah dan inklusif
Sediakan Teks Alternatif untuk Semua GambarDescription: Termasuk gambar dekoratif (alt="").
Example:
<img src="dekorasi.png" alt="">
Output: Dilewati screen reader
Sediakan Teks Alternatif untuk Semua GambarTermasuk gambar dekoratif (alt="").
<img src="dekorasi.png" alt="">
Dilewati screen reader
Pastikan Focus Indicator JelasDescription: Hindari outline: none tanpa pengganti.
Example:
:focus { outline: 2px solid blue; }Output: Pengguna keyboard tahu lokasi
Pastikan Focus Indicator JelasHindari outline: none tanpa pengganti.
:focus { outline: 2px solid blue; }Pengguna keyboard tahu lokasi