In de praktijk falen veel implementaties op WCAG door kleine maar cruciale fouten: ontbrekende labels, onjuiste focusmanagement, foutieve ARIA-toepassingen en content die alleen visueel begrijpelijk is. Dit artikel richt zich op concrete, testbare oplossingen die developers en designers direct kunnen toepassen.
Wij vertalen WCAG-richtlijnen naar kant-en-klare code, checklists en teststappen zodat jouw site of applicatie snel voldoet. Test direct met onze WCAG checker, download onze plugin of neem contact op via het contactformulier — wij reageren binnen 24 uur: https://wcagtool.nl/checker, https://wcagtool.nl/plugin, https://wcagtool.nl/contact.
Het probleem in de praktijk
1) Ontbrekende of foutieve labels
Veel formulieren missen expliciete <label>
-elementen of gebruiken visuele placeholders als enige indicatie. Screenreaders hebben expliciete associaties nodig.
2) Focus en keyboardtoegankelijkheid
Interactie-elementen zijn niet via toetsenbord bereikbaar of focusstijlen zijn verwijderd. Dit breekt keyboard-navigatie en zichtbaarheid van focus.
3) Onjuist gebruik van ARIA
Ontwikkelaars gebruiken aria-attributes als vervanging voor semantische HTML (bijv. role=”button” zonder tabindex of gedragingen), wat verwarring veroorzaakt voor hulptechnologieën.
4) Dynamische content zonder live-regions of focus-management
Modalen, foutmeldingen en updates worden niet gecommuniceerd naar screenreaders of krijgen geen focus, waardoor gebruikers belangrijke informatie missen.
Zo los je dit op in code
Formulieren: correcte labels, errors en associaties
<form id="contact"><div><label for="name">Naam</label><input id="name" name="name" type="text" required aria-required="true" /></div><div><label for="email">E-mail</label><input id="email" name="email" type="email" required aria-required="true" /></div><div id="form-error" role="alert" aria-live="assertive" class="visually-hidden">Er zijn fouten in het formulier.</div><button type="submit">Verstuur</button></form>
Tips: gebruik altijd for
op labels, aria-required
alleen als extra semantiek en een role="alert"
of aria-live
voor foutmeldingen.
Keyboard en focus management: skip link en zichtbare focus
<a class="skip-link" href="#main">Sla navigatie over</a><!-- CSS -->.skip-link{position:absolute;left:-999px;top:auto;width:1px;height:1px;overflow:hidden}.skip-link:focus{position:static;left:0;width:auto;height:auto;background:#000;color:#fff;padding:.5rem;border-radius:3px}
<!-- Zorg voor zichtbare focus op interactie-elementen -->button, a, input{outline:3px solid #005fcc;outline-offset:2px}button:focus{box-shadow:0 0 0 3px rgba(0,95,204,.2)}
Zorg dat elk interactief element via Tab bereikbaar is (geen tabindex=”-1″ tenzij tijdelijk) en dat focus zichtbaar is in de UI.
Correcte ARIA: gebruik het als aanvulling, niet als vervanging
<!-- Gebruik semantische HTML waar mogelijk --><button id="save">Opslaan</button><!-- Als je ARIA nodig hebt --><div role="status" aria-live="polite">Wijzigingen opgeslagen</div>
Vervang geen <button> door <div role=”button”> tenzij je ook keyboard- en enter/space-gedrag implementeert en tabindex toevoegt.
Modalen en dynamische content: focus trap en terugzetten
<!-- eenvoudige focus trap (vanuit modal open functie) -->const firstFocusable = modal.querySelector('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])');const focusable = modal.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])');let lastFocusable = focusable[focusable.length-1];firstFocusable.focus();modal.addEventListener('keydown', e => {if(e.key==='Tab'){if(e.shiftKey && document.activeElement===firstFocusable){e.preventDefault();lastFocusable.focus()}else if(!e.shiftKey && document.activeElement===lastFocusable){e.preventDefault();firstFocusable.focus()}}});
Zet focus terug naar de trigger na sluiten en markeer de rest van de pagina met aria-hidden="true"
indien nodig.
Checklist voor developers
- Alle form controls hebben een gekoppeld <label> of aria-label/aria-labelledby.
- Tab-volgorde volgt visuele volgorde; vermijd onnodige tabindex-waarden.
- Interactieve elementen gebruiken semantische HTML (button, a, input) of volledige ARIA-implementatie.
- Contrast ≥ 4.5:1 voor tekst (controleer met onze WCAG checker).
- Foutmeldingen zijn bereikbaar en worden aangekondigd via role=”alert” of aria-live.
- Modalen hebben focus trap en focusterugzetting; dynamische updates gebruiken aria-live.
- Afbeeldingen hebben bruikbare alt-tekst; decoratieve afbeeldingen krijgen alt=””.
- Multimedia heeft ondertiteling en transcript waar relevant.
Tips voor designers en redacties
Designsystemen en componentbibliotheken
Implementeer toegankelijkheidsregels in je component library: voorzie components van props voor aria-attributes, focusstyles en keyboard-gedrag. Documenteer voorbeelden met code en testcases.
Contentrichtlijnen voor redacties
- Gebruik duidelijke kopstructuur (H1 → H2 → H3). Screenreaders gebruiken dit voor navigatie.
- Vermijd betekenisloze linkteksten als “klik hier”. Geef context: “Bekijk onze toegankelijkheidscheck”.
- Schrijf korte, heldere alt-teksten; complex beeldmateriaal met rol legt uit in omliggende tekst of een lange beschrijving.
Contrast en kleurgebruik
Sla alle kleurstalen op in een tokens-lijst met contrastwaarden en voorbeelden. Zorg voor voldoende contrast voor tekst en interface-elementen, niet alleen voor primaire kleuren.
Hoe test je dit?
Automatisch testen
Gebruik onze WCAG checker voor snelle automatisering: https://wcagtool.nl/checker. Integreer onze plugin in CI/CD voor regressietests: https://wcagtool.nl/plugin.
Handmatige tests — stap-voor-stap
- Keyboard-only: zet je muis weg en navigeer met Tab, Shift+Tab, Enter en Space. Volg checklist en verifieer focusvolgorde.
- Screenreader: test met NVDA (Windows) of VoiceOver (macOS/iOS). Lees formulieren en modalen voor.
- Contrast: controleer kleuren met de kleurenchecker in onze validator en test in verschillende schermgroottes.
- Dynamische updates: simuleer fouten, successen en dynamische content en controleer aria-live/role aankondigingen.
Testcases en voorbeelden
TEST 1: Formulier validatie - verwijder label van input, voer validator uit, check of role="alert" aanwezig is TEST 2: Modal - open modal, Tab tot de laatste focus, druk Tab en verifieer dat focus terugkeert naar eerste focus TEST 3: Keyboard - navigeer naar alle knoppen en links; geen element mag niet bereikbaar zijn
Loop deze tests periodiek uit. Gebruik onze checker voor snelle scans en de plugin voor CI-integratie: https://wcagtool.nl/checker, https://wcagtool.nl/plugin. Vragen? Gebruik het contactformulier — antwoord binnen 24 uur: https://wcagtool.nl/contact.
Laatste praktische tip
Implementatie-check: plak deze kleine audit-snippet in je console om snel niet-klikbare interactieve elementen te vinden:
Array.from(document.querySelectorAll('[role="button"], [role="link"], [tabindex]')).filter(el => {const tag = el.tagName.toLowerCase();return !(tag==='button' || tag==='a' || tag==='input' || tag==='select' || tag==='textarea') && !el.hasAttribute('onclick')}).slice(0,20)
Plak de output naar je tickettool, fix de elementen en test opnieuw met onze WCAG checker. Wil je hulp bij implementatie of een review? Start een scan op https://wcagtool.nl/checker, download onze plugin op https://wcagtool.nl/plugin of stuur een vraag via https://wcagtool.nl/contact — wij reageren binnen 24 uur.