Tabindex uitgelegd

Het tabindex-attribuut bepaalt of een element focus kan krijgen via het toetsenbord en in welke volgorde dat gebeurt. Standaard lopen browsers focusbare elementen (zoals links, knoppen en invoervelden) af in de volgorde waarin ze in de HTML-code staan. Met tabindex kun je deze natuurlijke volgorde aanpassen of elementen focusbaar maken die dat normaal niet zijn.

Toetsenbordnavigatie is cruciaal voor toegankelijkheid: mensen met een motorische beperking en blinde gebruikers werken vaak zonder muis. Daarom moet alle functionaliteit via het toetsenbord bereikbaar zijn en moet de focusvolgorde logisch blijven en aansluiten bij de betekenis van de content.

Auteur

Vincent van Brakel

Als onderzoeker digitale toegankelijkheid voert Vincent ruim 8 jaar audits uit voor websites en apps. De focus ligt hierbij niet alleen op de criteria, maar vooral op de drempels voor de doelgroep en hoe we deze samen kunnen oplossen.

Hoe werkt tabindex

Wanneer iemand de Tab-toets indrukt, springt de focus naar het volgende focusbare element. De browser bepaalt welk element dat is op basis van drie dingen:

  • De tabindex-waarde van elementen (als die er is).
  • De positie in de HTML-code (de DOM-volgorde).
  • Of een element van nature focusbaar is (links met href, invoervelden, knoppen).

Je kunt op elk moment maar één element tegelijk focussen. Met Shift+Tab ga je terug naar het vorige element.

Volgens WCAG 2.1.1 (Toetsenbord) moet alle functionaliteit bedienbaar zijn via het toetsenbord en WCAG 2.4.3 (Focus volgorde) vereist dat de focus in een volgorde loopt die de betekenis en bediening van de pagina behoudt.

Welke waarden kun je gebruiken

tabindex=”-1″ (negatief getal)

Het element is niet bereikbaar met Tab, maar je kunt er wel programmatisch focus naartoe verplaatsen met JavaScript.

Wanneer gebruik je dit:

  • Foutmeldingen die na het verzenden van een formulier verschijnen en meteen focus moeten krijgen.
  • Modals of dialoogvensters die openen en waar de gebruiker direct in moet kunnen typen.
  • Elementen die tijdelijk verborgen zijn maar straks wel focus nodig hebben.
<div id="foutmelding" tabindex="-1" role="alert">
  <h2>Let op: je invoer bevat fouten</h2>
  <p>Controleer je e-mailadres en probeer opnieuw.</p>
</div>

<script>
  // Na validatie focus verplaatsen naar de melding
  document.getElementById('foutmelding').focus();
</script>

Voordeel: de foutmelding staat niet standaard in de Tab-volgorde (wat extra tabstops zou opleveren), maar krijgt wel aandacht op het juiste moment.

tabindex=”0″ (nul)

Het element doet mee in de normale tabvolgorde volgens zijn positie in de HTML-code.

Wanneer gebruik je dit:

  • Je maakt een custom component (zoals een klikbare kaart of accordeon-header) die focusbaar moet zijn.
  • Een element heeft geen standaard toetsenbordondersteuning maar moet wel bereikbaar zijn.
<div class="kaart" tabindex="0" role="button" onclick="openDetail()">
  <h3>Toegankelijkheidsscan</h3>
  <p>Ontdek knelpunten in je website</p>
</div>

Let op: gebruik bij voorkeur een echt <button>-element in plaats van een <div> met tabindex="0". Een button heeft automatisch toetsenbordondersteuning (Enter en Spatie activeren hem) en wordt door schermlezers herkend als bedieningselement.

tabindex=”1″ of hoger (positief getal)

Het element krijgt een expliciete positie in de focusvolgorde, vóór alle elementen met tabindex="0" of zonder tabindex.

Advies: gebruik dit niet. Positieve waarden maken de focusvolgorde onvoorspelbaar en moeilijk te onderhouden. Gebruikers verwachten dat de Tab-toets hen door de pagina leidt in de volgorde waarin content visueel staat.

<label for="naam">Naam:</label>
<input type="text" id="naam" tabindex="3">

<label for="email">E-mail:</label>
<input type="email" id="email" tabindex="1">

<button type="submit" tabindex="2">Versturen</button>

De gebruiker ziet visueel: Naam → E-mail → Versturen. Maar bij tabben gebeurt: E-mail (1) → Versturen (2) → Naam (3). Dit is verwarrend en niet logisch.

Wanneer gebruik je tabindex

tabindex=”0″ voor custom widgets

Als je een interactief element maakt dat geen standaard HTML-knop of link is, maak je het focusbaar met tabindex="0":

<div class="accordion-header" tabindex="0" role="button" aria-expanded="false">
  Wat is WCAG 2.2?
</div>

Vergeet niet om ook toetsenbordondersteuning toe te voegen (bijvoorbeeld Enter en Spatie om de accordion te openen).

tabindex=”-1″ voor focusmanagement

Bij dynamische content zoals modals, meldingen of lazy-loaded secties wil je soms direct de focus verplaatsen:

<div id="modal" tabindex="-1" role="dialog" aria-labelledby="modal-titel">
  <h2 id="modal-titel">Weet je het zeker?</h2>
  <button>Ja, verwijderen</button>
  <button>Annuleren</button>
</div>

<script>
  function openModal() {
    document.getElementById('modal').style.display = 'block';
    document.getElementById('modal').focus();
  }
</script>

Dit patroon zorgt ervoor dat schermlezers en toetsenbordgebruikers meteen weten dat er een modal is geopend.

Roving tabindex voor complexe componenten

Bij menu’s, tabbladen of galerijen kun je het “roving tabindex”-patroon gebruiken:

  • Eén element in de groep heeft tabindex="0" (het actieve item).
  • Alle andere elementen hebben tabindex="-1".
  • Met pijltjestoetsen beweeg je binnen de groep; met Tab verlaat je de hele groep.

Dit voorkomt dat gebruikers door veel menu-items moeten tabben om bij de volgende sectie te komen.

Veelgemaakte fouten en hoe je ze voorkomt

Fout 1: Positieve tabindex gebruiken

Probleem: Je probeert de focusvolgorde handmatig te sturen met tabindex="1", "2", "3" enzovoort.

Gevolg: De volgorde komt niet overeen met de visuele layout. Gebruikers raken gedesoriënteerd.

Oplossing: Pas de HTML-volgorde aan in plaats van tabindex te gebruiken. Als de visuele volgorde niet klopt, gebruik dan CSS Grid of Flexbox om de layout aan te passen zonder de broncode-structuur te breken.

Fout 2: Belangrijke elementen niet focusbaar maken

Probleem: Je maakt een klikbare kaart of custom button, maar vergeet tabindex="0" toe te voegen.

Gevolg: Toetsenbordgebruikers kunnen het element niet bereiken.

Oplossing: Test je pagina door alleen met Tab en Enter te navigeren. Als je ergens niet komt waar je wel kunt klikken, voeg dan tabindex="0" toe (of beter: gebruik een semantisch element zoals <button>).

Fout 3: Te veel focuspunten creëren

Probleem: Je maakt containers focusbaar terwijl de knoppen erin al focusbaar zijn.

<!-- Fout: zowel de container als de knop zijn focusbaar -->
<div class="actiekaart" tabindex="0">
  <h3>Gratis scan</h3>
  <button>Start nu</button>
</div>

Gevolg: Gebruikers moeten twee keer tabben: eerst naar de <div>, dan naar de <button>. Dit is onnodig en verwarrend.

Oplossing: Maak alleen het element focusbaar dat daadwerkelijk een actie uitvoert (in dit geval de button). Of maak de hele kaart klikbaar met één focusbaar element.

Fout 4: Focus op onzichtbare elementen

Probleem: Een menu of modal is met CSS verborgen, maar de elementen erin hebben nog steeds tabindex="0".

Gevolg: Toetsenbordgebruikers tabben naar onzichtbare knoppen en raken de focus kwijt.

Oplossing: Voeg tabindex="-1" toe aan verborgen elementen, of gebruik display: none of visibility: hidden om ze ook uit de tabvolgorde te halen.

Fout 5: Focusindicator verbergen

Probleem: Je gebruikt outline: none in CSS om de focusring te verbergen, zonder een alternatief te bieden.

Gevolg: Ziende toetsenbordgebruikers zien niet waar ze zijn.

Oplossing: Geef altijd een duidelijke focusindicator, bijvoorbeeld met een outline of een opvallende rand.

button:focus {
  outline: 3px solid #0066cc;
  outline-offset: 2px;
}

Hoe test je tabindex

Handmatige toetsenbordtest

  1. Klik in de adresbalk van je browser en druk op Tab.
  2. Doorloop alle focusbare elementen met Tab (vooruit) en Shift+Tab (terug).
  3. Controleer of de volgorde logisch is en overeenkomt met de visuele layout.
  4. Controleer of je alle knoppen, links en invoervelden kunt bereiken.
  5. Kijk of de focus altijd zichtbaar is (een ring, border of andere indicator).

Screenreadertest

Test met een screenreader (zoals NVDA of VoiceOver) of de focusvolgorde ook via spraak begrijpelijk blijft. Screenreaders kunnen lineair door content navigeren én met Tab tussen focusbare elementen springen. De ervaring moet in beide gevallen logisch zijn.