WCAG ve ARIA
Hedeflenen kurallar ve HTML'in yetmediği yerde ARIA.
Erişilebilirlik Nedir
Erişilebilirlik (accessibility, kısaca a11y), bir sitenin engeli olan ya da olmayan herkes tarafından algılanabilmesi, kullanılabilmesi ve anlaşılabilmesidir. Kitle küçük değil: Dünya Sağlık Örgütü'ne göre 1,3 milyardan fazla kişi, yani dünya nüfusunun yaklaşık %16'sı bir engelle yaşıyor ve nüfus yaşlandıkça bu sayı artıyor.1
Erişilebilirlik yalnızca kalıcı engelleri kapsamaz:2
Kalıcı: Görme, işitme, motor ya da bilişsel bir engel.
Geçici: Bir kaza, ameliyat ya da ilaç nedeniyle kısa süreli yaşanan kısıtlar (kırık kol, göz ameliyatı).
Durumsal: Ortamdan gelen kısıtlar; örneğin gürültülü bir yerde sesi duyamamak.
Yani altyazı, klavyeyle kullanım ya da net etiketler herkesin işine yarar.
WCAG 2.2
Web Content Accessibility Guidelines (WCAG), W3C'nin web içeriğinin erişilebilirliği için yayımladığı standarttır. Güncel sürüm WCAG 2.2'dir: Ekim 2023'te yayımlandı, Aralık 2024'te güncellendi ve 2.1'e 9 yeni başarı kriteri ekledi. Aynı zamanda ISO standardıdır (ISO/IEC 40500:2025).3
WCAG 2.2'ye uyan içerik 2.1 ve 2.0'a da uyar; tek istisna 2.2'de kaldırılan 4.1.1 Parsing kriteridir.3
Dört ilke: POUR
Kriterler dört ilke altında toplanır.3 İlkelerin İngilizce baş harfleri POUR kısaltmasını oluşturur:
| İlke | Soru | Örnek |
|---|---|---|
| Perceivable (Algılanabilir) | İçerik görülebiliyor, duyulabiliyor mu? | Görsellerde alt, videoda altyazı |
| Operable (Kullanılabilir) | Her şey çalıştırılabiliyor mu? | Klavyeyle erişim, yeterli süre |
| Understandable (Anlaşılabilir) | İçerik ve davranış anlaşılır mı? | Sayfa dili, açık hata mesajları |
| Robust (Sağlam) | Yardımcı teknolojiler okuyabiliyor mu? | Doğru rol, isim ve durum |
A, AA, AAA
Her kriter üç seviyeden birindedir: A (en temel), AA ve AAA (en sıkı).3 Pratikte hedef AA'dır. WCAG'a atıf yapan Avrupa ve Kuzey Amerika yasaları neredeyse her zaman AA ister; AAA ise bazı içerikler için karşılanması mümkün olmadığından WCAG'ın kendisi tüm site için AAA'yı genel politika olarak önermez.4
İpucu
AAA kriterlerini çöpe atmayın: AA'yı tutturduktan sonra "daha iyisi ne olabilir" sorusunun cevabı genellikle oradadır.4
Yasal durum
European Accessibility Act (EAA), AB'de e-ticaret, bankacılık, e-kitap, ulaşım hizmetleri, akıllı telefon ve bilgisayar gibi ürün ve hizmetler için ortak erişilebilirlik kuralları koyan bir direktiftir.5 28 Haziran 2025'ten beri uygulanıyor; 10 kişiden az çalışanı ve 2 milyon avronun altında cirosu olan mikro işletmeler bazı yükümlülüklerden muaf.6 W3C, EAA için başvurulan sürümü WCAG 2.2 olarak listeler; EAA'ya uyum için çalışan kuruluşların çoğu WCAG'ı ve onu içeren Avrupa standardı EN 301 549'u kullanır.73 AB'ye ürün ya da hizmet satan bir site yapıyorsanız bu sizi doğrudan ilgilendirir.
WCAG 3 ise hâlâ taslaktır; birkaç yıl daha tamamlanması beklenmiyor ve tamamlandığında da WCAG 2'nin yerini hemen almayacak. W3C'nin bugün için önerisi WCAG 2.2'yi karşılamaktır.8
ARIA: Ne Zaman Gerekir
HTML dersindeki kuralı hatırlayın: anlamı ve davranışı veren yerel bir HTML elementi varsa ARIA değil o kullanılır. W3C'nin ARIA rehberi bunu daha sert söyler: "No ARIA is better than bad ARIA." Yanlış ARIA, ekran okuyucu kullanıcısına ekranda olmayan bir şeyi anlatır.9
Sorun yaygın: 2026'da bir milyon ana sayfanın %82,7'si ARIA kullanıyor ve sayfa başına ortalama 133'ten fazla ARIA attribute'u var; bu sayı bir yılda %27 arttı.10
ARIA (WAI-ARIA) üç şey ekler: rol (elementin ne olduğu), özellik (ek anlam, örneğin bağlı etiket) ve durum (açık mı, seçili mi gibi değişen bilgi).11 Yalnızca erişilebilirlik ağacını değiştirir; klavye davranışı, odak ya da tıklama eklemez, bunları JavaScript ile sizin yazmanız gerekir.1112
Erişilebilir İsim
Her etkileşimli elementin bir erişilebilir isim'i (accessible name) olmalıdır; ekran okuyucu elementi bu isimle duyurur. Çoğu zaman isim zaten HTML'den gelir: butonun metni, <label>. HTML'in yetmediği üç durum için üç attribute vardır.
aria-label
Görünür metni olmayan bir element için isim tanımlar. Tipik örnek yalnızca ikon içeren bir butondur.13
<button type="button" aria-label="Kapat" onClick={onClose}>
<XIcon aria-hidden="true" />
</button>aria-label yalnızca etkileşimli elementlerde, widget'larda, landmark'larda ve görsellerde güvenilir çalışır; düz bir <div> ya da <span>'e (rolü generic olan elementlere) isim vermez.13
aria-labelledby
İsmi sayfada zaten görünen bir metinden alır; değer, o metnin id'sidir. Birden fazla id boşlukla yazılabilir, isim bu sırayla birleşir.14
<h2 id="sepet-baslik">Sepetiniz</h2>
<ul aria-labelledby="sepet-baslik">…</ul>aria-describedby
İsme ek olarak daha uzun bir açıklama bağlar: ipucu, kural ya da hata mesajı. İsim kısa olmalı, açıklama ayrıntıyı taşır.15
<label htmlFor="sifre">Şifre</label>
<input id="sifre" type="password" aria-describedby="sifre-ipucu" />
<p id="sifre-ipucu">En az 12 karakter.</p>Öncelik sırası
Birden fazla kaynak varsa aria-labelledby, aria-label'ı ve <label>'ı ezer; aria-label de elementin kendi metnini ezer.1416 Bu yüzden ikisini aynı elemente yazmayın.13
Yap
İsmi önce yerel HTML ile verin (
<label>, buton metni).Görünür bir metin varsa
aria-labelledbyile ona bağlayın.
Yapma
Görünür etiket varken üstüne
aria-labelyazmayın. Görünmez, otomatik çeviride güvenilir şekilde çevrilmez ve diğer yöntemleri ezer.17
Durum Attribute'ları
Ekranda renkle ya da ikonla gösterdiğiniz durum ekran okuyucuya kendiliğinden geçmez. React'te bu attribute'ları state'e bağlarsınız.
aria-expanded: Bir paneli açıp kapatan kontrolün üzerine yazılır (panelin değil),true/falsealır. Kontrol edilen elementearia-controlsile işaret edilebilir.18aria-pressed: Butonu açık/kapalı bir toggle'a çevirir. Durum değişince etiketi değiştirmeyin: "Sessize al" etiketi aynı kalır, durumaria-pressedile söylenir.19aria-current: Bir grup içinde şu anki öğeyi işaretler; navigasyonda o anki sayfanın linki içinaria-current="page". Bir grupta yalnızca bir öğe current olur.20
function Accordion({ title, children }: { title: string; children: React.ReactNode }) {
const [open, setOpen] = useState(false);
return (
<>
<button type="button" aria-expanded={open} aria-controls="panel-1" onClick={() => setOpen(!open)}>
{title}
</button>
<div id="panel-1" hidden={!open}>
{children}
</div>
</>
);
}Tailwind kullanıyorsanız aria-expanded: variant'ı ile stili de aynı attribute'a bağlayabilirsiniz; durum ve görünüm tek yerden yönetilir.
Live Region
Sayfa yenilenmeden değişen içerik (sepete eklendi, kaydedildi, 3 sonuç bulundu) ekran okuyucuya duyurulmaz. Bunun için live region kullanılır.11
aria-live="polite": Değişiklik kullanıcı boşta kalınca okunur. Varsayılan tercih budur.21aria-live="assertive": O an okunan her şeyi keser; yalnızca acil durumlar için, az kullanın.21role="status": Örtük olarakaria-live="polite"taşır; kesmeden bilgi veren durum mesajları içindir. Mesaj gelince odağı oraya taşımayın.22
<p role="status">{saved ? "Değişiklikler kaydedildi." : ""}</p>Uyarı
Live region içerik değişmeden önce sayfada olmalıdır. Elementi mesajla birlikte render ederseniz çoğu zaman duyurulmaz; boş haliyle ilk markup'ta bırakıp yalnızca içeriğini değiştirin.21
aria-hidden
aria-hidden="true" bir elementi ve tüm çocuklarını erişilebilirlik ağacından çıkarır ama ekranda görünmeye devam eder. Yan yana metni olan süs ikonları için idealdir.23
Karmaşık Widget'lar
Tab, combobox, menü, tree gibi HTML'de karşılığı olmayan bileşenler için başvuru kaynağı WAI-ARIA Authoring Practices Guide (APG)'dir. Otuzdan fazla kalıbın her biri için hangi rolün, durumun ve klavye davranışının gerektiğini anlatır ve örnek uygulama verir.24 APG örnekleri öğrenmek içindir; üretime almadan önce tarayıcı ve ekran okuyucularda test edilmeleri gerekir.9
Bunları sıfırdan yazmak yerine çoğu projede headless (stilsiz) bir kütüphane kullanılır:
Radix Primitives: WAI-ARIA kalıplarını izler; rolleri, durumları, odak ve klavye davranışını yönetir. Etiketleri vermek yine sizin işiniz.25
React Aria: Adobe'nin 50'den fazla bileşenlik kütüphanesi; W3C'ye göre semantik ve klavye davranışı uygular, ekran okuyucularla test edilir, overlay'lerde odağı yönetir.26
İpucu
Headless kütüphane ARIA'yı doğru yazar, ama aria-label gibi içerik sizden gelir. Kütüphane kullanmak test etmeyi gereksiz kılmaz.25
Detaylı Öğrenmek İçin
Standart: W3C'nin WCAG 2 genel bakışı; sürümler, ilkeler ve seviyelerin resmi özeti.3
Widget kalıpları: APG'de yapmak istediğiniz bileşenin sayfası, klavye tablosuyla birlikte.24
Etiketleme stratejisi: Adrian Roselli'nin etiketleme yöntemlerini öncelik sırasına koyduğu yazı.17
Konuşma: Siddharth Kshetrapal'ın GitHub'da erişilebilir React bileşenleri kurmayı VoiceOver ile gösterdiği 29 dakikalık konuşma (React Summit 2024).27
Konuşma: Kat Shaw'un ARIA'ya başlangıç konuşması; ne zaman ARIA, ne zaman yerel HTML (A11yTalks, Ağustos 2024).28
Kaynaklar
Dünya genelinde 1,3 milyardan fazla engelli kişi ve yaşlanmayla artan sayı.
Engel türleri, geçici engeller ve durumsal kısıtlar.
WCAG 2.2'nin tarihi, dört ilke, A/AA/AAA, geriye uyumluluk ve ISO durumu.
Neden AA hedeflenir ve AAA neden tüm site için zorunlu tutulmaz.
EAA'nın kapsadığı ürün ve hizmetler.
28 Haziran 2025 tarihi, mikro işletme muafiyeti ve geçiş süreleri.
EAA ve Web Accessibility Directive için başvurulan WCAG sürümü ve EN 301 549.
WCAG 3'ün taslak durumu ve WCAG 2 ile ilişkisi.
"No ARIA is better than bad ARIA" ve ARIA'nın davranış eklemediği.
Ana sayfalarda ARIA kullanım oranı ve sayfa başına ARIA attribute sayısı.
Rol, özellik ve durum; ARIA'nın ne zaman gerektiği ve live region örneği.
Tüm ARIA attribute'ları ve ARIA'nın yalnızca erişilebilirlik ağacını değiştirdiği.
İkon butonu örneği ve `aria-label`'ın desteklendiği elementler.
Görünür metinden isim almak, birden fazla `id` ve öncelik.
İsim ile açıklama farkı ve açıklama bağlamak.
DevTools'ta erişilebilir isim kaynaklarının öncelik sırası.
Etiketleme yöntemlerinin sırası ve `aria-label`'ın sakıncaları.
Açılır panel kontrolü ve `aria-controls` ilişkisi.
Toggle buton, değerler ve etiketi değiştirmeme kuralı.
`page`, `step` gibi değerler ve navigasyonda kullanımı.
`polite`/`assertive` ve live region'ın önceden sayfada olması.
`role="status"`'un örtük değerleri ve odak uyarısı.
Süs içeriği gizlemek ve odaklanabilir elementlerde kullanmamak.
APG'nin kalıp, örnek ve pratik bölümleri.
WAI-ARIA kalıpları, odak ve klavye yönetimi, etiketlerin geliştiriciye kalması.
Adobe'nin stilsiz, erişilebilir React bileşen kütüphanesi.
- 27VideoSiddharth Kshetrapal: Building Accessible Reusable React Components at GitHub (React Summit 2024)
29 dakika. Tab ve form örnekleriyle ARIA rolleri, durumları ve `aria-describedby`.
ARIA'ya giriş: ne yapar, ne zaman yerel HTML tercih edilir.
Son güncelleme tarihi: 17 Ekim 2026
