Browser: HTML, CSS, DOM, dan Aksesibilitas · 2/8
Aksesibilitas: bukan opsional
Navigasi keyboard, label, focus, dan kontras. Murah kalau dibangun dari awal, mahal kalau ditambal belakangan.
Baca 28 menit
Setelah pelajaran ini kamu bisa
- Menjelaskan aksesibilitas itu untuk siapa — yaitu semua orang
- Memeriksa kontras warna terhadap ambang batas WCAG
- Mengelola fokus supaya pengguna keyboard tidak pernah tersesat
- Memakai ARIA dengan benar, yang sebagian besar berarti memakainya lebih sedikit
Aksesibilitas biasanya dijelaskan sebagai hal untuk pengguna tunanetra. Cakupannya lebih luas dari itu, dan memikirkannya secara sempit adalah alasan ia dianggap opsional.
- Seseorang dengan tangan patah yang memakai satu tangan, hanya minggu ini.
- Seseorang di kereta dengan layar terkena matahari, yang butuh kontras.
- Seseorang yang mematikan gambar untuk menghemat kuota.
- Seseorang berusia 70 tahun yang butuh teks lebih besar.
- Seseorang yang trackpad-nya rusak.
- Crawler mesin pencari, yang membaca halamanmu seperti screen reader.
- Test otomatismu sendiri, yang mencari berdasarkan role dan label.
Kontras
Contrast ratio membandingkan tingkat kecerahan teks dengan latarnya, dari 1:1 (tak terlihat) sampai 21:1 (hitam di atas putih). WCAG menetapkan batas minimum, dan itu bukan angka sembarangan — semuanya berasal dari riset keterbacaan yang terukur.
| Konten | AA (target biasa) | AAA (lebih ketat) |
|---|---|---|
| Teks isi | 4.5:1 | 7:1 |
| Teks besar (18pt+ atau 14pt bold) | 3:1 | 4.5:1 |
| Ikon dan border UI | 3:1 | — |
| Kontrol yang disabled | tidak ada syarat | — |
Formula WCAG yang sebenarnya. Coba warna brand-mu sendiri — pasangan abu-abu di atas putih adalah tempat tim biasanya gagal.
Hasil
Tekan Jalankan untuk melihat hasilnya.
Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.
Fokus
Fokus adalah kursor untuk keyboard. Kalau pengguna tidak bisa melihat posisinya, halamannya tidak bisa dipakai tanpa mouse.
/* The single worst line of CSS on the web. */
*:focus { outline: none; }
/* If the default ring is ugly, replace it - never remove it. */
:focus-visible {
outline: 2px solid var(--ring);
outline-offset: 2px;
}:focus-visible menampilkan cincinnya untuk pengguna keyboard tapi tidak saat klik mouse — dan itulah perilaku yang sebenarnya diinginkan orang saat mereka memakai outline: none.- Jangan pernah menghapus indikator fokus tanpa menyediakan pengganti yang jelas terlihat.
- Urutannya mengikuti DOM. Kalau CSS-mu memindahkan sesuatu secara visual, urutan Tab tidak akan cocok — susun ulang markup-nya.
- Kembalikan fokus setelah dialog ditutup, ke kontrol yang membukanya. Kalau tidak, fokusnya melompat ke atas halaman dan penggunanya tersesat.
- Sediakan skip link supaya pengguna keyboard bisa melompati navigasi. Situs ini punya satu — tekan Tab di halaman mana pun sebagai aksi pertamamu.
- Jangan pernah pakai `tabindex` positif.
tabindex="0"membuat sesuatu bisa difokus,-1membuatnya hanya bisa difokus lewat script.tabindex="3"menciptakan urutan yang tidak bisa dipelihara siapa pun.
ARIA: aturan pertamanya adalah jangan pakai ARIA
Atribut ARIA mendeskripsikan role dan state ke teknologi bantu. Aturan pertama ARIA yang resmi adalah: kalau ada elemen native yang bisa melakukannya, pakai itu. ARIA hanya mengubah apa yang *dibacakan* — ia tidak menambahkan perilaku apa pun.
<!-- Bad: a lie. It says "button" but behaves like a div. -->
<div role="button">Save</div>
<!-- Good: no ARIA needed, because the element is already right. -->
<button>Save</button>
<!-- Good ARIA: describing state a native element cannot express. -->
<button aria-expanded="false" aria-controls="menu">Menu</button>
<div id="menu" hidden>...</div>
<!-- Good ARIA: announcing content that changes without a page load. -->
<div aria-live="polite">3 venues found</div>aria-live benar-benar diperlukan: pengguna visual melihat hasil baru muncul, dan tanpanya pengguna screen reader cuma mendapat kesunyian. Code runner di situs ini memakainya untuk panel output-nya.Tugas praktik
Jalankan Lighthouse di halaman mana pun di proyek ini: DevTools → Lighthouse → Accessibility → Analyze. Baca setiap item yang ditandainya, termasuk yang lolos. Lalu pilih situs terkenal dan lakukan hal yang sama — biasanya kamu akan menemukan kegagalan kontras dan label form yang hilang di keduanya.
Hasil yang diharapkan
Sebuah skor plus daftar masalah yang spesifik dan bisa ditindaklanjuti.