Digitaal toegankelijke HTML-tabellen maken

Tabellen zijn ideaal om data in een raster te zetten. Maar in de praktijk zijn tabellen ook een van de onderdelen waar we in WCAG-audits opvallend vaak fouten in tegenkomen. Niet omdat tabellen “moeilijk” zijn, maar omdat je al snel iets visueel goed krijgt, terwijl de structuur voor hulptechnologie ontbreekt.

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.

In dit artikel

Inhoudsopgave

Waarom tabellen zo vaak fouten bevatten

Een tabel lijkt simpel: rijen, kolommen, klaar. Alleen: screenreaders lezen een tabel niet zoals jij ‘m ziet.
Gebruikers hebben context nodig bij elke cel: wat betekent deze waarde? Die context komt uit de juiste HTML-markup.

  • Visueel klopt het, semantisch niet: headers worden “vetgedrukt” met CSS in plaats van echte <th>-cellen.
  • Relaties ontbreken: bij grotere of complexere tabellen is niet duidelijk welke header bij welke data hoort.
  • Complexiteit sluipt erin: samengevoegde cellen (rowspan/colspan), meerdere headerlagen, lege hoekcellen… dat gaat snel mis.
  • Misbruik als layout: tabellen worden soms gebruikt om pagina’s “uit te lijnen” in plaats van data te tonen.

Wat gaat er het vaakst fout

  • Geen <th> gebruikt voor kopcellen (alleen <td> met styling).
  • Geen scope bij headers in tabellen met één header-rij of -kolom (vooral als data “ambiguous” is).
  • Rij-headers vergeten (bijv. de eerste kolom is eigenlijk een header, maar staat als <td>).
  • Onlogische structuur door samengevoegde cellen zonder duidelijke headerkoppeling.
  • Geen caption of uitleg bij tabellen die zonder context lastig te begrijpen zijn.
  • Informatie alleen via kleur/positie (bijv. “groen = open”) zonder tekst of duidelijke labels.

Wat is verplicht volgens WCAG 2.2

WCAG 2.2 vraagt (onder andere) dat informatie en relaties in content programmatisch bepaald kunnen worden, of in tekst beschikbaar zijn. Voor tabellen betekent dit: de relaties tussen headercellen en datacellen moeten in de HTML zitten, niet alleen in je vormgeving.

Minimale eisen voor toegankelijke datatabellen

  • Gebruik echte tabelmarkup voor echte tabellen: <table>, met <tr> voor rijen, <td> voor data en <th> voor headers.
  • Maak header-relaties expliciet:
    • Bij eenvoudige tabellen: gebruik scope="col" en/of scope="row".
    • Bij complexere tabellen (meerdere headerlagen): gebruik id op <th> en headers op <td> waar nodig.
  • Zorg voor een betekenisvolle structuur en volgorde: de leesvolgorde in de code moet logisch zijn (zoals de tabel bedoeld is).
  • Geef context waar nodig: gebruik een <caption> als “tabeltitel” en voeg een korte samenvatting toe bij complexere tabellen.

Vuistregel: als iemand de tabel met een screenreader per cel navigeert, moet steeds duidelijk zijn welke rij/kolom-header bij de huidige waarde hoort.

Codevoorbeelden

1) Tabel met 1 header-rij

Dit is een tabel met één header-rij. Door scope="col" te gebruiken is voor hulptechnologie duidelijk dat deze headers bij de kolommen horen.

WCAG 2.2 niveau AA criteria

Niveau ANiveau AATotaal
91221
14519
762
112

In de broncode ziet deze tabel er als volgt uit:


&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;Niveau A&lt;/th&gt;
&lt;th&gt;Niveau AA&lt;/th&gt;
&lt;th&gt;Totaal&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

2) Tabel met 2 headers (rij én kolom)

Hier heeft de tabel headers in de bovenste rij én in de eerste kolom. Met scope="col" en scope="row" leg je de relaties vast.

Niveau ANiveau AATotaal
Waarneembaar91221
Bedienbaar14519
Begrijpelijk762
Robuust112

In de broncode ziet dit er als volgt uit:


&lt;table&gt;
&lt;caption&gt;Verdeling van WCAG 2.2 succescriteria per principe en niveau&lt;/caption&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col"&gt;&lt;/th&gt;
&lt;th scope="col"&gt;Niveau A&lt;/th&gt;
&lt;th scope="col"&gt;Niveau AA&lt;/th&gt;
&lt;th scope="col"&gt;Totaal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th scope="row"&gt;Waarneembaar&lt;/th&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th scope="row"&gt;Bedienbaar&lt;/th&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th scope="row"&gt;Begrijpelijk&lt;/th&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th scope="row"&gt;Robuust&lt;/th&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

Digitaal toegankelijke tabellen

Wil je zeker weten dat jouw tabellen (en andere componenten) voldoen aan WCAG 2.2 niveau AA?
We brengen snel in kaart wat er misgaat, wat verplicht is en wat je het beste als eerste kunt verbeteren.

Plan een intakegesprek, dan bepalen we samen de scope en krijg je een praktische aanpak die past bij je team en leverancier.