Bölüm 5 / 20
Semantik HTML
nav, main, section, article ve neden önemli.
14 dakikalık okuma
Bir sayfayı yalnız <div> ve
<span> ile de kurabilirsin; ekranda aynı görünür. Fark, sayfayı
gözle görmeyen her şey için ortaya çıkar: ekran okuyucular, klavye, arama motorları,
okuma modu, otomatik testler, tarayıcının kendi kısayolları. Semantik HTML, işaretlemeye
"bu bir gezinme, bu ana içerik, bu bir düğme" bilgisini eklemektir. Bu ders o bilginin nerede
saklandığını (erişilebilirlik ağacı), doğru ögelerin hangileri olduğunu, ARIA'nın ne zaman
gerektiğini ve — daha önemlisi — ne zaman gerekmediğini anlatıyor.
01Ne öğreneceksin
- Semantik ögelerin gerçekten ne işe yaradığı; "div çorbası" neden sorundur
- Yer imleri (landmark):
header,nav,main,aside,footer,section,article - Her birinin kuralı ve yaygın yanlış kullanımı
- Başlık hiyerarşisi neden hâlâ tek gerçek yapıdır (outline algoritması öldü)
figure,details,dialog,time,progress,meter- Erişilebilirlik ağacı: rol, ad, durum ve DevTools'ta nasıl okunur
- ARIA'nın beş kuralı ve
div role="button"'un gerçek maliyeti - Klavye erişilebilirliği: odak sırası,
tabindex, atlama bağlantısı - Semantiğin SEO, okuma modu ve otomatik test tarafındaki karşılığı
- Ölçme: erişilebilirlik ağacı, klavye turu, Lighthouse ve araçların sınırı
02Neden semantik
Şu iki parça ekranda aynı görünebilir:
<!-- A: anlamsız -->
<div class="ust">
<div class="menu"><div class="baglanti">Ana sayfa</div></div>
</div>
<div class="icerik">
<div class="baslik-buyuk">Başvurular</div>
<div class="dugme" onclick="gonder()">Gönder</div>
</div>
<!-- B: semantik -->
<header>
<nav aria-label="Ana menü"><a href="/">Ana sayfa</a></nav>
</header>
<main>
<h1>Başvurular</h1>
<button type="button" onclick="gonder()">Gönder</button>
</main>
A'nın kaybettikleri somuttur ve hiçbiri "iyi niyet" meselesi değildir:
| Kim | B ile ne kazanır |
|---|---|
| Ekran okuyucu kullanıcısı | Yer imleri arasında atlar ("ana içeriğe git"), başlık listesi çıkarır, "düğme" duyar, bağlantıyı Enter ile açar |
| Klavye kullanıcısı | <button> ve <a> Tab sırasına kendiliğinden girer; <div> girmez |
| Arama motoru | Ana içeriği menü ve altbilgiden ayırır |
| Okuma modu / "sonra oku" | <article> ve <main>'i bulup gereksizi atar |
| Otomatik testler | getByRole("button", { name: "Gönder" }) ile CSS sınıfına bağımlı olmayan sağlam testler (15. hat) |
| Sonraki geliştirici | Sayfanın yapısını class adlarını okumadan anlar |
Ölçülebilir bir örnek: A'daki <div class="dugme"> Tab ile
odaklanılamaz, Enter/Boşluk ile çalışmaz, ekran okuyucuda "Gönder" diye metin olarak
okunur — tıklanabilir olduğu hiç söylenmez. Aynı davranışı elde etmek için
tabindex="0", role="button", keydown dinleyicisi
(Enter ve Boşluk, Boşluk'un sayfa kaydırmasını da engelleyerek),
aria-disabled yönetimi ve odak halkası CSS'i yazman gerekir. Yani
<button> yazmak yerine 15 satır kod yazarsın ve muhtemelen bir
ayrıntıyı kaçırırsın.
03Yer imleri (landmark) ve sayfa iskeleti
<body>
<a class="atla" href="#ana">İçeriğe atla</a>
<header>
<a href="/">Kurum logosu</a>
<nav aria-label="Ana menü"> … </nav>
</header>
<nav aria-label="Konum"> Ana sayfa › Başvurular </nav>
<main id="ana">
<h1>Başvurular</h1>
<article>
<h2>2026-114 numaralı başvuru</h2>
<p>…</p>
<footer><time datetime="2026-03-14">14 Mart 2026</time></footer>
</article>
<section aria-labelledby="ilgili">
<h2 id="ilgili">İlgili duyurular</h2>
…
</section>
</main>
<aside aria-label="Yan bilgiler"> … </aside>
<footer>
<p>© 2026 Kurum</p>
</footer>
</body>
| Öge | Anlamı | Kural ve tuzak |
|---|---|---|
<header> | Bir bölümün ya da sayfanın giriş kısmı | Sayfada birden çok olabilir. Yer imi sayılması için body'nin doğrudan çocuğu olmalıdır; article içindekiler yer imi değildir |
<nav> | Gezinme bağlantı kümesi | Sayfadaki her bağlantı grubuna koyma — ana menü, kırıntı, sayfalama gibi büyük gruplara. Birden fazlaysa aria-label ile ayırt et |
<main> | Sayfanın ana içeriği | Sayfada bir tane ve gizlenmemiş olmalı. Menü, altbilgi, kenar çubuğu dışarıda kalır |
<article> | Tek başına anlamlı, bağımsız içerik | Ölçüt: kopyalayıp başka yere koysan anlamlı mı? Haber, yorum, ürün kartı, başvuru kaydı |
<section> | Tematik bir bölüm | Başlığı olmalıdır. Başlığı yoksa muhtemelen <div> istiyorsun. Erişilebilir adı olmadan yer imi de sayılmaz |
<aside> | Ana içerikle dolaylı ilgili yan içerik | Reklam, ilgili bağlantılar, sözlük kutusu. "Sağdaki sütun" demek değildir |
<footer> | Bölümün kapanışı | Telif, iletişim, yazar bilgisi. article içinde de kullanılır |
<div> | Anlamı yok | Ve bu bir kusur değildir — yalnız stil/yerleşim için kutu gerektiğinde doğru seçim odur |
section ile div ayrımı en çok karıştırılan konudur. Basit
ölçüt: bu bloğun bir başlığı var mı ve içindekiler o başlık altında toplanıyor mu?
Evetse section. Yalnızca Flexbox sarmalayıcısı olarak kutu gerekiyorsa
div. section'ı gereksiz yere kullanmak zararsız değildir; ekran
okuyucuda anlamsız bölge duyuruları üretir.
Atlama bağlantısı (İçeriğe atla) kurumsal projelerin erişilebilirlik
denetiminde ilk bakılan maddelerdendir. Klavye kullanıcısı her sayfada 30 menü bağlantısını
Tab'layarak geçmek zorunda kalmasın diye vardır. Görsel olarak gizlenir ama
odaklanınca görünür olmalıdır — display:none ile gizlersen odak da
alamaz:
.atla {
position: absolute;
left: -9999px;
}
.atla:focus {
left: 1rem;
top: 1rem;
z-index: 100;
}
Başlık hiyerarşisi: tek gerçek yapı
HTML5 tasarlanırken "belge ana hat algoritması" düşünülmüştü: her
<section> kendi başlık düzeyini yaratacak, böylece her yerde
<h1> yazılabilecekti. Bu algoritma hiçbir tarayıcı ya da yardımcı
teknoloji tarafından uygulanmadı ve HTML standardından kaldırıldı. Hâlâ bu şekilde
öğreten kaynaklar var; yanlıştır.
Bugün geçerli olan kurallar:
- Sayfada bir
<h1>, sayfanın konusu. - Seviye atlanmaz:
h2'den sonrah4gelmez. - Seviye görsel boyut için seçilmez; boyut CSS'in işidir.
- Bileşen içinde doğru seviyeyi bilmiyorsan (bileşen her yerde kullanılabiliyorsa) seviyeyi dışarıdan parametre olarak al — 10. ve 11. hattaki bileşen yazımında bu somut bir tasarım kararıdır.
Ekran okuyucu kullanıcılarının sayfayı keşfetme yollarından en çok kullanılanı başlık listesidir. Yani başlık hiyerarşisi, o kullanıcı için sayfanın içindekiler tablosudur ve bozuk hiyerarşi doğrudan gezinme kaybıdır.
04Diğer semantik ögeler
| Öge | Ne için | Not |
|---|---|---|
<figure> + <figcaption> | Görsel/kod/tablo + açıklaması | Açıklama görselle ilişkilendirilir; alt'ın yerini almaz, tamamlar |
<details> + <summary> | Açılır-kapanır bölüm | JavaScript'siz çalışır, klavyeyle açılır. Bu ders sayfasındaki "Kendini sına" kutuları budur |
<dialog> | Kalıcı/kalıcı olmayan iletişim kutusu | showModal() odağı hapseder, Esc ile kapanır, arka planı etkisizleştirir — elle yazınca en çok hata yapılan üç şey |
<time datetime> | Makine okunur tarih/süre | Görünen metin "dün" olsa bile datetime ISO olur |
<address> | İletişim bilgisi | Posta adresi için değil; yazarın/kurumun iletişim bilgisi için |
<progress> | Bilinen ilerleme | Değeri belirsizse value yazma — belirsiz durum gösterir |
<meter> | Bilinen aralıkta ölçüm | Disk doluluğu, puan. İlerleme değildir |
<output> | Hesaplama sonucu | Kendiliğinden canlı bölgedir; değer değişince ekran okuyucu duyurur |
<details> ve <dialog>, "elle yazmak yerine platformu
kullan" ilkesinin en iyi örnekleridir. Kendi kalıcı iletişim kutunu yazarsan odak hapsi
(modal açıkken Tab'ın arkadaki içeriğe kaçmaması), Esc ile kapanma, açılmadan önceki odağa
geri dönme, arka planın ekran okuyucudan gizlenmesi ve sayfa kaydırmasının kilitlenmesi
senin sorumluluğundur. <dialog> bunların çoğunu hazır verir.
05Erişilebilirlik ağacı
Tarayıcı DOM'un yanında ikinci bir ağaç kurar: erişilebilirlik ağacı. Ekran okuyucular DOM'u değil bu ağacı okur. Her düğümün dört temel bilgisi vardır:
| Bilgi | Nedir | Nereden gelir |
|---|---|---|
| Rol | Bu şey ne? (button, link, heading, table…) | Öge adından, ya da role ile ezilerek |
| Ad | Nasıl anılıyor? | <label>, iç metin, alt, aria-label, aria-labelledby |
| Açıklama | Ek bilgi | aria-describedby, title |
| Durum/özellik | Açık mı, seçili mi, devre dışı mı? | checked, disabled, aria-expanded, aria-current… |
Bunu görebilirsin: DevTools → Elements → sağdaki Accessibility bölmesi. Bir ögeye tıkla; rolünü, hesaplanan adını ve o adın hangi kaynaktan geldiğini gösterir. Erişilebilirlik hatalarını tahmin etmek yerine burada okumak, bu dersin en pratik çıktısıdır.
Ad hesaplama sırası bilinmesi gereken bir ayrıntıdır, çünkü sürprizler üretir:
aria-labelledby > aria-label > yerel etiket (label,
alt, iç metin) > title. Yani bir düğmeye
aria-label="Kapat" yazarsan, içindeki "İptal" metni duyulmaz. Sesli komut
kullanan biri ekranda "İptal" görüp "İptal'e tıkla" der ve hiçbir şey olmaz. Bu yüzden kural
şudur: görünen metin, erişilebilir adın içinde geçmelidir (WCAG 2.5.3, "Label in
Name").
06ARIA: ne zaman, ne kadar
ARIA (Accessible Rich Internet Applications), HTML'in karşılığı olmayan arayüz desenlerini (sekmeler, ağaç görünümü, birleşik kutu) erişilebilirlik ağacına anlatmak için vardır. Beş kuralı ezberlenir:
- Yerine geçen bir HTML ögesi varsa onu kullan.
<button>dururken<div role="button">yazma. - Yerleşik semantiği bozma.
<h2 role="button">yazarsan artık başlık değildir; başlık listesinden düşer. - Tüm etkileşimli ARIA bileşenleri klavyeyle kullanılabilmelidir. Rol vermek
davranış getirmez —
role="button"yazmak Enter tuşunu çalıştırmaz. - Odaklanabilir bir ögeyi
aria-hidden="true"yapma. Görünen ama ekran okuyucuda olmayan bir odak noktası üretirsin; kullanıcı Tab'lar, odak "hiçbir yere" gider. - Her etkileşimli ögenin erişilebilir bir adı olmalıdır. Yalnız simge içeren
düğmeler bu yüzden
aria-labelister.
Ve en önemli cümle: ARIA kullanmamak, yanlış ARIA'dan iyidir. Yanlış rol, ekran okuyucuya var olmayan bir gerçeklik anlatır ve kullanıcıyı tamamen yanlış yönlendirir; hiç ARIA olmasa kullanıcı en azından ham metni duyar.
Gerçekten gerekli olduğu yerler:
<!-- Simge düğmesi: görünen metin yok -->
<button type="button" aria-label="Menüyü aç" aria-expanded="false">☰</button>
<!-- Aynı sayfadaki iki gezinme -->
<nav aria-label="Ana menü">…</nav>
<nav aria-label="Konum">…</nav>
<!-- Bulunduğun sayfa -->
<a href="/basvurular" aria-current="page">Başvurular</a>
<!-- Süsleme: ekran okuyucu duymasın -->
<span aria-hidden="true">→</span>
<!-- Sonradan gelen bildirim: kesmeden duyur -->
<div role="status" aria-live="polite">3 kayıt bulundu.</div>
aria-live iki değerle kullanılır: polite kullanıcının o anki
okumasını bekler, assertive keser. Neredeyse her zaman polite
doğrudur; assertive yalnız kritik hatalar içindir ve kötüye kullanılırsa
ekran okuyucu kullanıcısı sayfayı kullanılamaz bulur. Ayrıca canlı bölge sayfa
yüklenirken DOM'da bulunmalıdır; içeriğiyle birlikte sonradan eklenen bir bölge çoğu
okuyucuda duyurulmaz.
Bu sitede de aynı kurallar uygulanmıştır: üst bardaki hamburger düğmesinde
aria-label ve aria-expanded, yan menüde ve kırıntı yolunda
aria-label vardır — kaynak koda bakıp doğrulayabilirsin.
Klavye ve odak
Semantik ögelerin en somut kazancı klavyedir. Varsayılan olarak odaklanabilen ögeler:
<a href>, <button>, <input>,
<select>, <textarea>, <details>,
<dialog>. <div> odaklanamaz.
tabindex | Anlamı | Kullanım |
|---|---|---|
0 | Doğal sıraya katıl | Özel bileşenler, kaydırılabilir bölgeler |
-1 | Tab ile değil, kodla odaklanabilir | Hata özeti, iletişim kutusu, "atla" hedefi |
| pozitif | Sırayı zorla öne al | Kullanma. Tüm sayfanın odak sırasını bozar ve bakımı imkânsızlaşır |
Odak halkasını outline: none ile kaldırmak, klavye kullanıcısı için
imleci silmek gibidir. Görsel olarak beğenmiyorsan değiştir, kaldırma:
/* Fare tıklamasında halka çıkmaz, klavyede çıkar */
:focus-visible {
outline: 2px solid var(--vurgu);
outline-offset: 2px;
}
Son olarak DOM sırası = okuma sırasıdır. CSS ile görsel sırayı değiştirmek
(order, grid-area, flex-direction: row-reverse) klavye
ve ekran okuyucu sırasını değiştirmez. Gözle soldan sağa okuduğun düzen, klavyede bambaşka
bir sırayla gezilebilir — 9. ve 10. derslerde bu tuzağı tekrar göreceğiz.
07Semantiğin diğer karşılıkları
- SEO. Arama motorları ana içeriği menüden ayırt etmek için semantik yapıyı
kullanır.
<h1>,<title>ve<meta name="description">sonuç sayfasında görünen şeyi belirler. Abartılmamalı: semantik doğru işaretlemenin yan faydasıdır, sıralama hilesi değildir. - Yapılandırılmış veri. Arama sonuçlarında zengin görünüm (etkinlik tarihi, iş
ilanı, SSS) için
application/ld+jsonile schema.org sözlüğü kullanılır. HTML semantiğinin üstüne eklenen ayrı bir katmandır. - Okuma modu ve paylaşım. Tarayıcının okuma modu, "sonra oku" servisleri ve sosyal
paylaşım önizlemeleri
<article>,<main>ve Open Graph etiketlerine bakar. - Testler. 15. hatta yazacağın testlerde
getByRole("button", { name: "Gönder" })gibi seçiciler, CSS sınıfına bağlı seçicilerden çok daha dayanıklıdır: sınıf adı değişince test kırılmaz, ama kullanıcının gördüğü şey değişince kırılır — ki istenen budur. - Mevzuat. Kamu kurumlarının web siteleri için erişilebilirlik bir tercih değil yükümlülüktür; Avrupa'da EN 301 549, uluslararası ölçüt olarak WCAG 2.x AA. Bir sonraki derste bunun ayrıntısı var.
Ölçme ve araçların sınırı
Otomatik araçlar (Lighthouse, axe, WAVE) erişilebilirlik sorunlarının yalnız
bir kısmını yakalar — kontrast, eksik alt, etiketsiz alan, bozuk
hiyerarşi gibi makine tarafından ölçülebilen şeyleri. Yakalayamadıkları: alt
metninin anlamlı olup olmadığı, odak sırasının mantıklı olup olmadığı, hata mesajının
anlaşılır olup olmadığı, canlı bölgenin doğru zamanda duyurulup duyurulmadığı. Bu yüzden
denetim üç ayaklıdır: otomatik araç + klavye turu + ekran okuyucuyla deneme.
Klavye turu 60 saniyelik bir testtir ve her özellik için yapılabilir: fareyi bırak, yalnız Tab / Shift+Tab / Enter / Boşluk / ok tuşları / Esc ile sayfayı baştan sona kullan. Odağın nerede olduğunu her an görebiliyor musun? Bir yere sıkışıyor musun? Görünmeyen bir ögeye odaklanıyor musun? Bu üç soru, otomatik araçların bulduğundan daha çok gerçek hata çıkarır.
08Mini alıştırma — Div çorbasını semantiğe çevir
Yaklaşık 20 dakika · tek dosya + DevTools
- Kur: yalnız
<div>ve<span>kullanarak bir kurum sayfası yaz: üst menü, kırıntı, başlık, iki içerik bloğu, yan kutu, altbilgi, bir "Gönder" düğmesi. - Ölç: DevTools → Elements → Accessibility bölmesinde ağacı incele. Kaç yer imi (landmark) var? Lighthouse → Accessibility puanı kaç?
- Klavye turu: fareyi bırak, sadece Tab ile gez. "Gönder" düğmesine odaklanabildin mi?
- Çevir: aynı sayfayı
header,nav,main,article,section,aside,footer,h1–h3vebuttonile yeniden yaz. Görünüşü değiştirme. - Tekrar ölç: yer imi sayısı ve Lighthouse puanı nasıl değişti? Klavye turunu tekrarla.
- İki
nav: ana menü ve kırıntıyı ikisi de<nav>yap vearia-labelverme. Erişilebilirlik ağacında ikisi nasıl görünüyor? Sonra etiketleri ekle. sectiontuzağı: başlıksız bir<section>koy ve ağaçta nasıl göründüğüne bak.aria-labelledbyile bir başlığa bağla.- Ad hesaplama:
<button aria-label="Kapat">İptal</button>yaz. Accessibility bölmesinde hesaplanan ad ne? Bu neden bir sorundur? - Başlık hiyerarşisi:
h1 → h3 → h2sırasıyla başlık koy; Lighthouse uyarısını oku ve düzelt. - Atlama bağlantısı: sayfanın başına "İçeriğe atla" ekle; önce
display:noneile gizle (Tab ile bulunabiliyor mu?), sonra ekran dışına taşıyan yöntemle. - Odak halkası:
*:focus { outline: none }yaz ve klavyeyle gez. Sonra:focus-visibleile geri getir. detailsvedialog: bir SSS bölümünü<details>ile, bir onay penceresini<dialog>+showModal()ile yaz. Esc çalışıyor mu, odak dışarı kaçıyor mu?- Canlı bölge: bir düğme "3 kayıt bulundu" metnini bir
role="status"kutusuna yazsın. Ekran okuyucu (ya da tarayıcının erişilebilirlik denetleyicisi) duyurdu mu? Kutuyu içeriğiyle birlikte sonradan oluşturursan ne oluyor?
09Kendini sına
Semantik HTML kullanmanın somut faydaları nelerdir? "Aynı görünüyor" itirazına ne cevap verirsin?
Görünüş, HTML'in tek tüketicisi olan tarayıcı ekranı içindir;
semantik, sayfayı gözle görmeyen tüketiciler içindir. Somut kazançlar: (1) Ekran
okuyucu yer imleri arasında atlar ("ana içeriğe git"), başlık listesi üretir, "düğme"
ya da "bağlantı" olduğunu duyurur. (2) Klavye — <button> ve
<a href> Tab sırasına kendiliğinden girer, Enter/Boşluk ile çalışır,
odak halkası alır; <div onclick> bunların hiçbirini yapmaz ve aynı
davranış için 15 satır ek kod ister. (3) Arama motoru ve okuma modu ana içeriği
menüden ayırır. (4) Testler role/name üzerinden yazılır ve CSS sınıfı değişince
kırılmaz. (5) Bakım — yapı, sınıf adları okunmadan anlaşılır. (6) Mevzuat —
kamu projelerinde erişilebilirlik yükümlülüktür ve semantik onun temelidir. "Aynı
görünüyor" itirazının cevabı tek cümledir: aynı görünüyor ama aynı çalışmıyor;
farkı görmek için fareyi bırakıp sayfayı yalnız klavyeyle kullanmak yeterlidir.
<section> ile <div> arasındaki fark nedir? <article> ne zaman kullanılır?
<div>'in hiçbir anlamı yoktur ve bu bir
kusur değildir: yalnız stil/yerleşim için kutu gerektiğinde doğru seçim odur.
<section> ise tematik bir bölüm bildirir ve kuralı şudur:
başlığı olmalıdır. Başlığı olmayan bir section, erişilebilirlik
ağacında adsız bir bölge üretir ya da hiç yer imi sayılmaz — o durumda istediğin şey aslında
div'dir. Ölçüt: "bu bloğun bir başlığı var ve içindekiler o başlık altında
toplanıyor mu?" <article> için ölçüt farklıdır: bu içeriği kopyalayıp
başka bir yere koysan tek başına anlamlı olur mu? Haber, blog yazısı, forum iletisi,
ürün kartı, bir başvuru kaydı — evet. Bir sayfanın "Özellikler" bölümü — hayır, o
section'dır. İç içe de olabilirler: bir article içinde yorumların
her biri ayrı article olabilir. Son bir not: section'ı gereksiz
kullanmak zararsız değildir; anlamsız bölge duyuruları gürültü üretir.
<div role="button" onclick> ile <button> arasında pratikte ne fark var?
<button> altı şeyi ücretsiz verir:
(1) Tab sırasına girer; (2) Enter ve Boşluk ile tetiklenir (Boşluk'un sayfayı
kaydırmasını da engeller); (3) erişilebilirlik ağacında "button" rolüyle görünür;
(4) disabled özniteliğiyle hem görsel hem etkileşim hem erişilebilirlik
durumunu birlikte yönetir; (5) form içinde type="submit" ile formu gönderir;
(6) tarayıcının odak halkasını ve platformun dokunma davranışını alır.
<div role="button"> ise yalnız rolü taklit eder — rol vermek
davranış getirmez. Aynı sonucu elde etmek için tabindex="0",
keydown dinleyicisi (Enter ve Boşluk, preventDefault ile),
aria-disabled yönetimi, odak stili ve muhtemelen role'ün
gerektirdiği başka durum öznitelikleri yazman gerekir. ARIA'nın birinci kuralı tam olarak
bunu söyler: yerine geçen bir HTML ögesi varsa onu kullan. Meşru istisna: mevcut
bir tasarım sisteminde iç içe geçmiş yapı yüzünden gerçekten button
kullanılamıyorsa — ama o zaman da yukarıdaki listenin tamamı yazılmalıdır.
ARIA ne zaman kullanılır? "ARIA kullanmamak kötü ARIA'dan iyidir" ne demek?
ARIA, HTML'de karşılığı olmayan arayüz desenlerini
erişilebilirlik ağacına anlatmak için vardır: sekme grupları, ağaç görünümü, birleşik kutu
(combobox), kaydırıcı, canlı bölgeler. Ayrıca var olan ögelere ad ve durum eklemek
için kullanılır: simge düğmesine aria-label, açılır menüye
aria-expanded, aktif bağlantıya aria-current, bildirime
role="status" + aria-live="polite". Kullanılmaması gereken yer,
HTML'in zaten karşıladığı her durumdur. "ARIA kullanmamak kötü ARIA'dan iyidir" cümlesi
şunu söyler: yanlış bir rol, hiç rol olmamasından daha zararlıdır. Bir
<div>'e role="button" yazıp klavye desteği eklemezsen,
ekran okuyucu kullanıcısına "burada bir düğme var" dersin ama kullanıcı onu
çalıştıramaz — bu, hiç duyurmamaktan kötüdür. Aynı şekilde
<h2 role="presentation"> başlığı hiyerarşiden silmiş olur.
Beş kural: yerine geçen HTML varsa onu kullan; yerleşik semantiği bozma; ARIA
bileşenlerini klavyeyle kullanılabilir yap; odaklanabilir ögeyi
aria-hidden yapma; her etkileşimli ögeye erişilebilir bir ad ver.
10Sınav köşesi
Yazılıda nasıl sorulur
(1) Semantik HTML nedir, faydaları nelerdir? (2) HTML5 ile gelen semantik ögeleri
sayınız. (3) <section> ile <article> farkı.
(4) <main> sayfada kaç kez kullanılır? (5) Başlık hiyerarşisi kuralları.
(6) ARIA nedir, ne zaman kullanılır? (7) aria-label ile
aria-labelledby farkı. (8) tabindex değerleri ve pozitif
değerin sakıncası. (9) Erişilebilirlik ağacı nedir? (10) Ekran okuyucu kullanıcısı bir
sayfada nasıl gezinir? (11) <div> ile düğme yapmanın sakıncaları.
(12) Atlama bağlantısı (skip link) nedir?
Sözlüde nasıl anlatılır — 2 dakikalık taslak
Düzen: (1) Tanım — "semantik HTML, işaretlemeye anlam eklemektir: bu gezinme, bu ana
içerik, bu düğme. Görünüşü değiştirmez, sayfayı gözle görmeyen her tüketici için
değiştirir." (2) Somut kazanç — "ekran okuyucu yer imleri ve başlıklar arasında atlar,
<button> klavyeyle çalışır, testler role/name ile yazıldığı için CSS
değişince kırılmaz." (3) Kıdem vuruşu — "erişilebilirliği tahmin etmem: DevTools'un
erişilebilirlik ağacında rolü ve hesaplanan adı okurum; ad hesaplama sırasında
aria-label görünen metni ezer, bu yüzden görünen metnin adın içinde geçmesine
dikkat ederim." (4) ARIA duruşu — "önce doğru HTML ögesini kullanırım; ARIA'yı yalnız
HTML'de karşılığı olmayan desenlerde ve ad/durum eklemek için kullanırım. Yanlış ARIA,
hiç ARIA olmamasından kötüdür." (5) Süreç — "otomatik araçlar sorunların bir kısmını
yakalar; her özelliği fareyi bırakıp klavyeyle baştan sona denerim — bu, Lighthouse'un
bulamadığı hataların çoğunu çıkarır."
