Toegankelijk video en audio: ondertitels, transcripties en audiodescriptie

Praktische implementatie: Keyboard accessibility & focus management — WCAGTool

Keyboard accessibility & focus management: praktisch toepassen volgens WCAG

Keyboard-toegankelijkheid en focusmanagement falen in de praktijk vaak doordat ontwikkelaars visuele interacties (hover, mouse-only) als primaire toegang beschouwen, dynamische UI-componenten geen juiste focuslogica krijgen en content-editors foutieve HTML of ontbrekende labels publiceren. Resultaat: mensen die geen muis kunnen gebruiken of screenreaders gebruiken komen vast te zitten of missen cruciale informatie.

Wij lossen dit door concrete, testbare patronen en kant-en-klare code-snippets te leveren die direct bruikbaar zijn in projecten. Hieronder vind je stap-voor-stap oplossingen, kant-en-klare ARIA-implementaties, CSS voor zichtbare focus, en duidelijke testcases. Test je site direct met onze WCAG checker/validator, download onze plugin voor automatische checks en neem contact op via ons contactformulier — vragen beantwoorden we binnen 24 uur.

Het probleem in de praktijk

1) Onzichtbare focus

Veel sites verwijderen browser-focusstijlen of vertrouwen alleen op :hover voor interactieve elementen. Dat breekt keyboard-navigatie en voldoet niet aan WCAG 2.1 (keyboard toegankelijkheid) en 2.4.7 (focus zichtbaarheid).

2) Modals en overlays zonder focustrap

Modals openen correct visueel maar laten focus achter op de pagina, waardoor keyboardgebruikers buiten de modal kunnen navigeren of de modal niet kunnen sluiten.

3) Custom controls zonder ARIA of keyboard handlers

Custom dropdowns, sliders en tabs missen role/aria-* attribuut en keyboard event handling (Arrow keys, Home/End, Escape), wat leidt tot onbruikbare widgets voor screenreader- en toetsenbordgebruikers.

Zo los je dit op in code

Basisregels (direct toepasbaar)

– Gebruik semantische HTML waar mogelijk (<button>, <a>, <input>).
– Verwijder nooit volledig focusstijlen; style ze juist voor consistentie.
– Voeg keyboard-ondersteuning toe voor alle custom widgets: Tab, Shift+Tab, Enter, Space, Arrow keys, Escape.

CSS: zichtbare en consistente focusstijl

/* Gebruik geen outline: none zonder alternatief */button:focus{outline:3px solid #005fcc;outline-offset:2px;box-shadow:0 0 0 3px rgba(0,95,204,0.15);}/* Voor links */a:focus{outline:2px dashed #005fcc;outline-offset:3px;}/* Zorg dat :focus-visible op ondersteunende browsers gebruikt wordt */:focus{outline:none}*:focus-visible{outline:3px solid #005fcc;outline-offset:2px;}

HTML: correcte labels en focusable elementen

<label for="email">E-mail</label><input id="email" type="email" name="email" required aria-required="true" /><button type="submit">Verzenden</button>

JavaScript: eenvoudige focustrap voor modals

function trapFocus(modal){const focusable = modal.querySelectorAll('a[href],button,textarea,input,select,[tabindex]:not([tabindex="-1"])');const first = focusable[0];const last = focusable[focusable.length-1];const KEY_TAB=9;function handleKey(e){if(e.keyCode===KEY_TAB){if(e.shiftKey && document.activeElement===first){e.preventDefault();last.focus();}else if(!e.shiftKey && document.activeElement===last){e.preventDefault();first.focus();}}if(e.key==='Escape'){closeModal();}}modal.addEventListener('keydown',handleKey);first.focus();return ()=>modal.removeEventListener('keydown',handleKey);}/* Gebruik */const releaseTrap = trapFocus(document.getElementById('myModal'));/* bij sluiten */releaseTrap();

ARIA: roles en states voor custom widgets

/* Voor een custom accordion */<div role="button" aria-expanded="false" id="acc1-trigger" tabindex="0">Titel</div><div id="acc1-panel" role="region" aria-labelledby="acc1-trigger" hidden>Inhoud</div>/* JS: togglen */const t=document.getElementById('acc1-trigger');t.addEventListener('click',()=>{const expanded=t.getAttribute('aria-expanded')==='true';t.setAttribute('aria-expanded',!expanded);document.getElementById('acc1-panel').hidden=expanded;});t.addEventListener('keydown',(e)=>{if(e.key==='Enter'||e.key===' '){e.preventDefault();t.click();}});

Keyboard handling: voorbeeld voor custom select/dropdown

// Vereenvoudigd pattern: ArrowDown/ArrowUp/Enter/Escapefunction onKeyDown(e){switch(e.key){case 'ArrowDown':focusNextOption();e.preventDefault();break;case 'ArrowUp':focusPrevOption();e.preventDefault();break;case 'Enter':selectFocused();e.preventDefault();break;case 'Escape':closeList();break;}}

Checklist voor developers

  • Gebruik semantische elementen (button, a, input) in plaats van div/span voor interactieve controls.
  • Geen outline: none zonder goed alternatief (altijd zichtbare focus).
  • Alle interactieve elementen zijn bereikbaar met Tab en Shift+Tab.
  • Custom widgets hebben ARIA roles, aria-expanded/aria-pressed/aria-hidden waar relevant.
  • Modals en dialogs implementeren focustrap en retourneren focus naar opener bij sluiten.
  • Keyboard shortcuts en handlers werken zonder muis en hebben geen conflicten met browser/OS shortcuts.
  • Test met screenreader (NVDA/VoiceOver) + toetsenbord: flow moet logisch en voorspelbaar zijn.

Tips voor designers en redacties

Ontwerp principes

Ontwerp focusstaten als onderdeel van het design system — niet als afterthought. Maak contrasten van focusindicatoren voldoende hoog en zorg dat interactieve componenten ook visueel verschillende states (focus/hover/active/disabled) hebben.

Content-editors: labels en structuur

Zorg dat koppen hiërarchisch en semantisch zijn (<h1>…<h6>), voeg alt-tekst toe aan afbeeldingen en vul formulierlabels in. Gebruik de CMS-velden voor accessible labels en placeholders niet als enige labeling.

Design-system snippets

/* Voorbeeld component tokens */--focus-color:#005fcc;--focus-size:3px;--focus-offset:2px;

Hoe test je dit?

Handmatige keyboard-tests (onmiddellijk toepasbaar)

  1. Schakel muis uit (of leg je hand op de muis). Navigeer met Tab/Shift+Tab door de pagina. Kun je alle interactieve controls bereiken? Is focus altijd zichtbaar?
  2. Open modals en overlays. Blijf tabben — blijft de focus binnen de modal?
  3. Test custom widgets: dropdowns, tabs, sliders. Werken Arrow keys, Enter, Space en Escape zoals verwacht?
  4. Probeer formulierfouten te triggeren. Zijn foutmeldingen keyboard-/screenreader-toegankelijk en wordt de focus naar het foutveld verplaatst?

Automated en assistive tool tests

Gebruik onze WCAG checker/validator voor een eerste scan op ontbrekende labels, tabindex-problemen en ARIA-fouten. Combineer met lighthouse en axe voor dev-builds, en voer daarna NVDA (Windows) of VoiceOver (macOS) toetsenbord-sessies uit.

Concrete testcases (koppelbaar aan CI)

// Cypress voorbeeld: check focus zichtbaarcy.get('button').focus().should('have.css','outline-style','solid');

Snelle foutoplossingen (copy-paste)

1) Button als link vervangen

<a href="/download" class="btn" role="button">Download</a>/* Beter: */<button onclick="location.href='/download'">Download</button>

2) Terugzetten focus na sluiten modal

const opener=document.querySelector('[data-modal-open]');function openModal(){openerFocus=document.activeElement;open();}function closeModal(){close();openerFocus.focus();}

3) Formulier fout-focus

form.addEventListener('submit',e=>{if(!valid){e.preventDefault();const firstInvalid=form.querySelector(':invalid');firstInvalid.focus();}});

Extra test-instructies en handige commands

Test direct met onze WCAG checker/validator op wcagtool.nl/validator en installeer onze browser-plugin voor realtime feedback tijdens ontwikkeling. Voor CI: integreer onze CLI of download de plugin voor automatisering — zie wcagtool.nl/plugin voor installatie en voorbeelden.

Wil je hulp? Gebruik ons contactformulier op wcagtool.nl/contact — we beantwoorden vragen binnen 24 uur en geven concrete code-aanpassingen op maat.

Laat je website niet wachten: test hem nu direct met onze WCAG checker en download de plugin voor continue checks.

Laatste praktische tip

Voeg direct deze korte script-snippet toe om onzichtbare focus op touchdevices netjes te behandelen (geen mouse-only focus):

/* Voeg class toe op touchdevices */if('ontouchstart' in window||navigator.maxTouchPoints){document.documentElement.classList.add('is-touch');}/* CSS: alleen focus-ringen tonen bij keyboard */html.is-touch :focus{outline:none}*:focus-visible{outline:3px solid var(--focus-color);outline-offset:var(--focus-offset);}

Test je aanpassingen meteen op wcagtool.nl/validator, download onze plugin op wcagtool.nl/plugin en vraag hulp via wcagtool.nl/contact (reactie binnen 24 uur).

Previous Post Next Post

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *