Renk Dönüştürücü ve Kontrast Denetleyici
HEX, RGB, HSL ve OKLCH arasında dönüşüm yapın, seçtiğiniz iki rengi WCAG AA ve AAA ölçütlerine göre denetleyin. Kontrast oranını siz ayar yaptıkça gösterir.
Biçim dönüştürücü
Kontrast denetimi
Büyük metin, 18 punto ve üzeri ya da 14 punto kalın demektir. Harf kalınlığı okumaya yardım ettiği için eşik daha düşüktür.
Bu metin seçtiğiniz iki renkle gösteriliyor.
Yaygın olarak istenen seviye. AAA için oranın daha da yükselmesi gerekir.
Özet (TL;DR)
- WCAG normal metin için 4.5:1, büyük metin için 3:1 kontrast istiyor. Büyük metin 18pt ya da kalın 14pt ve üzeri demek.
- HSL'de aynı lightness değerine sahip iki renk gözle bakıldığında farklı parlaklıkta görünüyor, OKLCH'de görünmüyor.
- Kontrast oranı bağıl parlaklıktan hesaplanıyor, renkler birbirine ne kadar benziyor diye bakmıyor. İki canlı renk birbirine karşı rahatça çakabilir.
- Yarı saydam bir rengin kendi parlaklığı yok. Arka planla birleştirilmeden kontrastı hesaplanamaz.
Onaylanan marka rengi erişilebilirlik denetiminden döndü
Marka rengi seçildi, sunumda çok iyi durdu, herkes onayladı. Aylar sonra bir erişilebilirlik denetimi geldi ve o rengin beyaz üstündeki kontrastı 2.8:1 çıktı. Butonların yazısı, linkler, bilgi metinleri, hepsi sınıfta kaldı. Renk kötü değildi, sadece kimse ölçmemişti.
Rengin ekranda "yeterince koyu" görünmesi bir ölçüm değil. Kontrast, iki rengin birbirine ne kadar benzemediğiyle değil, ışık miktarlarının oranıyla hesaplanıyor ve gözünüz bu oranı doğru tahmin edemiyor.
Hangi biçim ne işe yarıyor
Dört biçim de aynı rengi anlatıyor, farkları neyi kolaylaştırdıklarında. Birini diğerine üstün kılan bir sıra yok, iş bazında seçim var.
| Biçim | Örnek | Ne zaman kullanılır |
|---|---|---|
| HEX | #4F46E5 | Tasarım devri, token dosyaları, kısa ve tek biçimli olduğu için |
| RGB | rgb(79, 70, 229) | Canvas ve görüntü işleme, kanal üzerinde aritmetik gerektiğinde |
| HSL | hsl(243, 75%, 59%) | Elle hızlı ayar: ton sabit tutup açıklığı oynatmak |
| OKLCH | oklch(0.5106 0.2301 276.97) | Algısal olarak dengeli palet üretmek ve kontrast ayarlamak |
Bu araç dördünü de hem okuyor hem yazıyor. Girdi tarafında CSS Color 4'ün yeni boşluklu sözdizimini de eski virgüllü sözdizimini de kabul ediyor, çünkü tasarım araçları yenisini üretirken mevcut stil dosyalarınız hâlâ eskisini kullanıyor.
Kısa HEX yazımında sık yapılan bir hata var: #f00 gibi üç haneli bir değer açılırken her karakter kendisiyle ikizleniyor, yani "f" harfi "ff" oluyor. Sıfırla tamamlayan bir uygulama "f0" üretir ve her kısa HEX değerini bir miktar koyultur. Aradaki fark tek bir renkte gözden kaçar, bir palet boyunca birikir.
Aralık dışı değerlerde ise araç sessizce kırpmak yerine hata veriyor. rgb(300, 0, 0) yazdığınızda kırmızı göstermek sorunu gizlemek olurdu; o değer büyük ihtimalle bir hesaplamadan yanlış çıkmıştır ve haberdar olmanız gerekir. Ton ise açı olduğu için kuralın dışında kalıyor: hsl(400 ...) geçerli CSS ve 40 derece anlamına geliyor, dolayısıyla kaydırılarak kabul ediliyor.
OKLCH neden fark yaratıyor
HSL'deki "lightness" bir algı ölçüsü değil, kırmızı, yeşil ve mavi kanalların en büyüğü ile en küçüğünün ortalaması. Bunun pratikteki sonucu şu: hsl(60 100% 50%) sarısı ile hsl(240 100% 50%) mavisi aynı lightness değerine sahip, ama sarı gözünüzü alacak kadar parlak, mavi ise neredeyse koyu. Göz yeşile ve sarıya maviden çok daha duyarlı, HSL bunu hiç hesaba katmıyor.
Bu farkın en can yakıcı hali palet üretirken ortaya çıkıyor. Klasik yöntem şu: bir renk seç, lightness'ı sabit tut, tonu 60 derecelik adımlarla döndür, altı renkli bir palet çıksın. Sonuç düzgün olmuyor. Sarı ve camgöbeği paletin içinden fırlıyor, mavi ve mor arkada kalıyor, elinizde dengesiz bir set kalıyor.
/* HSL: lightness sabit, ama algılanan parlaklık her adımda değişiyor */.a { background: hsl(0 80% 55%); } /* kırmızı, orta parlaklık */.b { background: hsl(60 80% 55%); } /* sarı, gözle bakınca çok daha parlak */.c { background: hsl(240 80% 55%); } /* mavi, gözle bakınca belirgin koyu */ /* OKLCH: L algıya karşılık geliyor, aynı döndürme dengeli bir palet veriyor */.a { background: oklch(0.65 0.18 25); }.b { background: oklch(0.65 0.18 85); }.c { background: oklch(0.65 0.18 265); } /* Aynı özellik tema üretmeyi de kolaylaştırıyor: L değerini 0.08 düşürmek tonu bozmadan bir basamak koyu ton verir. */OKLCH'nin L bileşeni algıyla birlikte hareket ediyor. Aynı L değerindeki iki renk gerçekten aynı parlaklıkta görünüyor, dolayısıyla tonu döndürerek ürettiğiniz palet dengeli çıkıyor. Bir rengi bir basamak koyultmak istediğinizde de sadece L düşüyor, ton kaymıyor. Araçtaki erişilebilir renk önerisi tam olarak bunu yapıyor: rengin ton ve doygunluğuna dokunmadan yalnızca OKLCH açıklığını ikili arama ile kaydırıyor, böylece öneri hâlâ sizin renginiz gibi görünüyor.
WCAG kontrastı ve 4.5:1 sayısının anlamı
Kontrast oranı 1 ile 21 arasında bir sayı. İki rengin bağıl parlaklığı hesaplanıyor, her ikisine 0.05 ekleniyor ve büyük olan küçüğe bölünüyor. O 0.05'ler ekrandaki ortam yansımasını modelliyor ve üst sınırın tam olarak 21 çıkmasının sebebi de bu.
Normal metin için AA seviyesi 4.5:1, AAA seviyesi 7:1 istiyor. Büyük metin için çıta düşüyor: AA 3:1, AAA 4.5:1. Büyük metnin tanımı 18pt ve üzeri, kalınsa 14pt ve üzeri. Sebebi harflerin kalınlaşması: kalın çizgi düşük kontrastta bile okunabilir kalıyor. Buradaki eşikler "en az" olarak tanımlı, yani tam 4.5 çıkan bir oran AA seviyesini geçiyor.
Uyarı
#FF0000 kırmızısı ile #00AA00 yeşili ekranda birbirine hiç benzemez, ama bağıl parlaklıkları yakın olduğu için kontrast oranları 1.29:1 çıkıyor ve biri diğerinin üstünde okunmuyor. Kontrast bir renk farkı ölçüsü değil, ışık miktarı oranı.Saydamlık kontrastı neden ölçülemez yapıyor
rgba(0, 0, 0, 0.6) bir renk gibi görünüyor ama tek başına bir parlaklığı yok. Ekranda gördüğünüz şey o rengin arkasındaki neyse onunla harmanlanmış hali. Beyaz üstünde açık gri, koyu gri üstünde neredeyse siyah. İki farklı renk, tek bir tanım.
Bu yüzden araç kontrast hesabında alfa kanalını bilerek yok sayıyor. Arka planı tahmin etmek, size kendinden emin ama yanlış bir sayı vermek olurdu. Yarı saydam bir katmanın kontrastını ölçmek istiyorsanız önce onu arka planla birleştirip çıkan opak rengi girin. Bu hesap kanal başına şu şekilde: sonuç = ön alfa + arka (1 - alfa).
Kontrast hesabının bir de sessizce yanlış yapılabilen tarafı var. Bağıl parlaklık, kanalların 0 ile 255 arasındaki ham değerlerinden değil, doğrusallaştırılmış hallerinden hesaplanıyor. Yaygın kısayol olan (c/255)^2.2 formülü koyu renklerde belirgin şekilde sapıyor: 0.02 değerinde doğru sonuç 0.00155 iken kısayol 0.00022 veriyor, yani yedi kat fark. Bu sapma doğrudan kontrast oranına yansıdığı için, erişilemez bir renk çiftini geçer gösteren bir araçla karşılaşmanız mümkün.
Aynı belirsizlik gradyanlar ve fotoğraf üstündeki metinler için de geçerli. Arka plan tek bir renk değilse ölçülecek tek bir kontrast da yok. Pratikte yapılması gereken, metnin denk gelebileceği en açık ve en koyu noktayı bulup ikisini de ölçmek, sonucu ise en kötü senaryoya göre kabul etmek.
Sıkça Sorulan Sorular
- İyi bir kontrast oranı kaçtır?
- Normal boyutlu metin için en az 4.5:1, AAA hedefliyorsanız 7:1. Büyük metinde (18pt, kalınsa 14pt ve üzeri) sınır 3:1'e iniyor. Gövde metninde 4.5'e çok yaklaşmak yerine biraz üstünde kalmak, ileride renk ince ayarı yapıldığında sizi tekrar sınırın altına düşmekten korur.
- HSL mi kullanmalıyım OKLCH mi?
- Tek bir rengi elle hızlıca ayarlıyorsanız HSL yeterli ve zaten aşina olduğunuz bir sistem. Birbiriyle dengeli birden fazla renk üretecekseniz ya da bir rengi tonunu bozmadan koyultacaksanız OKLCH doğru araç, çünkü lightness değeri algıya karşılık geliyor.
- Saydamlık kontrastı etkiler mi?
- Etkiler, ama hesaplanabilmesi için önce arka planla birleştirmeniz gerekir. Yarı saydam bir rengin kendi başına parlaklığı yoktur, o yüzden araç alfa kanalını kontrast hesabına katmaz. Birleştirilmiş opak rengi girerseniz sonuç doğru olur.
- Rengim koyu temada neden farklı görünüyor?
- Çevresindeki alan değiştiği için algı da değişiyor: aynı renk koyu zeminde daha parlak ve daha doygun görünür. Ayrıca kontrast oranı da değişir, çünkü ikinci renk artık başka bir renktir. Koyu temada genelde biraz daha düşük doygunluk ve biraz daha yüksek açıklık gerekir.
- HEX ile RGB aynı şey mi?
- Aynı sayıların iki farklı yazımı.
#4F46E5ilergb(79, 70, 229)aynı rengi anlatıyor, biri onaltılık biri onluk tabanda. HEX'in sekiz haneli hali sondaki bayta alfa koyuyor,rgba()ise alfayı 0 ile 1 arasında bir sayı olarak alıyor.