Toegankelijke documenten in Word, PowerPoint en Excel
- Johan
- 0
- Posted on
Veel implementaties falen niet door onwil maar door gebrek aan concrete patronen: misplaatste ARIA, ontbrekende focusmanagment, onvolledige foutmeldingen en visuele-only hints. Developers en designers worstelen met hoe je WCAG-eisen omzet in herbruikbare, testbare componenten.
Wij geven direct toepasbare stappen, kant-en-klare code en testinstructies die werken in real-world projecten. Test je site meteen met onze WCAG checker of installeer de plugin; vragen via het contactformulier beantwoorden we binnen 24 uur.
Het probleem in de praktijk
Veelvoorkomende fouten
- Visuele labels of instructies die niet in code bestaan (placeholder-only, geen
<label>). - Focus verdwijnt: modals en overlays zonder focus trap of terugzetten van focus.
- ARIA verkeerd gebruikt (toonbare content zonder toggling van aria-hidden, role mismatch).
- Kleurcontrast getest op macrolagen maar niet op actieve states en foutmeldingen.
Waarom dat gevaarlijk is
- Keyboard-only gebruikers kunnen niet navigeren of fouten herstellen.
- Screenreader-gebruikers missen context of foutboodschappen.
- Designers en redacties leveren content die niet gereed is voor publicatie zonder technische fixes.
Zo los je dit op in code
Formulieren: labels, fouten en aria-describedby
Stappen:
- Zorg dat elk invoerveld een
<label for="id">heeft. - Gebruik
aria-describedbyvoor fout- en hulpteksten. - Voeg client- en server-side validatie met focus op foutpositie.
<label for="email">E-mailadres</label>
<input id="email" name="email" type="email" aria-describedby="email-help email-error" required>
<div id="email-help">We sturen een bevestiging naar dit adres.</div>
<div id="email-error" role="alert" aria-live="assertive" class="error" hidden>Vul een geldig e-mailadres in.</div>
Modal: focus trap en terugzetten
Stappen:
- Open modal: zet focus op eerste focusbaar element.
- Trap focus binnen modal (Tab en Shift+Tab).
- Sluit modal: zet focus terug naar trigger.
// minimale focus trap
const openBtn = document.getElementById('openModal');
const modal = document.getElementById('modal');
const closeBtn = document.getElementById('closeModal');
openBtn.addEventListener('click', ()=>{modal.hidden=false;const focusables=modal.querySelectorAll('a,button,input,select,textarea,[tabindex]:not([tabindex="-1"])');focusables[0].focus();});
closeBtn.addEventListener('click', ()=>{modal.hidden=true;openBtn.focus();});
modal.addEventListener('keydown', (e)=>{if(e.key==='Tab'){const focusables=Array.from(modal.querySelectorAll('a,button,input,select,textarea,[tabindex]:not([tabindex="-1"])'));const first=focusables[0], last=focusables[focusables.length-1]; if(e.shiftKey && document.activeElement===first){e.preventDefault(); last.focus();} else if(!e.shiftKey && document.activeElement===last){e.preventDefault(); first.focus();}}});
Toegankelijke accordions (HTML + ARIA)
<h3><button aria-expanded="false" aria-controls="panel-1" id="acc-1">Section</button></h3>
<div id="panel-1" role="region" aria-labelledby="acc-1" hidden>Content</div>
<script>document.querySelectorAll('button[aria-expanded]').forEach(btn=>{btn.addEventListener('click', ()=>{const expanded=btn.getAttribute('aria-expanded')==='true';btn.setAttribute('aria-expanded', String(!expanded));document.getElementById(btn.getAttribute('aria-controls')).hidden=expanded;});});</script>
Visueel onderscheid en focus styles (CSS)
/* consistente focus */
:focus{outline:3px solid #ffbf47; outline-offset:2px;}
/* vermijd kleur-alleen indicatie */
.error{border-left:4px solid #c00; padding:8px;}
.error .sr-only{position:absolute;left:-9999px;}
Beeld en alt-teksten
Praktische regels:
- Functioneel beeld: beschrijf wat het doet in een korte, contextuele alt.
- Decoratief beeld:
alt=""enrole="presentation"ofaria-hidden="true". - Complexe diagrammen: geef een korte alt en link naar uitgebreide beschrijving.
<img src="/logo.svg" alt="Bedrijfsnaam logo">
<img src="/decoratie.svg" alt="" aria-hidden="true">
Checklist voor developers
Direct toepasbare checklist
- Semantische HTML: gebruik <button> voor clickables, <nav> voor navigatie, headings in volgorde.
- Formulieren: label, aria-describedby, role=alert voor foutmeldingen en focus naar fout.
- Keyboard: alle interactieve elementen bereikbaar met Tab; intersectoren met Enter/Space.
- ARIA: alleen waar nodig; controleer role, aria-expanded, aria-controls consistentie.
- Kleurcontrast: alle teksten en UI-states >= WCAG ratio (4.5:1 normale tekst, 3:1 groot).
- Live updates: use aria-live of role=log/alert voor dynamische content.
Automatiseer checks
Gebruik axe-core in CI en lokale development:
npm install axe-core
// in browser console of test runner
const {axe} = require('axe-core');
axe.run(document, {}, (err, results)=>{console.log(results);});
Tips voor designers en redacties
Design tokens en kleurcontrasten
Werk met design tokens voor kleuren en test contrast in component states (hover, focus, disabled, error). Voorbeeld kleurvariabelen en CSS-check:
:root{
--primary:#0066cc;
--primary-focus:#005bb5;
--text:#222;
}
.button{background:var(--primary); color:#fff;}
.button:focus{background:var(--primary-focus); outline:3px solid #ffbf47;}
/* test script voor contrast in browser console */
function contrast(hex1, hex2){/* voeg contrast-ratio functie toe of gebruik library */}
Contentrichtlijnen
- Titels en linkteksten: kort, uniek en beschrijvend (geen “klik hier”).
- Structuur: gebruik h1-h6 hiërarchie, geen visuele styling alleen.
- Media: lever transcripties en ondertitels, en tekstalternatieven voor complexe visuals.
Hoe test je dit?
Handmatige toetsen (stap-voor-stap)
- Keyboard-only: schakel muis uit en navigeer volledige pagina, test alle interactieve controls.
- Screenreader: test met NVDA of VoiceOver op kritieke pagina’s (formulieren, modals, navigatie).
- Contrast: controleer alle tekststaten (normale, hover, focus, disabled, error) met een contrast tool.
- Form validation: trigger fouten en controleer of role=alert / aria-describedby werkt en focus naar fout gaat.
Automated tests en CI
Integreer deze checks:
- Axe-core in unit/ end-to-end tests (Cypress, Playwright).
- Lighthouse accessibility audits in build pipeline.
- Onze WCAG checker/validator voor snelle scans: bezoek https://wcagtool.nl om je site direct te scannen en fouten te prioriteren.
// voorbeeld: axe + jest
const {axe, toHaveNoViolations} = require('jest-axe');
expect.extend(toHaveNoViolations);
test('page should have no accessibility violations', async ()=>{const results = await axe(document.body); expect(results).toHaveNoViolations();});
Integratie met onze tools
Gebruik onze WCAG checker voor snelle scans en download de plugin voor browser-integratie. Loop daarna de punten in deze checklist af en los de hoogst scorende issues eerst op. Vragen? Gebruik ons contactformulier — we antwoorden binnen 24 uur.
Laatste praktische tip, direct toepasbaar
Snelle focus-fix voor SPA navigatie (code)
Probleem: bij routewissels in single-page apps blijft focus op body en screenreaders missen context. Oplossing: zet focus op paginatitel of een skip-to-content element en roep role=alert of aria-live aan.
// voorbeeld voor react-router
import {useEffect} from 'react';
export default function Page({title, children}){useEffect(()=>{document.title=title;const el=document.getElementById('main-title'); if(el){el.setAttribute('tabindex','-1'); el.focus(); el.removeAttribute('tabindex');}},[title]); return (<><h1 id="main-title">{title}</h1>{children}</>);}
Test direct: scan je site met onze WCAG checker, installeer de plugin en stuur ons vragen via het contactformulier — gegarandeerd antwoord binnen 24 uur.