u bent hier

Een live region is een techniek om een paginawijziging duidelijk te maken voor gebruikers van een screenreader. Met een paginawijziging bedoelen we dat er informatie verschijnt of wijzigt op de pagina die je aan het bekijken bent. Blinden en veel slechtzienden hebben geen overzicht over het scherm. Hun aandacht is waar de focus zich bevindt. Elders op het scherm kan iets wijzigen (al dan niet door een actie van de gebruiker). Met een live region geef je de screenreader de opdracht om die gewijzigde informatie uit te spreken.

De live region techniek kan je gebruiken als de paginawijziging:

  • kort is,
  • voldoende belangrijk is
  • en geen interactie vereist.

Voorbeelden

  • Je moet een wachtwoord kiezen. Naast het invoerveld is de sterkte aangegeven. Naarmate je meer karakters invoert, verandert die van Zwak naar Matig en naar Sterk. Een blinde ziet niet dat de wachtwoordsterkte dynamisch wijzigt. Als het als live region is gemarkeerd, zal een screenreader de wachtwoordsterkte uitspreken als die wijzigt.

    screenshot wachtwoordveld met sterkte (could be stronger)

  • Je luistert naar muziek. Als een volgend nummer begint te spelen, verandert de titel en uitvoerder van het nummer waar je naar luistert. De kans is groot dat de focus zich niet op die plaats op de pagina bevindt. Een blinde gebruiker zal de paginawijziging niet opmerken. Een live region leest de gewijzigde informatie voor.
  • In een contactformulier vul je een e-mailadres in, maar je vergeet de apenstaart. Je tabt naar het volgende veld. De website injecteert op dat moment een foutmelding over het ongeldige e-mailadres. Niet iedereen zal de verschenen foutmelding opmerken. Als die in een live region verschijnt, zullen screenreaders ze voorlezen.
  • Een dynamisch filter: als je een filtercriterium activeert, wijzigt de resultatenlijst zonder dat een nieuwe pagina wordt geladen. Een blinde ziet de wijziging niet omdat die elders op het scherm gebeurt en weet dus niet dat het filter meteen is toegepast. Je kan dat duidelijk maken door het aantal gevonden resultaten als live region te markeren.

    live region op de tekst: we hebben 6 registrars gevonden

  • Als je online bankiert bij ING, kan je aanmelden door een QR-code the scannen. Na twee minuten vervalt de code. De melding die verschijnt, is best een live region zodat je deze wijziging hoort terwijl je bezig bent de code te scannen.

    screenshot vervallen QR code met melding

Hoe werkt het?

De container waarin informatie kan wijzigen, markeer je als een live region door er het aria-live-attribuut aan toe te voegen. Als je nog niet vertrouwd bent met ARIA-attributen, lees dan eerst het artikel Wat is ARIA?

<div id="nowplaying" aria-live="polite">
U luistert naar: Yesterday<br/>
Uitvoerder: The Beatles
</div>

Als het volgende nummer begint, wijzigt de informatie in deze container. Omdat de container een live region is, krijgt een screenreader de opdracht om de gewijzigde inhoud voor te lezen.

Hoe dringend is het?

Dit zijn mogelijke waarden voor het aria-live-attribuut:

  • aria-live="polite": de screenreader spreekt eerst uit waar hij mee bezig was en daarna leest hij de gewijzigde informatie in de live region voor. Polite is de meest geschikte waarde.
  • aria-live="assertive": de screenreader moet de gewijzigde informatie onmiddellijk uitspreken. Als hij bezig was andere tekst voor te lezen, onderbreek je die.
  • aria-live="off": dit maakt van de container (tijdelijk) geen live region.

Impliciete live regions

Ook met de ARIA role="status" en role="alert" kan je van een container impliciet een live region maken. De eerste komt overeen met aria-live="polite" en de tweede met aria-live="assertive".

Als je role="alert" gebruikt, zal de screenreader eerst melden dat het om een waarschuwing gaat en dan de inhoud van de live region voorlezen. Gebruik role="alert" als je bij het laden van de pagina een live region wil creëren die meteen iets voorleest. Voorbeeld:

<div role="alert">
De pagina wordt geladen.
</div>

Welke informatie voorlezen?

Standaard leest een screenreader enkel de gewijzigde tekst binnen een live region voor. Dat is goed bij een chat-toepassing: je hoort het bericht dat binnenkomt en niet opnieuw alle eerdere berichten.

Wil je daarvan afwijken en telkens de hele container laten voorlezen, voeg dan aria-atomic="true" toe. Een mogelijk voorbeeld is het aantal resultaten bij een dynamisch filter: zonder aria-atomic of met aria-atomic="false" zal een screenreader enkel het gewijzigde aantal uitspreken. De tekst "resultaten gevonden" is ongewijzigd en wordt niet voorgelezen. De wijziging heeft dan geen context.

<p aria-live="polite">
133 resultaten gevonden</p>

Door aria-atomic="true" toe te voegen, leest de screenreader de volledige inhoud:

<p aria-live="polite" aria-atomic="true">
57 resultaten gevonden</p>

Standaard spreekt de screenreader enkel de toevoegingen aan een live region uit en niet de inhoud die eruit verdwijnt. Wil je daarvan afwijken, dan heb je het aria-relevant attribuut nodig. Om naast de toevoegingen ook de verwijderde inhoud te laten uitspreken, voeg je aria-relevant="all" toe aan de live region container. Een voorbeeld is de deelnemerslijst van een webinar: als je ook de namen wil laten uitspreken van wie weggaat, dan voeg je aria-relevant="all" toe.

<ul id="participants"
aria-live="polite" aria-relevant="all">
<ul>
<li>Sophie</li>
<li>Inge</li>
</ul>

Als in een live region zeer veel wijzigt, kan je die tijdelijk aria-busy="true" geven. Dit onderdrukt de meldingen maar de screenreader verzamelt wel alle wijzigingen. Als je het attribuut daarna verwijdert of wijzigt naar aria-busy="false", leest de screenreader alle wijzigingen achter elkaar voor.

Aandachtspunten

  • Definieer de live region voordat de wijziging gebeurt. Met andere woorden: het aria-live-attribuut moet aanwezig zijn voordat de informatie wijzigt of verschijnt. Het werkt niet als je de container of het aria-live-attribuut pas injecteert samen met de gewijzigde inhoud.

    Voorbeeld: om dynamische foutmeldingen te kunnen tonen, voorzie je bij het laden van het formulier een lege container <div class="error" aria-live="polite"></div>. Als je een fout detecteert, injecteer je de tekst in deze container.

  • Een screenreader leest wijzigingen voor. Verder gebeurt er niets. De focus verplaatst niet. Als de gebruiker moet interageren met de nieuw verschenen informatie, dan is focusmanagement een betere techniek dan een live region.
  • De screenreadergebruiker heeft geen controle over de uitgesproken informatie. Als hij (per ongeluk) een toets aanraakt, wordt de aankondiging onderbroken en is er geen manier om de informatie opnieuw te beluisteren.
  • Als de boodschap tijdelijk is, verwijder ze dan als ze niet langer nodig is.

Wanneer niet gebruiken?

  • Gebruik geen live region voor onbelangrijke paginawijzigingen.

    Voorbeeld: een slideshow die elke drie seconden verspringt, is geen live region. Je pagina is onbruikbaar als je screenreadergebruikers elke drie seconden onderbreekt waar ze mee bezig zijn.

  • Gebruik ze niet voor lange informatie.

    Voorbeeld: bij een dynamisch filter is het zinloos om de hele resultatenlijst voor te lezen. Beperk de live region tot de melding met het aantal gevonden resultaten.

  • Gebruik geen live region als de informatie te vaak wijzigt.

    Voorbeeld: maak geen live region van een aftelklok die elke seconden wijzigt. De hele pagina wordt onbruikbaar voor screenreadergebruikers omdat ze elke seconde nieuwe informatie horen zonder dat ze daarom vroegen. Screenreadergebruikers kunnen dit niet uitschakelen. Wees je er als ontwikkelaar van bewust dat je met een live region de controle over de screenreader overneemt. With great power comes great responsibility!.

  • Een invoerveld is geen live region. Doe niet:

    <input type="text" name="firstname" aria-live="polite" />
    

    Als ik Bart type, hoor ik na de eerste letter "b", na de tweede letter "ba", na de derde letter "bar" en na de vierde letter "bart". Dat is storend en niet behulpzaam.

  • Als de gebruiker moet interageren met de nieuw verschenen inhoud, gebruik dan de techniek van focus management en geen live region.

Andere roles

Er bestaan nog ARIA roles die draaien rond paginawijzigingen, zoals role="Log", role="progressbar", role="marquee" en role="timer". Zoals we eerder aanhaalden, zou het te storend zijn voor gebruikers van screenreaders als al deze wijzigingen worden voorgelezen. Al deze roles hebben daarom standaard de waarde aria-live="off".

Testen

Of je live region werkt zoals je hebt gepland, kan je eigenlijk enkel testen met een screenreader. Daar komt een en ander bij kijken dat we uitleggen in het artikel testen met een screenreader.

Meer weten

Mozilla Developer Network reference guide to ARIA live regions.


Reacties

Reageer als eerste