Direct naar de inhoud

Auditeur

Je toetst of een website, app of document aan de WCAG voldoet. Hier vind je per succescriterium waar je op let, hoe je het meet en wanneer iets wel of niet slaagt.

Afbeeldingen

  • Tekstalternatief bij een afbeelding

    Afbeeldingen die informatie overdragen noemen we informatieve afbeeldingen. Informatieve afbeeldingen zijn belangrijk voor het begrijpen van een tekst of pagina. Deze afbeeldingen vertellen iets over de inhoud of maken een pagina duidelijker.

    Deze afbeeldingen moeten een tekstalternatief hebben dat nauwkeurig beschrijft of uitlegt wat er op de afbeelding te zien is. Beschrijf dit in een korte, duidelijke zin. Vermijd daarmee te algemene termen en probeer specifiek te zijn over wat de afbeelding weergeeft. Deze tekst moet beschrijvend genoeg zijn, zodat het de afbeelding kan vervangen als je die niet kunt zien.

    Een tekstalternatief voor een <​​img​>-element wordt gegeven met het alt-attribuut.

    In de code ziet dat er zo uit:

    <img src="poes.jpg" alt="Witte poes speelt met een rode bal">

    Open dit onderwerp op een eigen pagina

  • Complexe afbeeldingen

    Complexe afbeeldingen, zoals infographics, grafieken of diagrammen voegen veel informatie toe aan een tekst of pagina. Ze vertellen iets over de inhoud of maken een pagina duidelijker.

    Deze afbeeldingen moeten een tekstalternatief hebben. Omdat er vaak erg veel informatie op de afbeelding staat, is het moeilijk om alles beknopt te beschrijven in een kort tekstalternatief. In dat geval is het nuttig om daarnaast ook een meer uitgebreide beschrijving te geven in de omringende tekst. Een handige manier om de visuele informatie ook in tekst aan te bieden, is bijvoorbeeld door de informatie helemaal uit te schrijven. Als het gaat om een diagram of grafiek, gebruik dan bijvoorbeeld een datatabel.

    In de code ziet dat er zo uit:

    <img src="grafiek.jpg" alt="Verkoopcijfers zijn in 2021 met 18% gestegen">
    <div>
      <p>De groei van maandelijkse verkopen in 2021 tegen 2020 verliep als volgt:</p>
      <ul>
        <li>Januari: +22%</li>
        <li>...

    Je kunt ook een link bij de afbeelding plaatsen die verwijst naar een andere pagina met een uitgebreide beschrijving van de informatie op de afbeelding. Zet deze link direct voor of direct na de afbeelding.

    Open dit onderwerp op een eigen pagina

  • Decoratieve afbeeldingen

    Afbeeldingen die puur decoratief zijn voegen geen informatie toe. Ze maken een pagina aantrekkelijker, maar zijn niet echt nodig om een tekst of pagina te begrijpen. Mensen die gebruik maken van schermlezers, hebben eigenlijk niets aan deze plaatjes. Zorg daarom dat decoratieve afbeeldingen worden verborgen voor schermlezers.

    Decoratieve afbeeldingen kunnen het best met CSS worden geplaatst.

    In de code ziet dat er zo uit:

    <div class="line"></div>
    .line {
     background-image: url("horizontale-lijn.jpg");
    }

    Als het niet mogelijk is om een decoratieve afbeelding met CSS te plaatsen, dan moet het alt-attribuut in het <​img​>-element worden leeg gelaten. Het alt-attribuut moet wel aanwezig zijn maar het heeft dan geen tekst.

    In de code ziet dat er zo uit:

    <img src="horizontale-lijn.jpg" alt="">

    Open dit onderwerp op een eigen pagina

Bediening

  • 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

Formulieren

  • Inloggen: de wachtwoordbeheerder

    Wie een wachtwoordbeheerder gebruikt hoeft niets te onthouden en niets over te typen. Daarmee is de eis vervuld, zolang de site die beheerder niet in de weg zit.

    Zet daarom het juiste autocomplete-woord op elk veld:

    <label for="gebruiker">E-mailadres</label>
    <input id="gebruiker" name="gebruiker" type="email"
           autocomplete="username">
    
    <label for="wachtwoord">Wachtwoord</label>
    <input id="wachtwoord" name="wachtwoord" type="password"
           autocomplete="current-password">
    
    <label for="code">Code uit je sms</label>
    <input id="code" name="code" type="text" inputmode="numeric"
           autocomplete="one-time-code">

    De laatste wordt het vaakst vergeten en helpt het meest: met one-time-code biedt de telefoon de code uit de sms zelf aan boven het toetsenbord.

    Drie dingen die je niet moet doen:

    • Plakken blokkeren. Bedoeld tegen slordigheid, werkt alleen tegen wie het goed doet.
    • De code opknippen in losse vakjes. Geen wachtwoordbeheerder komt daar doorheen.
    • Het wachtwoordveld hernoemen om beheerders te misleiden.

    Is een CAPTCHA echt nodig, kies er dan een die op gedrag let in plaats van op een puzzel. Blijft er een puzzel over, zorg dan voor een echt alternatief: een telefoonnummer waar iemand opneemt of een e-mailadres dat gelezen wordt. “Probeer het opnieuw” is geen alternatief.

    Open dit onderwerp op een eigen pagina

  • Focus zet iets in gang

    Laat geen grote gebeurtenis plaatsvinden als een bezoeker een veld invoerveld invult, een selectievakje of keuzerondje aanklikt of een waarde kiest uit een keuzelijst, tenzij de bezoeker vooraf is geïnformeerd. Voor veel bezoekers kan een onverwachte gebeurtenis verwarrend zijn. Bezoekers met een visuele beperking kunnen de wijziging misschien niet zien. Bezoekers die alleen met het toetsenbord navigeren kunnen hierdoor moeite hebben met de bediening van de website. Laat de bezoeker daarom zelf op een knop klikken om de gebeurtenis in gang te zetten.

    Grote gebeurtenissen worden contextwijzigingen genoemd. Contextwijzigingen zijn bijvoorbeeld:

    • het automatisch inzenden van een formulier;
    • het openen van een venster;
    • het veranderen van de focus naar een ander onderdeel.

    Er mag ook geen contextwijziging plaatsvinden door het veranderen van de focus.

    Thema’s
    Succescriteria

    Open dit onderwerp op een eigen pagina

  • Bij input: wat het criterium vraagt

    Het bedienen van een onderdeel mag niet vanzelf de context veranderen: geen nieuwe pagina, geen ander venster en geen verplaatste focus. Tenzij vooraf is aangekondigd dat dat gebeurt. Een keuzelijst die zichzelf verstuurt verandert de pagina terwijl de bezoeker nog aan het kiezen is — wie met de pijltjestoetsen door een lijst met landen gaat, is al weg bij de tweede optie.

    De drie klassiekers:

    • Een keuzelijst die verstuurt. Van land, taal of sortering.
    • Een veld dat de focus doorzet. Vier vakjes voor een pincode, en na elk cijfer springt de focus door. Bij een typefout is er geen weg terug.
    • Een vinkje dat de pagina herlaadt, bijvoorbeeld een filter dat meteen zoekt.

    Wie kijkt, ziet dat de pagina verandert. Wie luistert, hoort een schermlezer opnieuw beginnen zonder te weten waarom. Wie langzaam bedient, raakt in de knel omdat het gebeurt vóór hij klaar is.

    Een filter dat de lijst eronder bijwerkt zonder de pagina te herladen en zonder de focus te verplaatsen is geen contextverandering. Dat is een resultaat. Meld de nieuwe stand wel met role="status".

    Open dit onderwerp op een eigen pagina

  • Inloggen: wat het criterium vraagt

    Bij het inloggen mag geen cognitieve test worden opgelegd: geen puzzel, geen code die onthouden en overgetypt moet worden, en geen vraag naar iets wat de bezoeker uit zijn hoofd moet weten. De inlog is de plek waar iedere gebruiker langs moet; wat daar misgaat maakt de rest van de dienst onbereikbaar.

    Er zijn twee uitwegen. Er mag een alternatief zijn dat de test niet vraagt, of de test mag gaan over het herkennen van objecten of van een plaatje dat de bezoeker zelf heeft aangeleverd. Dit criterium is nieuw in WCAG 2.2 en staat op niveau AA.

    Waar het misgaat:

    • Een CAPTCHA met vervormde letters. Dat is puur een test.
    • Een code uit een sms die overgetypt moet worden in een venster dat de sms bedekt.
    • Zes losse vakjes voor die code, waar geen wachtwoordbeheerder mee overweg kan.
    • Een beveiligingsvraag over een eerste huisdier of de meisjesnaam van een moeder.
    • Plakken blokkeren in het wachtwoordveld.

    Dit is de AA-versie en valt onder de wet. 3.3.9 Toegankelijke authenticatie (uitgebreid) is de AAA-versie en laat die uitwegen niet toe: daar mag ook een plaatjespuzzel niet.

    Open dit onderwerp op een eigen pagina

  • Inloggen: zo test je het

    Deze test duurt vijf minuten en gaat met een eigen account.

    Ga als volgt te werk:

    • Zet het wachtwoord in een wachtwoordbeheerder.
    • Log uit en weer in. Vult de beheerder beide velden?
    • Komt er een tweede stap? Is die code te plakken, of wordt hij aangeboden?
    • Noteer alles wat met het hoofd of de vingers moest gebeuren.

    Waar je op let:

    • Losse vakjes voor de code. Probeer te plakken — lukt het?
    • Een CAPTCHA in welke vorm dan ook.
    • Een beveiligingsvraag.
    • Een tijdslimiet die niet gehaald wordt bij langzaam typen.
    • Een venster dat de sms bedekt, zodat de code niet te lezen is.

    De controle in de code:

    document.querySelectorAll('input').forEach(function (el) {
      console.log(el.type, '·', el.autocomplete || 'GEEN AUTOCOMPLETE', '·', el.name);
    });

    Staat er bij het wachtwoordveld geen current-password en bij het codeveld geen one-time-code, dan is duidelijk waar te beginnen.

    Open dit onderwerp op een eigen pagina

  • Overbodige invoer: zo test je het

    Dit is een test met pen en papier. Er is geen software voor nodig, en juist daarom wordt hij zelden gedaan.

    Ga als volgt te werk:

    • Begin bij het begin van een proces met meerdere stappen: een bestelling, een aanvraag, een aanmelding.
    • Schrijf bij elke stap op wélke gegevens er gevraagd worden. Niet wat je invult, maar wat er gevraagd wordt.
    • Loop het lijstje na. Staat er iets twee keer op?

    Staat er iets twee keer, dan is dat een afwijking — tenzij het een wachtwoord is of iets wat echt veranderd kan zijn.

    Waar het meestal zit:

    • Factuuradres en afleveradres.
    • E-mailadres bij het aanmaken van een account en daarna nog eens bij het bestellen.
    • Een naam bovenaan een formulier en nog eens bij de ondertekening.
    • Een klantnummer dat in stap 1 wordt ingevoerd en in stap 3 opnieuw.

    Doe daarna de test die verder gaat: vul het formulier één keer verkeerd in en verstuur. Staat alles wat wél goed was ingevuld er nog? Zo niet, dan wordt niet twee keer hetzelfde gevraagd maar alles opnieuw — precies op het moment dat de bezoeker toch al iets fout deed.

    Open dit onderwerp op een eigen pagina

  • Statusberichten

    Veranderingen in de inhoud van een pagina worden aangegeven met een statusbericht. Een statusbericht voegt nieuwe informatie toe aan de pagina. Het geeft de bezoeker bijvoorbeeld informatie over de resultaten van een actie, over de voortgang van een laadtijd of een waarschuwing over eventuele fouten in een formulier. Deze informatie is belangrijk voor iedereen. Deze informatie moet dus ook beschikbaar worden gemaakt voor een bezoeker die gebruik maakt van hulptechnologieën.

    Hulptechnologie synchroniseert continu met het DOM en merkt de wijziging dus wel op, maar de bezoeker die hiervan gebruik maakt wordt er nietover geïnformeerd. Met het attribuut aria-live wordt een blok een live region. Deze informatie moeten in de code worden opgemaakt zodat ze de aandacht krijgen van hulptechnologieën op een manier die de bezoeker niet onnodig onderbreekt.

    • Bij succes of informatie over voortgang wordt dit gedaan met ARIA role="status" of aria-live="polite".
    • Bij waarschuwing wordt dit gedaan met ARIA role="alert" of aria-live="assertive".
    <div role="status">
      <p>Je instellingen zijn opgeslagen.</p>
    </div>

    Standaard zal hulptechnologie alleen de gewijzigde tekst voorlezen. Als toch het hele blok moet worden voorlezen, voeg dan aria-atomic=”true” toe.

    Een bezoeker heeft geen controle over de uitgesproken informatie. Als een bezoeker (per ongeluk) een toets aanraakt, wordt de aankondiging onderbroken en is er geen manier om de informatie opnieuw te beluisteren.

    Thema’s
    Succescriteria

    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

  • 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

  • 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

Media

  • Transcript

    Mensen die doof of slechthorend zijn kunnen niet (of niet goed) luisteren naar geluidsfragmenten. Plaats daarom een transcript bij alle geluidsfragmenten. De mensen die doof of slechthorend zijn kunnen dan het transcript lezen. Ook voor filmpjes en animaties kan een transcript een waardevolle toevoeging zijn.

    Een transcript is een uitgeschreven versie van een gesproken tekst en de belangrijke geluiden in een mediabestand. Het beschrijft wat er te zien en te horen is, wat er gezegd wordt en ook door wie het gezegd wordt. Eventuele interactieve elementen, zoals een knop of link, moeten ook worden opgenomen in een transcript.

    Aan geluidsfragmenten moet altijd een transcript worden toegevoegd. Aan bewegende beelden moet alleen een transcript worden toegevoegd als er geen audiodescriptie aanwezig is. Voor filmpjes geldt dat dit alleen verplicht is als er interactieve elementen in het filmpje aanwezig zijn.

    Open dit onderwerp op een eigen pagina

Navigatie

  • Vaste namen: wat het criterium vraagt

    Onderdelen die hetzelfde doen horen overal dezelfde naam te krijgen. Dat geldt voor de zichtbare tekst en voor het alternatief van een pictogram. Heet dezelfde knop op de ene pagina “Zoeken”, op de andere “Zoek”, en staat er elders alleen een vergrootglas zonder tekst, dan is dat voor wie kijkt één ding en voor wie luistert drie.

    Waar het vaak misgaat:

    • Een pictogram zonder tekst, met per pagina een ander alternatief: “zoeken”, “zoek”, “vergrootglas”.
    • Downloadlinks: “Download pdf”, “Pdf downloaden”, “Bekijk het rapport” — voor hetzelfde bestand.
    • De knop die een formulier verstuurt: “Versturen”, “Verzenden”, “Aanvragen”, “Ok”.
    • Een sluitkruisje dat de ene keer “Sluiten” heet en de andere keer “Annuleren”.

    Dit telt het zwaarst bij spraakbediening. Wie zijn computer met zijn stem bedient zegt “klik Zoeken”. Heet de knop op die pagina “Zoek”, dan gebeurt er niets.

    Dezelfde naam voor twee dingen die iets anders doen is de omgekeerde fout. Twee links die allebei “Lees meer” heten maar naar verschillende pagina’s gaan, botsen met 2.4.4.

    Open dit onderwerp op een eigen pagina

  • Paginatitel

    Webpagina’s moeten een titel hebben die het onderwerp of doel van de pagina beschrijft. Met een goede paginatitel kunnen gebruikers een pagina gemakkelijk terugvinden als er bijvoorbeeld meerdere tabbladen open staan.

    De paginatitel wordt ook gebruikt door mensen die een schermlezer gebruiken om snel een idee van de inhoud van de pagina te krijgen.

    Een paginatitel voor een webpagina wordt gegeven met het <​​title>-element in het <​​head>-element. In het <​​title>-element moet altijd tekst staan.

    In de code ziet dat er zo uit:

    <html lang="nl">
      <head>
        <title>WCAG.nl - Digitale toegankelijkheid voor iedereen</title>
        ...

    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

  • Vaste namen: de namen vastleggen

    Dit is geen technisch probleem. Het ontstaat doordat verschillende mensen op verschillende momenten een knop een naam geven. De oplossing is een afspraak.

    Maak een lijst met de tien tot twintig onderdelen die overal terugkomen, en spreek per stuk één naam af:

    Zoeken            (niet: Zoek, Vind, Search)
    Versturen         (niet: Verzenden, Ok, Aanvragen)
    Sluiten           (niet: Annuleren, Terug, X)
    Download pdf      (niet: Pdf downloaden, Bekijk pdf)
    Neem contact op   (niet: Contact, Mail ons)

    Een pictogram zonder tekst heeft een naam nodig die niet zichtbaar is. Gebruik overal dezelfde:

    <button aria-label="Zoeken">
      <svg aria-hidden="true">…</svg>
    </button>

    Staat er wel tekst naast het pictogram, dan is die tekst de naam. Zet het pictogram dan op aria-hidden, anders wordt de naam twee keer voorgelezen.

    Let op de vertaling van je thema. Knoppen die uit WordPress of een plugin komen — “Lees verder”, “Vorige”, “Zoeken” — hebben hun eigen vertaling, en die kan afwijken van wat er elders op de site staat. Dat is een van de vaakst gemiste oorzaken van deze fout.

    Open dit onderwerp op een eigen pagina

  • Vaste volgorde op elke pagina

    Navigatiemenu’s en onderdelen die op meerdere webpagina’s voorkomen, moeten telkens in dezelfde volgorde worden geplaatst. Zorg dat deze volgorde zowel in de vormgeving als in de code hetzelfde is.

    Een consistente navigatie- en paginastructuur maakt het voor iedereen makkelijker om te navigeren door de website en informatie op een pagina te vinden. Ook bezoekers die gebruik maken van schermlezers kunnen hierdoor sneller en efficiënter hun weg vinden.

    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

  • Consistente hulp: zo test je het

    Deze test doe je met het oog en een handvol pagina’s.

    Ga als volgt te werk:

    • Kies vijf pagina’s die niet op elkaar lijken: de homepage, een dienstenpagina, een formulier, een artikel en een bevestigingspagina.
    • Zoek op elke pagina alle vormen van hulp: telefoon, e-mail, contact, chat, veelgestelde vragen.
    • Noteer waar ze staan en in welke volgorde.
    • Leg de vijf lijstjes naast elkaar.

    Waar het meestal misgaat:

    • De bestelpagina zonder voettekst, bewust weggehaald om afleiding te voorkomen — precies waar een bezoeker vastloopt.
    • Een chatknop die alleen op sommige pagina’s staat.
    • Een telefoonnummer in de koptekst op de homepage en alleen in de voettekst op de rest.
    • Een volgorde die wisselt: op de ene pagina eerst chat en dan telefoon, op de andere andersom.

    Doe de test daarna nog eens op 200% zoom. Onderdelen die op een breed scherm naast elkaar staan komen dan onder elkaar, soms in een andere volgorde per pagina. Dat telt mee.

    Open dit onderwerp op een eigen pagina

Ontwerp

  • Vergroten: rem en em

    Zoomen werkt in elke browser, ook als maten in pixels zijn opgeschreven. De instelling voor de standaard tekstgrootte werkt echter alleen met relatieve eenheden — en dat is de instelling die bezoekers één keer aanzetten en daarna vergeten.

    /* volgt de instelling van de bezoeker niet */
    body { font-size: 16px; }
    
    /* volgt hem wel */
    body { font-size: 1rem; }
    h2   { font-size: 1.6rem; }

    Laat ook maten meegroeien met de tekst. Gebruik een minimumhoogte in plaats van een vaste hoogte, en geef de leesbreedte op in tekens:

    .knop {
      padding: 0.7em 1.4em;
      min-block-size: 2.75rem;   /* geen height */
    }
    
    p { max-inline-size: 68ch; }

    em rekent met de tekstgrootte van het onderdeel zelf, rem met die van de pagina. Voor ruimte binnen een knop is em handig, voor alles daarbuiten rem.

    Zet de zoomfunctie nooit uit. Deze regel staat nog in sjablonen van jaren geleden: <meta name="viewport" content="width=device-width, maximum-scale=1, user-scalable=no">. Haal alles achter width=device-width, initial-scale=1 weg.

    Thema’s
    Wie het raakt
    Hulpmiddelen

    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

  • Leesvolgorde: zo test je het

    Voor deze test is geen schermlezer nodig. Zet de opmaak uit en lees wat er staat.

    Plak dit in de console van de browser. Alle stijlen gaan uit en de pagina komt in de volgorde van de code te staan:

    document.querySelectorAll('style, link[rel=stylesheet]')
      .forEach(function (el) { el.disabled = true; });

    Waar je op let:

    • Lees van boven naar beneden. Klopt de volgorde met wat je gewend bent?
    • Staan koppen boven de tekst waar ze bij horen?
    • Komt bij een kaart eerst de naam en dan de prijs, of andersom?
    • Staat een bijschrift onder de juiste afbeelding?
    • Komt het menu vóór de inhoud, en de voettekst erna?

    De tweede test is het venster versmallen tot 320 pixels. Alles komt dan onder elkaar te staan, in de volgorde van de code. Springt er iets naar een onverwachte plek, dan is de fout gevonden — en meteen ook een afwijking op 1.4.10.

    Ververs de pagina om de stijlen terug te krijgen.

    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

  • Vaste volgorde op elke pagina

    Navigatiemenu’s en onderdelen die op meerdere webpagina’s voorkomen, moeten telkens in dezelfde volgorde worden geplaatst. Zorg dat deze volgorde zowel in de vormgeving als in de code hetzelfde is.

    Een consistente navigatie- en paginastructuur maakt het voor iedereen makkelijker om te navigeren door de website en informatie op een pagina te vinden. Ook bezoekers die gebruik maken van schermlezers kunnen hierdoor sneller en efficiënter hun weg vinden.

    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

  • 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

  • Reflow: vaste breedtes vervangen

    Een breedte in pixels blijft staan, hoe smal het scherm ook wordt. Een maximumbreedte krimpt mee:

    /* houdt vast, ook op 320 pixels */
    .kaart { width: 640px; }
    
    /* krimpt mee */
    .kaart { max-inline-size: 640px; }

    Laat kolommen zelf terugvallen. Met auto-fit hoef je geen enkel breekpunt te bedenken: de kolommen worden smaller tot ze niet meer passen en gaan dan onder elkaar.

    .raster {
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
      gap: 20px;
    }

    Een brede tabel of een codevoorbeeld hoeft niet af te breken. Die mogen schuiven, maar dan in hun eigen kader en niet met de hele pagina:

    .tabel-omhulsel { overflow-x: auto; }

    Let ook op vaste hoogtes. Een knop met height: 40px ziet er strak uit tot de tekst erin twee regels wordt. Gebruik min-block-size, dan groeit de knop mee in plaats van de tekst af te knippen.

    Thema’s
    Succescriteria
    Wie het raakt
    Hulpmiddelen

    Open dit onderwerp op een eigen pagina

PDF

  • Een bladwijzer maken

    Hyperlinks, ook wel bladwijzers genoemd, maken het eenvoudig om snel naar specifieke onderdelen binnen een PDF te navigeren. Dit is vooral handig in uitgebreide documenten met veel pagina’s, waar het anders lastig kan zijn om relevante informatie terug te vinden. Bladwijzers bieden een gebruiksvriendelijke manier om met één klik naar een bepaald hoofdstuk, subhoofdstuk of bijlage te springen. Hoe ga je te werk om bladwijzers toe te voegen?

    Voorbereiding van het document

    Zorg er eerst voor dat je document goed gestructureerd is voordat je bladwijzers toevoegt. Het is belangrijk dat de PDF voorzien is van toegankelijkheidstags, zodat bijvoorbeeld schermlezers het document kunnen voorlezen en de inhoud gestructureerd is. Tags zoals koppen (h1, h2, h3, enz.) helpen om de hiërarchie van het document duidelijk weer te geven.

    Het bladwijzerspaneel openen

    De meeste PDF-programma’s, zoals Adobe Acrobat, hebben aan de rechterkant van het scherm een bladwijzerspaneel. Door hierop te klikken, kun je dit paneel openen.

    Een bladwijzer toevoegen

    Navigeer naar de pagina of sectie van het document waarvoor je een bladwijzer wilt maken. Selecteer de gewenste tekst met de selectietool. Vervolgens kun je in het bladwijzerspaneel op de knop ‘Bladwijzer toevoegen’ klikken of gebruik maken van de sneltoets Ctrl + B. De nieuwe bladwijzer verschijnt dan in het paneel, met de geselecteerde tekst als naam.

    Bladwijzers een naam geven

    Je kunt de naam van een bladwijzer aanpassen door erop te dubbelklikken in het paneel. Kies een duidelijke en beschrijvende naam die de inhoud goed samenvat. Dit maakt het voor lezers gemakkelijker om de juiste bladwijzer te vinden. Voorbeelden van namen zijn: “Hoofdstuk 1 – Inleiding”, “Inhoudsopgave” of “2.1.1. Onderwerp”.

    Bladwijzers ordenen

    Om de structuur van het document verder te verbeteren, kun je bladwijzers rangschikken op verschillende niveaus. In het bladwijzerspaneel kun je bladwijzers onder elkaar slepen, bijvoorbeeld om subhoofdstukken onder een hoofdstuk te groeperen. Dit maakt het document overzichtelijker en gebruiksvriendelijker, zodat lezers de inhoud sneller kunnen doorgronden.

    Thema’s

    Open dit onderwerp op een eigen pagina

  • De taal van een PDF

    Het aanpassen van de documenttaal in een PDF is een eenvoudig proces. Dit kan gedaan worden via de documenteigenschappen. Volg deze stappen om de documenttaal in te stellen:

    1. Open het document in Adobe Acrobat PRO.
    2. Klik op Bestand > Documenteigenschappen om het documenteigenschappen-paneel te openen.
    3. Selecteer het tabblad ‘Geavanceerd’.
    4. Helemaal onderaan zie je het vakje ‘Taal’ staan. Kies uit de keuzelijst de juiste taal.
    5. Klik onderaan het documenteigenschappen-paneel op de ‘OK’-knop om de instellingen op te slaan.
    Thema’s

    Open dit onderwerp op een eigen pagina

  • De titel van een PDF

    Het aanpassen van de titel in een PDF is een eenvoudig proces. Dit kan gedaan worden via de documenteigenschappen. Volg deze stappen om de titel in te stellen:

    1. Open het document in Adobe Acrobat PRO.
    2. Klik op Bestand > Documenteigenschappen om het documenteigenschappen-paneel te openen.
    3. Selecteer het tabblad ‘Beschrijving’.
    4. Helemaal bovenaan zie je het invoerveld ‘Titel’ staan. Vul hier een beschrijvende titel in.
    5. Klik onderaan het documenteigenschappen-paneel op de ‘OK’-knop om de instellingen op te slaan.
    Thema’s
    Succescriteria

    Open dit onderwerp op een eigen pagina

Tekst

  • Vergroten: rem en em

    Zoomen werkt in elke browser, ook als maten in pixels zijn opgeschreven. De instelling voor de standaard tekstgrootte werkt echter alleen met relatieve eenheden — en dat is de instelling die bezoekers één keer aanzetten en daarna vergeten.

    /* volgt de instelling van de bezoeker niet */
    body { font-size: 16px; }
    
    /* volgt hem wel */
    body { font-size: 1rem; }
    h2   { font-size: 1.6rem; }

    Laat ook maten meegroeien met de tekst. Gebruik een minimumhoogte in plaats van een vaste hoogte, en geef de leesbreedte op in tekens:

    .knop {
      padding: 0.7em 1.4em;
      min-block-size: 2.75rem;   /* geen height */
    }
    
    p { max-inline-size: 68ch; }

    em rekent met de tekstgrootte van het onderdeel zelf, rem met die van de pagina. Voor ruimte binnen een knop is em handig, voor alles daarbuiten rem.

    Zet de zoomfunctie nooit uit. Deze regel staat nog in sjablonen van jaren geleden: <meta name="viewport" content="width=device-width, maximum-scale=1, user-scalable=no">. Haal alles achter width=device-width, initial-scale=1 weg.

    Thema’s
    Wie het raakt
    Hulpmiddelen

    Open dit onderwerp op een eigen pagina

  • Taal van een woord of zin

    Voorleessoftware kan tekst omzetten in spraak. Als de taal niet, of op een verkeerde manier, is aangegeven in de code, dan kan de voorleessoftware de tekst niet duidelijk voorlezen.

    Als een zin of paragraaf in de content in een andere taal dan de standaard taal is geschreven, dan moet dit worden aangegeven in de code. Zo kan software de taal van de webpagina bepalen. Deze verplichting geldt alleen voor zinnen en paragrafen, dus niet voor losse woorden.

    Een taalwissel voor onderdelen van een webpagina wordt ingesteld met het lang-attribuut in het element die een andere taal heeft dan de hoofdtaal van de website. Het lang-attribuut kan worden gebruikt op blok-elementen (<​​div​>, <​​p​>, <​​table​>, enz.) maar ook op inline-elementen (<​​span​>, <​​a​>, <​​strong​>, enz.).

    In de code ziet dat er zo uit:

    <p lang="en">The quick brown fox jumps over the lazy dog.</p>
    
    <p lang="en">In Dutch we say <span lang="nl">Pa's wijze lynx bezag vroom het fikse aquaduct</span>.</p>

    Elke taal heeft zijn eigen code. Voor Nederlands is dat ‘nl‘ (lang="nl"), voor Engels ‘en‘ (lang="en"), en voor Duits ‘de‘ (lang="de").

    Er geldt een uitzondering voor eigennamen, technische termen, woorden van een onbepaalde taal, en woorden of uitdrukkingen die deel zijn gaan uitmaken van de volkstaal van de omringende tekst.

    Open dit onderwerp op een eigen pagina

  • Taal van de pagina

    Voorleessoftware kan tekst omzetten in spraak. Als de taal niet, of op een verkeerde manier, is aangegeven in de code, dan kan de voorleessoftware de tekst niet duidelijk voorlezen.

    Stel de standaardtaal van een website in. Dit helpt software om de taal van de content te bepalen.

    De taal van een website wordt ingesteld met het lang-attribuut in het <​​html​>-element.

    In de code ziet dat er zo uit:

    <html lang="nl">
    ...
    </html>

    Elke taal heeft zijn eigen code. Voor Nederlands is dat ‘nl‘ (lang="nl"), voor Engels ‘en‘ (lang="en"), en voor Duits ‘de‘ (lang="de").

    Open dit onderwerp op een eigen pagina

  • Vaste namen: wat het criterium vraagt

    Onderdelen die hetzelfde doen horen overal dezelfde naam te krijgen. Dat geldt voor de zichtbare tekst en voor het alternatief van een pictogram. Heet dezelfde knop op de ene pagina “Zoeken”, op de andere “Zoek”, en staat er elders alleen een vergrootglas zonder tekst, dan is dat voor wie kijkt één ding en voor wie luistert drie.

    Waar het vaak misgaat:

    • Een pictogram zonder tekst, met per pagina een ander alternatief: “zoeken”, “zoek”, “vergrootglas”.
    • Downloadlinks: “Download pdf”, “Pdf downloaden”, “Bekijk het rapport” — voor hetzelfde bestand.
    • De knop die een formulier verstuurt: “Versturen”, “Verzenden”, “Aanvragen”, “Ok”.
    • Een sluitkruisje dat de ene keer “Sluiten” heet en de andere keer “Annuleren”.

    Dit telt het zwaarst bij spraakbediening. Wie zijn computer met zijn stem bedient zegt “klik Zoeken”. Heet de knop op die pagina “Zoek”, dan gebeurt er niets.

    Dezelfde naam voor twee dingen die iets anders doen is de omgekeerde fout. Twee links die allebei “Lees meer” heten maar naar verschillende pagina’s gaan, botsen met 2.4.4.

    Open dit onderwerp op een eigen pagina

  • Paginatitel

    Webpagina’s moeten een titel hebben die het onderwerp of doel van de pagina beschrijft. Met een goede paginatitel kunnen gebruikers een pagina gemakkelijk terugvinden als er bijvoorbeeld meerdere tabbladen open staan.

    De paginatitel wordt ook gebruikt door mensen die een schermlezer gebruiken om snel een idee van de inhoud van de pagina te krijgen.

    Een paginatitel voor een webpagina wordt gegeven met het <​​title>-element in het <​​head>-element. In het <​​title>-element moet altijd tekst staan.

    In de code ziet dat er zo uit:

    <html lang="nl">
      <head>
        <title>WCAG.nl - Digitale toegankelijkheid voor iedereen</title>
        ...

    Open dit onderwerp op een eigen pagina

  • Leesvolgorde: zo test je het

    Voor deze test is geen schermlezer nodig. Zet de opmaak uit en lees wat er staat.

    Plak dit in de console van de browser. Alle stijlen gaan uit en de pagina komt in de volgorde van de code te staan:

    document.querySelectorAll('style, link[rel=stylesheet]')
      .forEach(function (el) { el.disabled = true; });

    Waar je op let:

    • Lees van boven naar beneden. Klopt de volgorde met wat je gewend bent?
    • Staan koppen boven de tekst waar ze bij horen?
    • Komt bij een kaart eerst de naam en dan de prijs, of andersom?
    • Staat een bijschrift onder de juiste afbeelding?
    • Komt het menu vóór de inhoud, en de voettekst erna?

    De tweede test is het venster versmallen tot 320 pixels. Alles komt dan onder elkaar te staan, in de volgorde van de code. Springt er iets naar een onverwachte plek, dan is de fout gevonden — en meteen ook een afwijking op 1.4.10.

    Ververs de pagina om de stijlen terug te krijgen.

    Open dit onderwerp op een eigen pagina

  • Vaste namen: de namen vastleggen

    Dit is geen technisch probleem. Het ontstaat doordat verschillende mensen op verschillende momenten een knop een naam geven. De oplossing is een afspraak.

    Maak een lijst met de tien tot twintig onderdelen die overal terugkomen, en spreek per stuk één naam af:

    Zoeken            (niet: Zoek, Vind, Search)
    Versturen         (niet: Verzenden, Ok, Aanvragen)
    Sluiten           (niet: Annuleren, Terug, X)
    Download pdf      (niet: Pdf downloaden, Bekijk pdf)
    Neem contact op   (niet: Contact, Mail ons)

    Een pictogram zonder tekst heeft een naam nodig die niet zichtbaar is. Gebruik overal dezelfde:

    <button aria-label="Zoeken">
      <svg aria-hidden="true">…</svg>
    </button>

    Staat er wel tekst naast het pictogram, dan is die tekst de naam. Zet het pictogram dan op aria-hidden, anders wordt de naam twee keer voorgelezen.

    Let op de vertaling van je thema. Knoppen die uit WordPress of een plugin komen — “Lees verder”, “Vorige”, “Zoeken” — hebben hun eigen vertaling, en die kan afwijken van wat er elders op de site staat. Dat is een van de vaakst gemiste oorzaken van deze fout.

    Open dit onderwerp op een eigen pagina

Terug naar boven