Concepten

Semantische HTML

HTML-elementen gebruiken op basis van hun betekenis, niet alleen hun standaardweergave. Een `<button>` wordt aangekondigd als knop; een `<div onclick>` wordt als niets aangekondigd. De overgrote meerderheid van toegankelijkheidsfouten is terug te voeren op verlaten semantiek.

Semantische HTML is HTML waarbij elk element wordt gekozen op basis van zijn betekenis, niet alleen zijn uiterlijk. Een <button> is bedoeld voor acties. Een <nav> omhult navigatie. Een <table> bevat tabellarische gegevens. Een <div> gebruiken die eruitziet als een knop voor een actie is een semantische fout — ook al is het visuele resultaat identiek.

De overgrote meerderheid van toegankelijkheidsfouten is terug te voeren op verlaten semantiek. Bijna elk hulptechnologie-probleem heeft dezelfde oorzaak: een generiek element dat de taak uitvoert waarvoor een semantisch element is ontworpen.

Waarom schermlezers dit belangrijk vinden

Schermlezers stellen HTML aan de gebruiker voor via hun toegankelijkheidsstructuur — een interne representatie opgebouwd vanuit de DOM die elk element koppelt aan een rol, naam, toestand en eigenschappen. De toegankelijkheidsstructuur is wat de gebruiker daadwerkelijk hoort.

Een native <button> verschijnt in de toegankelijkheidsstructuur als button "Verzenden". Een <div> die eruitziet als een knop, verschijnt als generic — wat betekent dat de schermlezer niets nuttigs aankondigt en de gebruiker geen manier heeft om te ontdekken dat de div interactief is.

Dezelfde logica geldt voor:

  • Koppen (<h1><h6>) — schermlezers laten gebruikers tussen koppen springen om een pagina door te bladeren. <div class="heading"> verschijnt niet in de kopenlijst.
  • Lijsten (<ul>, <ol>, <li>) — schermlezers kondigen „lijst, 5 items“ aan voor het voorlezen. <div>s die lijstitems nadoen, niet.
  • Formulieren — <input> met een gekoppeld <label> leest „E-mail, tekstvak.“ Een aangepast invoerveld van divs en contenteditable leest niets.
  • Tabellen — <table> met <th>-rij/kolomkoppen laat gebruikers cel voor cel door datatabellen navigeren met aangekondigde koopcontext. CSS-grids van divs niet.

Het vervangingspatroon

De oplossing heeft bijna altijd dezelfde vorm:

  • <div onclick="..."><button> (of <a href> voor navigatie).
  • <span class="link"><a href>.
  • <div role="heading"><h1> t/m <h6>.
  • Aangepaste dropdowns → <select> waar het ontwerp dat toelaat, of een getest ARIA-comboboxpatroon waar dat niet het geval is.
  • Tabs opgebouwd uit gestylede <div>s → tabpatroon uit de ARIA Authoring Practices Guide.

Wanneer ARIA te gebruiken

De eerste regel van ARIA is: gebruik geen ARIA als een native element de taak kan uitvoeren. ARIA-rollen, -toestanden en -eigenschappen zijn een patch voor gevallen waarin native HTML het widget dat men bouwt niet kan beschrijven (boomstructuren, meervoudige comboboxen, bepaalde modale patronen). Ze zijn geen vervanging voor het gebruik van <button>.

Een pragmatische audit

De snelste manier om semantisch verval in een codebase te detecteren: zoek op onclick bij div en span. Elke overeenkomst is een potentiële fout. De op een na snelste: zoek op role=-attributen. ARIA is prima in beperkte contexten, maar intensief ARIA-gebruik signaleert vaak dat native elementen werden overgeslagen om stylingreden die dat eigenlijk niet vereisten.