Cara Memilih Kombinasi Warna yang Aksesibel
Pilihan warna terlihat seperti keputusan estetis dan bertindak seperti keputusan hukum. Kira-kira 4.000 gugatan aksesibilitas web per tahun menghantam tergugat AS sejak 2021, dan kontras warna yang tidak memadai adalah salah satu dari tiga isu yang paling sering dikutip dalam pengajuan berbasis WCAG (bersama dengan teks alt yang hilang dan bidang formulir tanpa label). Kabar baiknya adalah kontras paling sederhana dari ketiganya untuk diperbaiki: rasio kontras adalah angka, ambang WCAG adalah angka, dan Anda dapat menghitung satu terhadap yang lain dalam hitungan detik. Kabar buruknya adalah "aksesibel" melampaui rasio utama: buta warna, indikator fokus, mode gelap, dan tokenisasi semuanya penting, dan palet yang mendapat skor 4,5:1 di setiap gaya teks masih dapat gagal pada pengguna nyata.
Sejarah singkat aksesibilitas warna digital
Kontras warna sebagai standar tertulis berasal dari pekerjaan Web Accessibility Initiative pertama W3C pada 1997. Web Content Accessibility Guidelines 1.0 asli (Mei 1999) merekomendasikan kontras yang cukup dalam istilah kualitatif tanpa angka pasti. WCAG 2.0 (Desember 2008) memperkenalkan rumus luminansi relatif yang sekarang familiar dan rasio 4,5:1 di Level AA, diambil dari penelitian Lighthouse International tentang apa yang dapat dibaca dengan nyaman oleh pengguna lansia berkacamata baca pada layar.
Bobot hukum datang kemudian. Section 508 dari U.S. Rehabilitation Act merujuk WCAG 2.0 pada 2018; Americans with Disabilities Act, setelah putusan Sirkuit ke-9 Robles v. Domino's pada 15 Januari 2019 (Mahkamah Agung menolak mendengarkan banding pada Oktober 2019), sekarang dibaca oleh pengadilan AS sebagai mencakup aksesibilitas digital di bawah Title III. European Accessibility Act mulai berlaku 28 Juni 2025, mensyaratkan WCAG 2.1 AA pada layanan digital yang menghadap konsumen untuk sektor publik dan banyak perusahaan swasta. Dalam praktiknya, 4,5:1 teks normal + 3:1 teks besar + 3:1 komponen UI adalah lantai de facto untuk situs web publik yang sedang dibangun hari ini.
Ilmu pengetahuan terus berkembang. WCAG 2.1 (2018) menambahkan aturan kontras non-teks 3:1. Algoritma APCA, yang dikembangkan oleh Andrew Somers untuk WCAG 3, memodelkan persepsi kecerahan dengan lebih akurat dan memberikan angka yang berbeda untuk kombinasi yang sangat gelap dan sangat terang; ini adalah Editor's Draft per 2026, belum standar, jadi sebagian besar regulasi masih mengutip WCAG 2.x. OKLAB dan OKLCH dari Bjorn Ottosson (2020) memberi desainer ruang warna yang seragam secara perseptual yang membuat menghasilkan skala warna yang dapat diakses jauh lebih mudah daripada bekerja di HSL atau RGB.
Apa yang sebenarnya berarti "warna aksesibel"
Empat hal yang penting, bukan hanya satu rasio:
- Kontras latar depan vs latar belakang. Angka utama. Teks badan membutuhkan 4,5:1, teks besar 3:1, kontrol UI dan indikator fokus 3:1 terhadap warna yang berdekatan. Hitung rasio dengan rumus WCAG 2 di pemeriksa kontras mana pun.
- Buta warna. Kira-kira 8% pria dan 0,5% wanita melihat lebih sedikit warna daripada yang diasumsikan desain. Tiga jenis utama adalah protanopia dan deuteranopia (merah-hijau, paling umum), dan tritanopia (biru-kuning). Label kesalahan merah pada label sukses hijau dapat tidak terlihat oleh penampil protanopik.
- Warna tidak pernah menjadi satu-satunya sinyal. WCAG 1.4.1 melarang mengandalkan warna saja untuk menyampaikan makna. Batas "kesalahan" merah juga membutuhkan ikon atau label. Toast "sukses" hijau membutuhkan tanda centang.
- Indikator fokus. Pengguna keyboard perlu melihat di mana fokus berada. Aturan WCAG 2.4.7 mensyaratkan indikator fokus yang terlihat, dan pembaruan 2.4.11 (WCAG 2.2) mensyaratkan setidaknya 2 piksel CSS tebal dan kontras 3:1 terhadap warna yang berdekatan.
Palet yang menyusun rasionya benar tetapi mengabaikan tiga lainnya tetap gagal pada pengguna nyata.
Cara memilih warna yang aksesibel, langkah demi langkah
- Mulai dengan token semantik, bukan warna mentah. Definisikan
text-primary,text-secondary,surface-default,surface-elevated,border-default,accent-primary,accent-danger, dll. Petakan setiap token ke warna tertentu, dan biarkan token tersebut membawa makna semantik di mana saja dalam design system. - Pilih skala kecerahan. Gunakan nilai kecerahan OKLCH untuk membangun skala 5-9 langkah (50, 100, 200, ..., 900) di mana setiap langkah memiliki perbedaan perseptual yang konstan dari langkah berikutnya. Angka akan terlihat tidak biasa di OKLCH (sekitar L = 0,97, 0,93, 0,88...) tetapi langkah yang dirasakan akan merata, sesuatu yang tidak mungkin di HSL.
- Pilih corak pada setiap langkah kecerahan. Pilih corak merek, lalu pilih corak komplementer atau aksen yang mempertahankan chroma serupa. Gunakan OKLCH sehingga "biru saturasi 100" dan "oranye saturasi 100" terlihat sama cerahnya.
- Hitung rasio kontras. Setiap pasangan token yang bersentuhan membutuhkan rasio yang tepat. Teks badan pada permukaan default: 4,5:1. Teks yang dinonaktifkan pada permukaan default: tetap 3:1 jika perlu dapat dibaca. Indikator fokus pada permukaan yang berdekatan: 3:1.
- Jalankan simulator buta warna. Ambil layar kunci dan render ulang melalui simulator protanopia, deuteranopia, dan tritanopia. Konfirmasi bahwa informasi yang disampaikan oleh warna tetap dapat dibedakan.
- Uji dengan teknologi bantu nyata. Mac VoiceOver, NVDA, JAWS, dan TalkBack semuanya harus dapat dinavigasi tanpa bergantung pada isyarat warna.
- Tambahkan sinyal non-warna di mana saja warna membawa makna. Ikon untuk kesalahan/sukses/peringatan, garis bawah untuk tautan di teks badan, pola untuk seri grafik.
- Dokumentasikan token. Pustaka Figma, halaman Storybook, atau situs design-system statis. Auditor dan desainer baru harus dapat memilih token yang tepat dalam hitungan detik.
Referensi rasio kontras
| Pasangan | Min WCAG 2.1 | Level AA | Level AAA |
|---|---|---|---|
| Teks badan (di bawah 18 pt reguler atau 14 pt tebal) | 4,5:1 | 4,5:1 | 7:1 |
| Teks besar (18 pt reguler atau 14 pt tebal) | 3:1 | 3:1 | 4,5:1 |
| Komponen UI (batas formulir, status toggle, fokus) | 3:1 | 3:1 | t/a |
| Objek grafis (ikon yang membawa makna) | 3:1 | 3:1 | t/a |
| Teks di dalam logo | dikecualikan | dikecualikan | dikecualikan |
| Kontrol yang dinonaktifkan | dikecualikan | dikecualikan | t/a |
| Teks dekoratif | dikecualikan | dikecualikan | dikecualikan |
Pengecualian untuk kontrol yang dinonaktifkan adalah celah hukum, bukan restu kegunaan; kontrol yang dinonaktifkan yang tidak dapat dibaca siapa pun mungkin secara teknis lolos WCAG tetapi tetap akan membingungkan pengguna.
Jenis buta warna dan cara memeriksanya
| Jenis | Prevalensi | Kurang melihat | Kegagalan umum |
|---|---|---|---|
| Protanopia | ~1% pria | Merah | Kesalahan merah vs sukses hijau tidak dapat dibedakan |
| Deuteranopia | ~5% pria | Hijau | Sama: kebingungan merah-hijau |
| Tritanopia | ~0,005% | Biru | Biru vs kuning tidak dapat dibedakan |
| Achromatopsia | ~0,003% | Semua warna | Hanya melihat luminansi grayscale |
| Trikromasi anomali | ~5% | Sensitivitas berkurang dalam satu kanal | Perbedaan warna halus menyatu |
Selalu jalankan desain setidaknya melalui simulator protanopia dan deuteranopia; mereka menangkap sebagian besar pengguna buta warna.
Jebakan umum
- Mendesain di HSL atau RGB. Langkah numerik yang sama di HSL menghasilkan langkah yang dirasakan tidak sama. Lonjakan kecerahan 10% pada kuning pucat terlihat jauh lebih besar daripada lonjakan yang sama di biru tua. OKLCH memperbaikinya.
- Mengandalkan warna saja untuk menyampaikan keadaan. Merah dan hijau untuk kesalahan dan sukses: 8% pengguna tidak dapat membedakannya. Tambahkan ikon atau label.
- Hitam murni pada putih murni.
#000pada#FFFmendapat skor rasio 21:1 yang sempurna tetapi keras di mata untuk membaca lama. Turunkan ke hitam-dekat (#1a1a1a) dan putih-dekat (#f8f8f8) untuk teks badan. - Tirani warna merek. Memperlakukan merah merek sebagai sakral dan menggunakannya pada putih merek pada kontras 2,1:1 hanya karena "itu adalah merek." Segarkan palet merek menjadi yang memenuhi WCAG.
- Indikator fokus yang hilang pada latar gelap. Cincin biru 2 piksel terhadap tombol biru tua mungkin tidak terlihat. Uji cincin fokus terhadap setiap permukaan tempatnya mungkin muncul.
- Teks placeholder yang gagal kontras. Teks
placeholder=di dalam input dirender oleh browser pada opasitas ~40%. Pada input putih, itu mudah turun di bawah 4,5:1. - Garis batas bidang formulir yang terlalu samar. Batas 1px abu-abu-pada-putih pada kontras 1,2:1 gagal WCAG 1.4.11 (kontras non-teks). Tingkatkan ke 3:1 atau lebih tebal.
- Status hover yang hanya berubah warna. Beberapa perangkat input penunjuk (stylus Bluetooth, pelacakan mata) tidak menghasilkan hover; perubahan warna hanya-hover tidak terlihat bagi mereka. Gabungkan dengan bayangan halus atau transformasi.
- Mode gelap dengan inversi sederhana. Membalikkan palet terang menghasilkan warna gelap jenuh yang terlihat keras. Palet mode gelap membutuhkan tahap desain sendiri dengan aksen yang dijenuhkan.
- Teks yang dihasilkan otomatis dari gambar. Teks yang dirender di atas gambar yang diunggah pengguna tidak dapat menjamin kontras. Tambahkan latar belakang tembus pandang atau text-shadow yang mengembalikan kontras lokal.
Algoritma dan standar alternatif
| Algoritma | Tahun | Status | Kekuatan |
|---|---|---|---|
| Rasio kontras WCAG 2.x | 2008 | Diperlukan oleh sebagian besar regulasi | Matematika sederhana, banyak peralatan |
| APCA | 2020 | WCAG 3 Editor's Draft | Lebih baik dalam kecerahan perseptual |
| ISO 9241-302 | 2008 | Standar ergonomi workstation | Berorientasi perangkat keras, sangat ketat |
| Peringatan kontras Lighthouse | 2018 | Chrome DevTools | Gratis, dalam browser |
| axe-core | 2015 | Pustaka open-source | Standar industri untuk pengujian otomatis |
Untuk pekerjaan yang diatur hari ini, WCAG 2.1 AA adalah lantai. APCA layak dipantau saat WCAG 3 matang; banyak tim design system sudah melaporkan kedua angka.
Alat untuk memilih warna yang aksesibel
| Alat | Tujuan | Kekuatan |
|---|---|---|
| Pemeriksa kontras warna (browser) | Memberikan skor pada pasangan latar depan/latar belakang | Instan, tanpa unggah, dapat diakses dari perangkat mana pun |
| Generator palet aksesibel | Bangun skala kecerahan lengkap pada chroma konstan | Menggunakan OKLCH untuk keseragaman perseptual |
| Simulator buta warna | Render ulang layar seperti yang dilihat penampil buta warna | Menangkap masalah merah-hijau sebelum peluncuran |
| Chrome DevTools Lens | Memeriksa kontras dan buta warna di tempat | Terintegrasi di browser |
| WebAIM Contrast Checker | Referensi WCAG 2 klasik | Terpercaya, banyak dikutip |
| Stark (plugin Figma) | Audit desain Figma untuk kontras dan buta warna | Menangkap masalah pada waktu desain |
| axe DevTools (browser) | Pemindaian WCAG otomatis | Standar industri |
| Skala warna Tailwind, Radix, Open Props | Palet berbasis OKLCH yang telah diuji | Aksesibilitas dikurasi oleh tim desain |
Untuk proyek baru, mulailah dari palet yang teruji (Radix Colors dan Open Props adalah default yang baik), pilih token merek, dan verifikasi setiap pasangan teks-pada-permukaan dengan pemeriksa kontras. Untuk proyek yang ada, lakukan audit sekali untuk setiap pasangan teks/latar belakang di stylesheet Anda, perbaiki kegagalannya, dan tambahkan langkah Stark atau axe ke CI Anda sehingga kegagalan berikutnya ditangkap pada waktu PR.
Privasi dan alat
Pemeriksa kontras warna, generator palet aksesibel, dan simulator buta warna semuanya berjalan sepenuhnya di browser Anda. Warna yang Anda pilih atau tempel diproses oleh JavaScript di perangkat Anda, hasilnya dirender ke halaman, dan tidak ada yang dikirim ke server. Tidak ada telemetri, tidak ada analitik pada input, tidak ada skrip pihak ketiga. Untuk warna merek yang belum publik, palet produk internal, atau desain di bawah embargo, alur khusus-lokal itu adalah perbedaan antara mempercayai alat desain orang asing dengan aset merek Anda yang belum dirilis dan tidak. Alat dapat berjalan offline setelah halaman dimuat, yang dapat Anda verifikasi dengan mematikan jaringan dan memeriksa ulang pasangan kontras.
Pertanyaan yang sering diajukan
What contrast ratio does WCAG require?
WCAG 2.1 Level AA requires at least 4.5:1 for normal body text and 3:1 for large text (18 pt regular or 14 pt bold). Level AAA raises that to 7:1 for normal text and 4.5:1 for large text. Non-text UI components and graphical objects need 3:1 against adjacent colors.
Are WCAG contrast ratios scientifically accurate?
They are based on the WCAG 2.0 algorithm from 2008, which compares the relative luminance of two colors using the sRGB color space. The formula is imperfect for very dark and very light combinations and for some color hues; the APCA (Accessible Perceptual Contrast Algorithm) being developed for WCAG 3 produces more perceptually accurate results. For 2026 work, WCAG 2.x is still the standard most regulations cite.
How do I check whether my colors work for color-blind users?
Run them through a color-blindness simulator that converts your palette to what someone with protanopia, deuteranopia, or tritanopia sees. About 8% of men and 0.5% of women have some form of color vision deficiency, so this matters.
Should I use the same color palette for light and dark mode?
Usually not. Dark mode needs slightly desaturated colors at the same hue, otherwise vivid colors that look fine on white become eye-strain on black. Define semantic tokens (text-primary, surface-secondary) and map them to different physical colors per mode.
What does OKLCH have to do with accessibility?
OKLCH is a perceptually uniform color space (Bjorn Ottosson, 2020) where equal numerical changes produce equal perceptual changes. That makes it much easier to generate accessible color scales because you can step the lightness in equal increments and the perceived brightness step is consistent, which is hard to do in HSL or RGB. CSS supports OKLCH directly since 2023 in all major browsers.