Direct naar de inhoud

Bediening

Een website moet gemakkelijk te bedienen zijn voor iedereen. Veel mensen gebruiken een muis en toetsenbord, maar niet iedereen kan dat even goed. Mensen met motorische beperkingen of blinde/slechtziende bezoekers hebben soms moeite met het gebruik van een muis. Zorg er daarom voor dat alle functionaliteit ook alleen met het toetsenbord te bedienen is.

  • Slepen: wat het criterium vraagt

    Slepen vraagt drie dingen tegelijk: precies raken, ingedrukt houden en tegelijk bewegen. Voor wie beeft, met zijn ogen aanwijst of een schakelaar gebruikt zijn dat drie opgaven achter elkaar. Kan een functie alleen met slepen worden bediend, zorg dan dat die ook met losse klikken of tikken werkt.

    Dit criterium is nieuw in WCAG 2.2 en staat op niveau AA.

    Waar het opduikt:

    • Schuifregelaars voor een prijsbereik of het volume.
    • Lijsten die je herschikt door onderdelen te verslepen.
    • Kaarten die je moet verschuiven om een ander gebied te zien.
    • Een carrousel die alleen met vegen te bedienen is.

    Er is een uitzondering als het slepen de handeling zelf is: een handtekening zetten, tekenen, schilderen. Bij twijfel helpt één vraag: is hetzelfde resultaat met knoppen te bereiken? Bij een schuifregelaar wel, bij een handtekening niet.

    Dit criterium gaat over de aanwijzer, niet over het toetsenbord. Dat laatste is 2.1.1. Ook wie een muis of aanraakscherm gebruikt maar niet kan slepen, moet erlangs kunnen. Beide criteria moeten dus kloppen.

    Open dit onderwerp op een eigen pagina

  • Zichtbare focus: de focusring

    Een site heeft lichte en donkere vlakken. Een focusrand van één kleur valt daardoor altijd op één van de twee weg. Zet daarom een lichte ring binnen een donkere: op een donkere knop valt de lichte op, op een lichte knop de donkere.

    In de code ziet dat er zo uit:

    :where(a, button, input, select, textarea, summary, [tabindex]):focus-visible {
      outline: 2px solid transparent;   /* blijft staan in de hoogcontrastmodus */
      outline-offset: 2px;
      box-shadow:
        0 0 0 2px #FFFFFF,              /* binnenring: licht */
        0 0 0 5px #08251C;              /* buitenring: donker */
      border-radius: 6px;
    }

    De doorzichtige outline lijkt overbodig maar is dat niet. In de hoogcontrastmodus van Windows verwijdert het systeem alle kleuren en schaduwen, waardoor de box-shadow verdwijnt. Een outline blijft wel staan en krijgt dan de systeemkleur.

    Gebruik :focus-visible en niet :focus. Met :focus krijgt ook een bezoeker die met de muis klikt een rand om zijn knop. Met :focus-visible bepaalt de browser het zelf: een rand bij het toetsenbord, geen rand bij de muis.

    Drie oplossingen die niet genoeg zijn:

    • Alleen de kleur van de knop veranderen. Kleurverschil alleen is geen zichtbare focus, en voor wie kleur anders ziet werkt het niet.
    • De rand strak om het onderdeel leggen. Met outline-offset blijft er lucht, waardoor de rand ook op een gekleurde knop opvalt.
    • Een rand dunner dan 2 pixels. Op een vergroot scherm valt die weg tegen de rand van het onderdeel zelf.

    Open dit onderwerp op een eigen pagina

  • Tooltips: er een bouwen die blijft staan

    De eenvoudigste oplossing is geen tooltip bouwen maar de tekst op de pagina zetten. Kan dat niet, dan moeten er drie dingen kloppen.

    Escape sluit de uitleg:

    element.addEventListener('keydown', function (e) {
      if (e.key === 'Escape') { verbergTooltip(); }
    });

    De aanwijzer kan erheen. Laat geen gat tussen het onderdeel en de uitleg: beweegt de aanwijzer over dat gat, dan telt dat als wegwijzen en verdwijnt de uitleg.

    .tooltip {
      margin-block-start: 0;
      padding-block-start: 8px;
      pointer-events: auto;
    }

    En er zit geen tijdklok op. Een bezoeker die langzaam leest is na drie seconden halverwege:

    setTimeout(verbergTooltip, 3000);   /* niet doen */

    Gebruik :focus-visible naast :hover, anders krijgt een bezoeker met een toetsenbord de uitleg nooit te zien. Zet daarnaast aria-describedby op het onderdeel, zodat een schermlezer de uitleg voorleest.

    <button aria-describedby="uitleg-btw">Btw-nummer</button>
    <div id="uitleg-btw" role="tooltip">Je btw-nummer staat op je factuur.</div>

    Open dit onderwerp op een eigen pagina

  • Schermstand: zo test je het

    Zet de automatische schermdraaiing van de telefoon aan, open de site en draai het toestel om. Meer is er niet nodig.

    Waar je op let:

    • Verschijnt er een melding dat je moet draaien? Dan is dat de fout.
    • Blijft alle inhoud zichtbaar en bruikbaar?
    • Gaat het menu nog open, en past het op het scherm?
    • Werkt een formulier nog, inclusief de knop onderaan?
    • Blijf je op dezelfde plek in de pagina, of springt hij naar boven?

    Zonder telefoon kan het ook: maak het browservenster laag en breed, bijvoorbeeld 900 bij 400 pixels. In de ontwikkelaarshulpmiddelen van de browser is ook een toestel te kiezen en te draaien.

    Test niet alleen de homepage. De fout zit vaker in een videospeler, een kaart of een ingesloten formulier van een andere partij — onderdelen die iemand anders heeft gebouwd en die hun eigen aannames hebben over de schermstand.

    Succescriteria
    Wie het raakt
    Hulpmiddelen

    Open dit onderwerp op een eigen pagina

  • Klik annuleren: click en niet mousedown

    Een gewone knop met een click voldoet al aan dit criterium. De browser voert die pas uit als de bezoeker op hetzelfde onderdeel loslaat.

    // goed: wegschuiven voordat je loslaat en er gebeurt niets
    knop.addEventListener('click', verwijder);
    
    // fout: gaat af zodra de knop wordt geraakt
    knop.addEventListener('mousedown', verwijder);
    knop.addEventListener('pointerdown', verwijder);
    knop.addEventListener('touchstart', verwijder);

    De onderste drie worden meestal gebruikt omdat de knop dan sneller aanvoelt. Dat verschil is een paar honderdste seconde, en het kost de bezoeker de mogelijkheid om zich te bedenken.

    Kun je niet om het indrukken heen, geef dan een weg terug. Een melding met “Ongedaan maken” die tien seconden blijft staan is genoeg, en is voor iedereen een verbetering. Zorg wel dat die melding zelf met het toetsenbord bereikbaar is en lang genoeg blijft staan; anders verplaats je het probleem.

    Open dit onderwerp op een eigen pagina

  • Apparaatbewegingen

    Acties die in worden geactiveerd door een apparaat te kantelen of te schudden zijn niet goed toegankelijk voor sommige bezoekers. Bezoekers met een motorische beperking kunnen deze acties bijvoorbeeld onbedoeld uitvoeren. Er zijn ook bezoekers die dit niet, of niet goed, kunnen bedienen omdat het apparaat op een vaste plek is bevestigd aan bijvoorbeeld een rolstoel. Ook het maken van gebaren naar een camera die deze de bewegingen kan interpreteren valt onder bewegingsactivering.

    Laat bezoekers daarom de bewegingsactivering uitschakelen of zorg dat acties die kunnen worden geactiveerd met bewegingsactivering ook te activeren zijn met een alternatieve bediening.

    Open dit onderwerp op een eigen pagina

  • Sneltoetsen

    Op sommige websites kunnen bezoekers gebruik maken van sneltoetsen. Met sneltoetsen kunnen bezoekers gemakkelijk functies uitvoeren of navigeren naar een pagina. Dit werkt goed voor veel bezoekers die gebruik maken van het toetsenbord maar kunnen conflicteren sommige hulptechnologieën. Hierdoor kunnen sneltoetsen onbedoeld worden geactiveerd. Dit geldt bijvoorbeeld voor bezoekers die gebruik maken van software voor spraakherkenning.

    Zorg daarom dat sneltoetsen die bestaan uit één karakter kunnen worden aangepast, uitgeschakeld of alleen geactiveerd kunnen worden als het onderdeel de toetsenbordfocus heeft.

    Open dit onderwerp op een eigen pagina

  • Schermstand: de vergrendeling eruit

    De fout zit bijna altijd op één van twee plekken. De eerste is een media query die de inhoud verbergt:

    /* verbergt de site in liggende stand — nooit doen */
    @media (orientation: landscape) {
      .inhoud { display: none; }
      .draai-melding { display: block; }
    }

    Gebruik orientation gerust om de indeling aan te passen. Gebruik hem nooit om iets te verbergen.

    De tweede is het manifest of de app-instellingen:

    {
      "orientation": "portrait"
    }

    De melding weghalen is de eerste stap. De tweede is zorgen dat het er liggend ook goed uitziet. In liggende stand is het scherm laag en breed, en dat is dezelfde situatie als bij inzoomen:

    .raster {
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
    }
    
    .hero { min-block-size: 60vh; }   /* niet: height: 60vh */

    Los je dit goed op, dan is 1.4.10 Reflow Reflow meestal ook meteen in orde. Het is dezelfde oorzaak: onderdelen die hun eigen breedte of hoogte vasthouden.

    Succescriteria
    Wie het raakt
    Hulpmiddelen

    Open dit onderwerp op een eigen pagina

  • Bedekte focus: scroll-margin

    De browser schuift een onderdeel net binnen beeld zodra het de focus krijgt. Hij houdt daarbij geen rekening met een balk die eroverheen ligt, want die kent hij niet. Met scroll-margin geef je die ruimte op.

    :where(a, button, input, select, textarea, summary, [tabindex]) {
      scroll-margin-block-start: 120px;   /* de hoogte van de koptekst */
      scroll-margin-block-end: 90px;      /* wat er onderaan blijft staan */
    }

    Zet de bovenwaarde op de hoogte van de koptekst en de onderwaarde op wat er onderaan blijft staan. Verschilt die hoogte per schermbreedte, zet hem dan in een variabele.

    Dit werkt alleen als de browser moet scrollen. Staat het onderdeel al in beeld en valt er toevallig een chatknop overheen, dan gebeurt er niets. Laat zo’n knop dan wijken zodra er iets de focus heeft, en zorg dat de knop daarna nog bereikbaar blijft.

    body:has(:focus-visible) .chatknop {
      opacity: 0;
      pointer-events: none;
    }

    De eenvoudigste oplossing is een balk die niet meescrolt. Een koptekst die gewoon bovenaan de pagina staat kan per definitie niets bedekken, en kost geen onderhoud.

    Open dit onderwerp op een eigen pagina

  • Klik annuleren: wat het criterium vraagt

    Een klik bestaat uit twee momenten: het indrukken en het loslaten. Reageert een knop al op het indrukken, dan is een vergissing niet meer terug te nemen. Reageert hij op het loslaten, dan kan de bezoeker zijn vinger of muis nog wegschuiven en gebeurt er niets.

    Zorg daarom dat een knop pas reageert bij het loslaten. Kan dat niet, geef dan een manier om de actie ongedaan te maken. Dit criterium staat op niveau A.

    Dit maakt verschil voor:

    • Bezoekers met trillende handen, die zelden meteen goed raken.
    • Bezoekers die de aanwijzer met hun ogen of hun hoofd besturen.
    • Bezoekers die slecht zien en pas bij aanraking merken waar ze zitten.
    • Bezoekers die hun telefoon bedienen terwijl ze bewegen.

    Reageren op het indrukken mag wel als dat bij de handeling hoort. Een pianotoets op een scherm hoort te klinken bij aanraking. Hetzelfde geldt voor slepen en tekenen.

    Het gaat vooral om de knoppen waar een vergissing gevolgen heeft: verwijderen, versturen, betalen en opzeggen.

    Open dit onderwerp op een eigen pagina

  • Grootte van knoppen: zo meet je het

    Hiervoor is geen software nodig die je moet installeren. De browser toont de maat van elk onderdeel.

    Eén knop meten:

    • Klik met de rechtermuisknop op de knop en kies Inspecteren.
    • Beweeg de muis over het onderdeel in de code. De browser tekent het gebied op de pagina en zet de maat erbij, bijvoorbeeld 18 × 18.
    • Is een van beide getallen kleiner dan 24, meet dan de ruimte tot de knop ernaast.

    Een hele pagina in één keer: plak dit in het tabblad Console. Het zet een rode rand om elke knop en link die te klein is.

    document.querySelectorAll('a, button, input, select, summary')
      .forEach(function (el) {
        var r = el.getBoundingClientRect();
        if (r.width < 24 || r.height < 24) {
          el.style.outline = '2px solid red';
          console.log(Math.round(r.width) + '×' + Math.round(r.height), el);
        }
      });

    Het lijstje is een beginpunt en geen oordeel. Een knop van 20 bij 20 met 30 pixels ruimte eromheen voldoet gewoon, en een link in een lopende zin is uitgezonderd. Het script kent dat verschil niet.

    Doe de test ook op een smal scherm. Knoppen die op een breed scherm ruim staan, komen op een telefoon tegen elkaar aan.

    Open dit onderwerp op een eigen pagina

  • Focusvolgorde: de volgorde in je HTML

    Eén regel lost het meeste op: schrijf de HTML in de volgorde waarin de pagina gelezen moet worden, en gebruik CSS alleen om te bepalen wáár iets staat.

    Deze drie eigenschappen verplaatsen het beeld zonder de volgorde te veranderen. Het oog volgt de nieuwe plek, het toetsenbord de oude:

    .blok    { order: -1; }
    .raster  { grid-row: 1; grid-column: 2; }
    .zijbalk { position: absolute; right: 0; }

    Wil je de tekst links en het beeld rechts, zet de tekst dan eerst in de HTML. Op een smal scherm komt alles onder elkaar in die volgorde te staan, en dan klopt het daar ook.

    <div class="tweeluik">
      <div class="tekst">…</div>       <!-- eerst lezen, eerst in de code -->
      <figure class="beeld">…</figure>
    </div>
    
    .tweeluik { display: grid; grid-template-columns: 1fr 1fr; }

    Gebruik geen positieve tabindex. Een getal boven nul zet het onderdeel vooraan in de rij, vóór alles wat geen tabindex heeft. Eén zo’n onderdeel zet de hele volgorde op zijn kop. tabindex="0" en tabindex="-1" zijn wel in orde.

    Let daarnaast op twee plekken waar de volgorde met script wordt bepaald. Een venster dat opengaat hoort de focus mee te nemen en bij het sluiten terug te geven aan de knop waarop is gedrukt. Een menu dat uitklapt hoort zijn onderdelen meteen na de knop te hebben staan, niet onderaan de pagina.

    Open dit onderwerp op een eigen pagina

  • Focusvolgorde: zo test je het

    De focusvolgorde is te toetsen met het toetsenbord en het oog. Er is geen software voor nodig.

    Ga als volgt te werk:

    • Klik bovenaan de pagina, buiten een link of invoerveld.
    • Druk op Tab en volg met je ogen waar de focus heen springt.
    • Teken die route in gedachten na: loopt hij van links naar rechts en van boven naar beneden?

    Springt de focus vooruit en dan weer terug omhoog, dan is de afwijking gevonden. Begin bij formulieren: daar heeft een verkeerde volgorde de meeste gevolgen.

    Drie plekken waar het vaak misgaat:

    • Een venster dat opengaat en de focus achterlaat op de pagina erachter.
    • Een uitklapmenu waarvan de onderdelen onderaan de pagina in de code staan.
    • Een tweeluik met beeld en tekst waarvan de code omgekeerd is.

    Zoek in de bronbestanden daarnaast naar een positieve tabindex. Elke treffer is vrijwel zeker een fout:

    tabindex="1"
    tabindex="2"

    Zoek ook naar order: en flex-direction: row-reverse in het stijlbestand. Dat hoeft geen fout te zijn, maar het is wel de plek waar je moet kijken.

    Open dit onderwerp op een eigen pagina

  • Zichtbare focus: zo test je het

    De zichtbaarheid van de focus is met het toetsenbord te toetsen. Er is geen software voor nodig.

    Ga als volgt te werk:

    • Open de pagina en klik één keer bovenaan, buiten een link of invoerveld.
    • Druk op Tab, en blijf drukken tot je onderaan de pagina bent.
    • Kijk bij elke druk of zichtbaar is welk onderdeel is geselecteerd.

    Let daarbij op vier dingen:

    • Verdwijnt de focus? Er verandert niets in beeld, terwijl er wel iets is geselecteerd.
    • Springt de focus heen en weer? Dan klopt de volgorde niet met wat er staat. Dat valt onder 2.4.3.
    • Kom je ergens niet meer weg? Een venster of videospeler die je met Tab niet uit komt is een toetsenbordval.
    • Schuift de pagina mee? Staat het geselecteerde onderdeel half onder een vaste balk, dan valt dat onder 2.4.11.

    Is de focus nergens te zien, zoek dan in het stijlbestand naar deze regels:

    outline: none;
    outline: 0;

    Staan die er, en staat er geen eigen rand voor in de plaats, dan is de oorzaak gevonden.

    Open dit onderwerp op een eigen pagina

  • Tooltips: zo test je het

    Zoek eerst alles op wat verschijnt bij aanwijzen of bij focus. Dat zijn meestal vraagtekens, pictogrammen, menu’s en linkvoorbeelden.

    Ga daarna als volgt te werk:

    • Wijs het onderdeel aan tot de uitleg verschijnt.
    • Beweeg de aanwijzer langzaam naar de uitleg toe. Blijft hij staan?
    • Ga met de aanwijzer over de uitleg heen. Blijft hij nog steeds staan?
    • Druk op Escape zonder de aanwijzer te verplaatsen. Verdwijnt hij?
    • Wijs opnieuw aan en wacht tien seconden. Verdwijnt hij vanzelf?

    Doe de test daarna met het toetsenbord. Tab naar hetzelfde onderdeel: verschijnt de uitleg ook dan? Zo niet, dan mist een deel van de bezoekers hem helemaal.

    Vind je een tooltip met informatie die nergens anders staat, dan is dat meer dan een afwijking op dit criterium. Dan mist een deel van de bezoekers inhoud.

    Open dit onderwerp op een eigen pagina

  • Klik annuleren: zo test je het

    Deze test duurt tien seconden per knop en vraagt alleen een muis of een vinger.

    Ga als volgt te werk:

    • Druk een knop in en houd vast.
    • Schuif de muis of vinger van de knop af, ernaast.
    • Laat los.

    Er hoort niets te gebeuren. Gebeurt het toch, dan reageert de knop op het indrukken en is de afwijking gevonden.

    Test niet alle knoppen. Begin bij de knoppen waar een vergissing gevolgen heeft: verwijderen, versturen, betalen, opzeggen, en alles wat een venster sluit zonder op te slaan.

    In de console van Chrome is dit ook op te zoeken:

    ['mousedown', 'pointerdown', 'touchstart'].forEach(function (soort) {
      document.querySelectorAll('*').forEach(function (el) {
        if (typeof getEventListeners === 'function' && getEventListeners(el)[soort]) {
          console.warn(soort, el);
        }
      });
    });

    getEventListeners bestaat alleen in de console van Chrome. In andere browsers zoek je in de bronbestanden naar die drie woorden; dat werkt overal.

    Open dit onderwerp op een eigen pagina

  • Slepen: zo test je het

    Zoek eerst alles op wat normaal versleept wordt: schuifregelaars, herschikbare lijsten, kaarten en carrousels.

    Ga daarna als volgt te werk:

    • Bedien het onderdeel zonder ingedrukt te houden.
    • Gebruik alleen losse klikken of tikken.
    • Lukt het niet, dan is dat de afwijking.

    Doe de test daarna nog eens met alleen het toetsenbord. Dat is 2.1.1 Toetsenbord, maar het gaat vaak om dezelfde onderdelen.

    Test ook op een aanraakscherm. Onderdelen die met een muis goed werken zijn met een vinger soms alleen te vegen, en dan is er geen alternatief.

    Uitzonderingen waar je geen afwijking op hoeft te melden:

    • Een handtekening zetten. Het pad dat wordt getrokken is het resultaat.
    • Tekenen of schilderen.
    • Een handeling waarbij de precieze plek telt en die niet in stappen te doen is.

    Open dit onderwerp op een eigen pagina

  • Bedekte focus: zo test je het

    Bovenaan de pagina staat een vaste balk op zijn plek en bedekt hij niets. De fout laat zich pas zien nadat de pagina is gescrold.

    Ga als volgt te werk:

    • Scroll een halve pagina naar beneden.
    • Klik ergens in de tekst, buiten een link.
    • Druk op Tab en kijk of het geselecteerde onderdeel zichtbaar is.
    • Doe hetzelfde met Shift en Tab, dus omhoog. Daar gaat het het vaakst mis.

    Voor dit criterium mag een deel bedekt zijn. Is er nog een stuk van de knop en de focusrand te zien, dan voldoet het. Is er niets te zien, dan niet. Bij twijfel is het antwoord meestal dat het niet genoeg is: een knop waarvan twee pixels zichtbaar zijn, is niet gevonden.

    Dit script meldt elk onderdeel dat bij het krijgen van de focus wordt bedekt. Plak het in de console van de browser en tab daarna door de pagina:

    document.addEventListener('focusin', function (e) {
      var r = e.target.getBoundingClientRect();
      var boven = document.elementFromPoint(r.left + 4, r.top + 4);
      if (boven && boven !== e.target && !e.target.contains(boven)) {
        console.warn('bedekt door', boven, e.target);
      }
    });

    Elke melding is een plek om na te kijken. Het script vervangt de test niet, want het kent het verschil tussen gedeeltelijk en volledig bedekt niet.

    Open dit onderwerp op een eigen pagina

  • Grootte van knoppen: het aanwijsgebied

    Knoppen hoeven er niet groter uit te zien. Het gaat om het gebied dat op een tik reageert, en dat mag onzichtbaar zijn.

    De eenvoudigste oplossing laat het pictogram op 16 pixels staan en maakt de knop eromheen 24:

    .icoonknop {
      min-inline-size: 24px;
      min-block-size: 24px;
      display: inline-flex;
      align-items: center;
      justify-content: center;
    }

    Is er echt geen ruimte, vergroot het gebied dan met een onzichtbare laag over de knop heen. Het beeld blijft klein, het doel wordt groot:

    .icoonknop { position: relative; }
    
    .icoonknop::after {
      content: "";
      position: absolute;
      inset: -8px;          /* 8 pixels extra aan elke kant */
    }

    Let op dat twee van die vergrote gebieden elkaar niet overlappen. Dan raakt de bezoeker de verkeerde knop.

    Waar het meestal misgaat:

    • Rijen pictogrammen naast elkaar in een tabel of werkbalk.
    • Het sluitkruisje van een venster. Dat is bijna altijd te klein, terwijl het de knop is die iemand onder tijdsdruk zoekt.
    • Paginanummers onder een lijst, vaak 20 bij 20 met een paar pixels ertussen.

    Open dit onderwerp op een eigen pagina

  • Slepen: knoppen ernaast

    De oplossing is bijna altijd hetzelfde: het slepen blijft, er komt een manier met losse klikken naast.

    Bij een schuifregelaar gebruik je input type="range", die met de pijltoetsen te bedienen is. Voor de aanwijzer zet je er twee knoppen naast, met het getal erbij zodat zichtbaar is wat er verandert:

    <button type="button" aria-label="Minder">−</button>
    <input type="range" id="prijs" min="0" max="500" step="10" value="100">
    <button type="button" aria-label="Meer">+</button>
    <output for="prijs">100 euro</output>

    Bij een lijst die herschikt kan worden zet je bij elk onderdeel een knop omhoog en een knop omlaag. Dat werkt met de muis, met een aanraakscherm, met een toetsenbord en met een schermlezer:

    <li>
      Nieuwsbrief
      <button type="button" aria-label="Nieuwsbrief omhoog">↑</button>
      <button type="button" aria-label="Nieuwsbrief omlaag">↓</button>
    </li>

    Bij een carrousel horen er knoppen voor vorige en volgende te zijn naast het vegen. Bij een kaart knoppen om te verschuiven en te zoomen; de meeste kaartbibliotheken hebben die al, maar soms staan ze uit.

    Let op de maat van die knoppen. Zijn ze te klein, dan ruil je het ene probleem in voor het andere. Zie het artikel over de grootte van het aanwijsgebied.

    Open dit onderwerp op een eigen pagina

  • Alles met het toetsenbord

    Alle functies op een website moeten te bereiken en gebruiken zijn met alleen het toetsenbord. Sommige bezoekers kunnen geen muis gebruiken door bijvoorbeeld een visuele of motorische beperking. Als alle functionaliteit met het toetsenbord kan worden bediend, dan werkt deze ook met een groot aantal hulptechnologieën. Zorg daarom dat onderdelen zoals links, knoppen, navigatie, invoervelden, selectievakjes, keuzerondjes, keuzelijsten en alle andere interactieve functies de toetsenbordfocus kunnen krijgen en kunnen worden gebruikt.

    Standaard HTML-elementen voor links, knoppen en formulierelementen op de website zijn goed toegankelijk met het toetsenbord.

    De standaard toetsenbordnavigatie is als volgt:

    • Met TAB navigeert de toetsenbordfocus vooruit.
    • Met SHIFT + TAB navigeert de toetsenbordfocus achteruit.
    • Met de pijltoetsen kan worden genavigeerd in gegroepeerde menu’s of radiobuttons.

    Bezoekers die gebruik maken van het toetsenbord gebruiken de TAB-toets om door een website te navigeren. De TAB-toets verplaatst de toetsenbordfocus naar het volgende focuseerbare onderdeel.

    Succescriteria

    Open dit onderwerp op een eigen pagina

  • Focusvolgorde: wat het criterium vraagt

    Wie met het toetsenbord werkt krijgt de pagina als een rij: eerst dit, dan dat. Het overzicht dat een ziende bezoeker in één blik heeft, ontbreekt daarbij. Klopt de volgorde van de focus niet met de volgorde waarin de pagina te lezen is, dan raakt de bezoeker de draad kwijt. Zorg daarom dat de focus in een logische volgorde door de pagina loopt.

    De oorzaak is bijna altijd dezelfde. Het ontwerp vraagt het beeld rechts en de tekst links; in de code staat het beeld eerst en wordt het met CSS naar rechts geschoven. Op het scherm klopt dat, maar de focus volgt de code. De bezoeker springt dan eerst naar rechts, dan naar links en dan weer naar rechts.

    Bij een formulier heeft dat gevolgen. Gaat de focus van Postcode naar Versturen en pas daarna naar Huisnummer, dan wordt het formulier half ingevuld verstuurd.

    Dit criterium gaat over de focusvolgorde: waar Tab naartoe springt. 1.3.2 Betekenisvolle volgorde gaat over de leesvolgorde: waar de tekst over gaat. Vaak is het dezelfde fout, maar niet altijd — een pagina kan goed leesbaar zijn en toch onhandig te bedienen.

    Open dit onderwerp op een eigen pagina

  • Toetsenbordval

    Als bezoekers met het toetsenbord naar een onderdeel op de pagina kunnen navigeren, maar er niet meer vandaan kunnen, dan is dit een toetsenbordval. Om uit een toetsenbordval te raken is de enige manier vaak om de muis (of ander aanwijsapparaat) te gebruiken of om de pagina helemaal te herladen. Dit is geen optie voor bezoekers die geen gebruik kunnen maken van de muis. Dit komt soms voor als er plugins worden gebruikt.

    Zorg dat met het toetsenbord helemaal over de pagina kan worden genavigeerd.

    Open dit onderwerp op een eigen pagina

  • Bedekte focus: wat het criterium vraagt

    Een balk die vastgeplakt in beeld blijft staan kan het onderdeel bedekken waar de toetsenbordfocus net naartoe is gesprongen. De bezoeker ziet dan niet welk onderdeel is geselecteerd en weet niet wat er gebeurt bij het indrukken van Enter. Zorg daarom dat het onderdeel met de focus niet volledig bedekt wordt.

    Een deel mag bedekt zijn, als de rest maar zichtbaar blijft. Dit criterium is nieuw in WCAG 2.2 en staat op niveau AA, dus het valt onder de wettelijke eis. Er is ook een strengere versie: 2.4.12 Focus niet bedekt (uitgebreid) op niveau AAA, waarbij er niets overheen mag staan.

    De oorzaak is bijna altijd een van deze:

    • Een menubalk die vastgeplakt bovenaan blijft staan.
    • Een cookiemelding onderaan het scherm.
    • Een chatknop in de hoek.
    • Een balk met acties die verschijnt zodra de bezoeker scrolt.
    • Een tabel met een vastgezette kop of kolom.

    Het gaat het vaakst mis bij terugspringen. Gaat de bezoeker met Shift en Tab omhoog, dan zet de browser het onderdeel bovenaan het scherm — precies waar een vaste balk staat. Vooruit gaat meestal goed, achteruit niet.

    Open dit onderwerp op een eigen pagina

  • Schermstand: wat het criterium vraagt

    Een website moet werken in zowel de staande als de liggende stand. Niet iedereen kan zijn apparaat draaien: een telefoon in een houder op een rolstoel staat vast, en wie een tablet op een standaard heeft staan of met één hand werkt kan dat ook niet. Een melding als “Draai je scherm voor de beste ervaring” maakt de site voor die bezoekers onbruikbaar.

    Je mag geen stand afdwingen, tenzij het echt niet anders kan — een piano-app of het fotograferen van een cheque zijn de gebruikelijke voorbeelden.

    Wat er ook onder valt:

    • Een pagina die alleen in staande stand een menu toont.
    • Een videospeler die in liggende stand het scherm overneemt en niet meer terug wil.
    • Een app die in de manifest-instellingen op één stand is vastgezet.

    Zo’n melding is zelden een bewuste keuze. Meestal is de liggende stand niet getest, oogt de pagina daar rommelig, en is er een melding geplaatst in plaats van een oplossing.

    Succescriteria
    Wie het raakt
    Hulpmiddelen

    Open dit onderwerp op een eigen pagina

  • Zichtbare focus: wat het criterium vraagt

    Het onderdeel dat met het toetsenbord is geselecteerd heeft de focus. De browser zet daar standaard een rand omheen, zodat zichtbaar is waar de bezoeker zich bevindt. Ontbreekt die rand, dan is niet te zien welk onderdeel wordt bediend en wat er gebeurt bij het indrukken van Enter. Zorg daarom dat de toetsenbordfocus altijd zichtbaar is.

    Dit raakt vooral:

    • Bezoekers die geen muis kunnen vasthouden en alles met het toetsenbord doen.
    • Bezoekers die een schermvergroting gebruiken en maar een klein deel van het scherm zien. De focus geeft aan waar dat deel moet staan.
    • Bezoekers die met een schakelaar of met hun stem werken.

    De rand is op de meeste sites ooit bewust weggehaald, met één regel CSS: outline: none. De standaardrand is niet mooi, maar het antwoord daarop is een betere rand en niet geen rand.

    Dit criterium gaat alleen over de zichtbaarheid van de focus. Of de rand genoeg contrast heeft valt onder 1.4.11 Contrast van niet-tekstuele content, de volgorde onder 2.4.3 Focus volgorde, en of de rand achter een balk verdwijnt onder 2.4.11.

    Open dit onderwerp op een eigen pagina

  • Tooltips: wat het criterium vraagt

    Verschijnt er extra inhoud zodra een bezoeker iets aanwijst of met het toetsenbord selecteert — een tooltip, een uitklapmenu, een voorbeeldvenster — dan moet die inhoud te lezen zijn. Wie ingezoomd werkt ziet de uitleg buiten zijn deel van het scherm staan en moet er met de aanwijzer naartoe. Verdwijnt de uitleg onderweg, dan is hij onbereikbaar.

    Er gelden drie eisen:

    • Wegklikbaar. De uitleg is te sluiten met Escape, zonder de aanwijzer te verplaatsen.
    • Aanwijsbaar. De aanwijzer kan erheen zonder dat de uitleg verdwijnt.
    • Blijvend. De uitleg blijft staan tot de bezoeker wegwijst, hem sluit of de informatie niet meer klopt. Niet tot een tijdklok afloopt.

    Waar dit opduikt: tooltips bij een pictogram of vraagteken, uitklapmenu’s die opengaan bij aanwijzen, voorbeeldvensters bij een link, foutmeldingen die bij focus verschijnen, en een winkelmandje dat opengaat bij aanwijzen.

    Op een aanraakscherm bestaat aanwijzen niet. Wat alleen bij aanwijzen verschijnt, moet daar op een andere manier bereikbaar zijn — of de informatie hoort gewoon op de pagina te staan.

    Open dit onderwerp op een eigen pagina

  • Bediening met gebaren

    Sommige functionaliteit op een website is alleen te uit te voeren met een moeilijk gebaar. Bijvoorbeeld gebaren waarbij de bezoeker meerdere vingers moet gebruiken (meerpuntsgebaren) of gebaren waarbij de bezoeker een vinger (of de aanwijzer) in een bepaald pad moet bewegen (pad gebaseerde gebaren). Bezoekers kunnen, om verschillende redenen, soms niet in staat zijn om moeilijke gebaren te maken met hun vingers of met een aanwijzer. Bijvoorbeeld door een motorische beperking.

    Zorg dat functionaliteit die met gebaren wordt geactiveerd, ook met een klik, dubbelklik of klikken-en-vasthouden van een muis kan worden geactiveerd. Dit kan bijvoorbeeld met een eenvoudige bediening toe te voegen.

    Open dit onderwerp op een eigen pagina

Terug naar boven