Tutorijal
Statusne poruke koje doista stignu
1 min čitanja
Ukratko
Statusna poruka mora se najaviti bez pomicanja fokusa. Za to treba živo područje koje je već u DOM-u prije poruke: role="status" (isto što i aria-live="polite"). Ako se spremnik umetne zajedno s tekstom, mnogi čitači zaslona ne čuju ništa.
Ukratko po koracima
Stvorite prazno živo područje
Stavite jedan <div role="status"> u stranicu, prazan i vizualno skriven.
Postavljajte samo tekst
Pri događaju promijenite tekst postojećeg područja umjesto da ga gradite iznova.
Polite umjesto assertive
Potvrde su polite. assertive prekida trenutačno čitanje i služi samo za hitno.
Provjerite čitačem zaslona
Pokrenite radnju bez gledanja: najavljuje li se poruka i je li fokus ostao gdje je bio?
Kriterij 4.1.3 primjećuje se zadnji jer vizualno ništa ne izgleda pokvareno: obavijest se pojavi, broj rezultata se osvježi, filtar proradi. Samo o tome ne sazna nitko tko upravo ne gleda to mjesto. Upravo te slučajeve pronalazi naš sloj za dinamički sadržaj, pokretanjem interakcije i promatranjem što se semantički zatim dogodi.
Tri tipične pogreške
<!-- 1. Toast wird samt Text neu ins DOM gehaengt:
oft kommt gar keine Ansage an, weil die Live-Region
im selben Moment erst entsteht -->
<script>
const toast = document.createElement("div");
toast.className = "toast";
toast.textContent = "In den Warenkorb gelegt";
document.body.appendChild(toast);
</script>
<!-- 2. Ergebniszahl aendert sich stumm -->
<p class="results">42 Treffer</p>
<!-- 3. Alles laut: assertive fuer eine harmlose Bestaetigung
unterbricht die laufende Ausgabe -->
<div aria-live="assertive">Filter angewendet</div>Prvi je slučaj najčešći i najpodmukliji: živo područje nastaje u istom trenutku kad i njegov sadržaj. Mnogi čitači zaslona prate samo područja koja su već postojala, pa ne jave ništa. U izvještaju to piše kao „živo područje umetnuto sa sadržajem“, i upravo se to misli.
Pouzdana izvedba
<!-- Die Live-Region steht von Anfang an im DOM und ist leer.
Spaeter wird nur ihr Text gesetzt: das loest die Ansage aus. -->
<div id="status" role="status" aria-live="polite" class="sr-only"></div>
<p class="results">
<span id="result-count" role="status">42 Treffer</span>
</p>
<script>
function announce(message) {
const region = document.getElementById("status");
// Leeren und im naechsten Frame setzen: identische Texte
// hintereinander werden sonst nicht erneut angesagt.
region.textContent = "";
requestAnimationFrame(() => {
region.textContent = message;
});
}
announce("In den Warenkorb gelegt");
</script>/* Visuell versteckt, aber im Accessibility-Tree vorhanden.
Nicht display:none verwenden: das entfernt die Region komplett. */
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip-path: inset(50%);
white-space: nowrap;
border: 0;
}polite, assertive ili fokus
- role="status" (polite): potvrde, broj rezultata, stanja učitavanja. Čeka da trenutačno čitanje završi.
- role="alert" (assertive): pogreške i upozorenja koja moraju stići odmah. Prekida, pa ga koristite štedljivo.
- Pomak fokusa: za događaje kod kojih se treba promijeniti i mjesto upravljanja, primjerice sažetak pogrešaka nakon slanja.
Detalji koji čine razliku
- Isti tekst dvaput zaredom često se ne najavi ponovno: prvo ispraznite, pa postavite u sljedećem okviru.
- Poruku držite kratkom i potpunom: „Dodano u košaricu: tenisica 4711“ bolje je od „Uspjeh“.
- Ako obavijest nestane nakon tri sekunde, informacija je za sporije čitanje izgubljena. Važne poruke zadržite ili ih ponovite na trajnom mjestu.
- Jedno živo područje po svrsi je dovoljno. Više njih istodobno se preklapa.
Provjera
- Pokrenite čitač zaslona, radnju izvedite tipkovnicom i odvratite pogled: stiže li najava?
- Provjerite je li fokus ostao gdje je bio (statusne poruke ga ne smiju krasti).
- Pokrenite istu radnju dvaput: najavljuje li se i drugi put?
Povezani WCAG kriteriji
Česta pitanja
- Zašto se ništa ne čuje iako je aria-live postavljen?
- Najčešće zato što je područje ušlo u DOM zajedno s tekstom ili je skriveno s display:none. Područje mora postojati prije, vidljivo ili sr-only skriveno, a mijenjati se smije samo njegov sadržaj.
- Koja je razlika između role="status" i aria-live="polite"?
- Praktički nikakva: role="status" donosi aria-live="polite" i aria-atomic="true". Uloga je kraći i robusniji zapis.
- Broji li se traka napretka kao statusna poruka?
- Prijelaz s „učitava“ na „gotovo“ jest statusna poruka i treba se najaviti. Za sam napredak koristite role="progressbar" s osvježenim aria-valuenow, inače se izgovara svaki postotak.
Zatražite besplatno skeniranje
Recite nam svoju domenu - provodimo besplatno početno skeniranje i pokazujemo najvažnije prepreke.