Succescriterium 1.3.1 Info en relaties
Informatie, structuur en relaties overgebracht door presentatie kunnen door software bepaald worden of zijn beschikbaar in tekst.
Info en relaties begrijpen (Engelstalig)
Als je een website maakt, is het belangrijk dat de indeling en opmaak niet alleen voor mensen, maar ook voor computers begrijpelijk zijn. Dus wat je met vormgeving laat zien, moet ook in de code van je website duidelijk zijn. Denk hierbij bijvoorbeeld aan koppen, lijsten, tabellen en andere elementen die betekenis overbrengen.
Schermlezers zijn namelijk afhankelijk van de onderliggende code. Door betekenisvolle (semantische) code te gebruiken, leg je de informatie, structuur en relaties van elementen vast. Mensen die een schermlezer gebruiken kunnen hierdoor gemakkelijk door een pagina navigeren, bijvoorbeeld door van kop naar kop te springen.
Hoe pas je dit toe?
Zorg dat informatie, structuur en relaties in de content niet alleen in de vormgeving maar ook in de code is vastgelegd (of beschikbaar is in tekst).
Lees het artikel over info en relaties en semantische HTML
Koppen
- Zorg dat koppen worden opgemaakt met het HTML-element
<h[x]>(<h1>tot en met<h6>).
Lijsten
- Zorg dat ongeordende lijsten worden opgemaakt met het HTML-element
<ul>. - Zorg dat genummerde lijsten worden opgemaakt met het HTML-element
<ol>. - Zorg dat definitielijsten worden opgemaakt met het HTML-element
<dl>.
Tabellen
- Zorg dat tabellen worden opgemaakt met het HTML-element
<table>. - Zorg dat alle cellen met gegevens in een datatabel worden opgemaakt met het HTML-element
<td>. - Zorg dat cellen die een tabelkop zijn in een datatabel worden opgemaakt met het HTML-element
<th>. - Zorg dat alle cellen met gegevens in de code zijn gekoppeld aan de bijbehorende tabelkoppen.
Formulieren
- Zorg dat zichtbare labels in de code zijn gekoppeld aan de bijbehorende formulierelementen.
- Zorg dat groepen met gerelateerde formulierelementen worden gegroepeerd met het HTML-element
<fieldset>en een<legend>.
Overige semantiek
- Zorg dat citaten in een tekst worden opgemaakt met het HTML-element
<q>. - Zorg dat citaten worden opgemaakt met het HTML-element
<blockquote>. - Zorg dat codeblokken worden opgemaakt met het HTML-element
<pre>. - Zorg dat codes in een tekst worden opgemaakt met het HTML-element
<code>.
Voor wie is dit belangrijk?
- Mensen die een schermlezer gebruiken.
- Mensen die blind of slechtziend zijn.
Wie is verantwoordelijk?
- Redacteur
- Ontwikkelaar
Hoe toets je dit?
Benodigdheden
- Schermlezer (bijvoorbeeld NVDA of VoiceOver)
- headingsMap browser-extensie
- Stylus browser-extensie
- In combinatie met mijn CSS-stijlen:
Testprocedure
Test 1: Koppen
- Inventariseer de pagina
- Bepaal welke teksten er uit zien als een kop:
- Grotere tekst
- Vetgedrukte tekst
- Tekst in een andere kleur
- Tekst met extra witruimte er omheen
- Bepaal voor elke visuele kop:
- Of het content introduceert of structureert
- Bepaal welke teksten er uit zien als een kop:
- Zoek in de code naar kop-elementen en controleer:
- Of visuele koppen zijn opgemaakt met
<h1>tot en met<h6> - Of visuele koppen zijn opgemaakt met
role="heading"enaria-level-attribuut - Of de waarde van het
aria-level-attribuut een getal is van 1 tot en met 6 - Of de volgorde van koppen de betekenis van de pagina niet in de weg staat
- Of visuele koppen zijn opgemaakt met
- Zoek in de code naar misbruik van kop-elementen en controleer:
- Of
<h1>tot en met<h6>niet alleen voor styling worden gebruikt - Of kop-elementen niet alleen worden gebruikt om de lettergrootte te wijzigen
- Of
Test 2: Lijsten
- Inventariseer de pagina
- Bepaal welke content er uit ziet als een lijst:
- Items met opsommingstekens, nummers of letters
- Items horizontaal naast elkaar
- Groepen van meer dan 2 gerelateerde items onder of naast elkaar
- Bepaal voor elke visuele lijst:
- Of de items verbonden zijn en logisch bij elkaar horen
- Of de items tekstuele nummering bevatten (1., 2., 3.)
- Bepaal welke content er uit ziet als een lijst:
- Zoek in de code naar lijsten en controleer:
- Of visuele lijsten zijn opgemaakt met
<ul>en<li>(ongeordende lijsten) - Of visuele lijsten zijn opgemaakt met
<ol>en<li>(geordende lijsten) - Of visuele lijsten zijn opgemaakt met
<dl>,<dt>en<dd>(definitielijsten) - Of visuele lijsten zijn opgemaakt met
role="list"enrole="listitem"
- Of visuele lijsten zijn opgemaakt met
- Zoek in de code naar het lijsttype en controleer:
- Of ongeordende lijsten (
<ul>) zijn gebruikt wanneer de volgorde niet uitmaakt - Of geordende lijsten (
<ol>) zijn gebruikt wanneer de volgorde belangrijk is - Of definitielijsten (
<dl>) zijn gebruikt voor termen met beschrijvingen
- Of ongeordende lijsten (
- Zoek in de code naar misbruik van lijstelementen en controleer:
- Of lijstelementen niet worden gebruikt voor content die geen lijst is
- Of lijstelementen niet alleen voor styling worden gebruikt
- Zoek in de code naar geneste lijsten en controleer:
- Of
<ul>of<ol>alleen<li>,<script>of<template>als directe kinderen bevatten - Of
<dl>alleen<dt>met<dd>,<script>,<template>of<div>als directe kinderen bevatten - Of geneste lijsten correct zijn opgebouwd (geneste
<ul>of<ol>binnen<li>)
- Of
Test 3: Tabellen
- Inventariseer de pagina
- Bepaal welke content er uit ziet als een tabel:
- Kolommen en rijen met gerelateerde data
- Koppen boven kolommen of naast rijen
- Bepaal voor elke tabel het tabeltype:
- Datatabel: bevat gestructureerde data met koppen
- Presentatietabel: alleen voor visuele positionering
- Bepaal welke content er uit ziet als een tabel:
Datatabel
- Zoek in de code naar tabelelementen en controleer:
- Of datatabellen zijn opgemaakt met
<table>-element - Of datatabellen zijn opgemaakt met
role="table",role="row",role="columnheader",role="rowheader"
- Of datatabellen zijn opgemaakt met
- Bekijk de tabelstructuur en controleer:
- Of elke kolom een duidelijke betekenis heeft
- Of elke rij een duidelijke betekenis heeft
- Of koppen de inhoud van kolommen en/of rijen beschrijven
- Of er geen structuurproblemen zijn zoals:
- Lege rijen of kolommen voor witruimte
- Verklarende tekst in tabelcellen
- Wisseling van betekenis halverwege
- Zoek in de code naar tabelkop-elementen en controleer:
- Of visuele tabelkoppen zijn opgemaakt met
<th> - Of visuele tabelkoppen zijn opgemaakt met
role="columnheader"ofrole="rowheader" - Of kopcellen niet zijn opgemaakt met
<td>
- Of visuele tabelkoppen zijn opgemaakt met
- Zoek in de code naar het
scope-attribuut en controleer:- Of het
scope-attribuut geen ongeldige waarden heeft - Of tabellen met rij- én kolomkoppen het
scope-attribuut gebruiken - Of
scope="col"is gebruikt voor kolomkoppen - Of
scope="row"is gebruikt voor rijkoppen - Of
scope="colgroup"ofscope="rowgroup"is gebruikt voor gegroepeerde kopcellen
- Of het
Complexe datatabel
Let op: Deze stappen zijn alleen voor complexe tabellen met:
- Tabelkoppen op meerdere niveaus
- Samengevoegde tabelkoppen
- Meer dan 2 niveaus van koppen
- Zoek in de code naar
headerseniden controleer:- Of elke kopcel (
<th>) een uniekidheeft - Of elke datacel (
<td>)eenheaders-attribuut heeft - Of het
headers-attribuut verwijst naar alle relevante kop-id‘s
- Of elke kopcel (
Presentatietabel
Let op: Deze stappen zijn alleen voor presentatietabellen
- Zoek in de code naar presentatietabellen en controleer:
- Of
role="presentation"ofrole="none"is toegevoegd aan het<table>-element - Of presentatietabellen geen
<th>-elementen bevatten - Of presentatietabellen geen
<caption>-element bevatten - Of presentatietabellen geen
summary-,headers– ofscope-attributen bevatten
- Of
Test 4: Formulieren
Labels
- Inventariseer de pagina
- Bepaal welke formulierelementen er zijn:
- Invoervelden (
<input>) - Tekstvakken (
<textarea>) - Keuzelijsten (
<select>) - Keuzerondjes (
<input type="radio">) - Selectievakjes (
<input type="checkbox">) - Knoppen (
<button>,<input type="submit">)
- Invoervelden (
- Bepaal voor elk formulierelement:
- Of er een zichtbare beschrijving bij staat
- Of de beschrijving direct voor of boven het element staat (bij invoervelden en keuzelijsten)
- Of de beschrijving direct na het element staat (bij keuzerondjes en selectievakjes)
- Bepaal welke formulierelementen er zijn:
- Test de koppeling van labels door op de beschrijving te klikken
- Klik met de muis op de beschrijving van elk formulierelement
- Controleer of de cursor naar het bijbehorende veld springt:
- Bij invoervelden: de cursor staat in het veld
- Bij keuzerondjes en selectievakjes: het element wordt geselecteerd
- Bij keuzelijsten: de lijst krijgt focus
- Zoek in de code naar formulierelementen waarvan de kliktest niet werkt en controleer:
- Of het element een
aria-labelledbyheeft dat verwijst naar de beschrijving - Of het element een
aria-labelheeft met de beschrijvende tekst - Of het element een
title-attribuut heeft met de beschrijving - Of het element binnen een
<label>staat (implicit label)
- Of het element een
Groepen van formulierelementen
- Inventariseer de pagina op groepen van gerelateerde formulierelementen
- Bepaal welke groepen er visueel zijn:
- Keuzerondjes met een groepslabel erboven
- Selectievakjes met een groepslabel erboven
- Velden die bij elkaar horen (bijvoorbeeld factuuradres en afleveradres)
- Samengestelde invoer (bijvoorbeeld datum met dag/maand/jaar)
- Bepaal voor elke groep:
- Of de individuele labels alleen voldoende context geven
- Of de groepslabel nodig is om het doel van de individuele elementen te begrijpen
- Bepaal welke groepen er visueel zijn:
- Zoek in de code naar groepen waar de groepslabel nodig is en controleer:
- Of de groep binnen een
<fieldset>staat met een<legend>als groepslabel - Of de groep binnen een element staat met
role="group"ofrole="radiogroup"én:- Een
aria-labelledbydat verwijst naar de groepslabel, of - Een
aria-labelmet de tekst van de groepslabel
- Een
- Of de groep binnen een
Test 5: Overige semantiek
- Verken de pagina
- Bepaal welke informatie wordt overgebracht via:
- Visuele positie
- Kleur of contrast
- Vorm of grootte
- Witruimte tussen elementen
- Inspringingen
- Bepaal welke relaties tussen elementen visueel zichtbaar zijn
- Bepaal welke informatie wordt overgebracht via:
- Schakel een schermlezer in
- Navigeer met de schermlezer door de hele pagina en controleer:
- Of de visuele informatie ook door de schermlezer wordt aangekondigd
- Of de visuele relaties ook programmatisch beschikbaar zijn
- Of er alternatieve tekstuele informatie aanwezig is voor visuele informatie
Belangrijk om te weten
- Het overslaan van kopniveaus (bijvoorbeeld h1 naar h3) is geen fout als de hiërarchie logisch blijft
- Meerdere h1-elementen is niet per se een fout
- Lege tabelkoppen zijn toegestaan
Beoordeling
Algemene semantiek
- Informatie die visueel wordt getoond moet in de code beschikbaar zijn of in tekst
- Structuur die visueel wordt getoond moet in de code beschikbaar zijn of in tekst
- Relaties die visueel worden getoond moeten in de code beschikbaar zijn of in tekst
- Semantische opmaak moet correct zijn
- Semantische opmaak moet passend worden gebruikt
role="presentation"of"none"moeten niet gebruikt zijn op content die semantische informatie bevat
Koppen
- Tekst die er uit ziet als een kop moet zijn opgemaakt met een kop-element
- Tekst die geen kop is moet niet zijn opgemaakt met een kop-element
- De waarde van het
aria-level-attribuut moet een getal zijn van 1 tot en met 6 - De volgorde van koppen moet de betekenis van de pagina niet in de weg staan
Lijsten
- Tekst die er uit ziet als een lijst moet zijn opgemaakt met een lijst-element
- Tekst die geen lijst is moet niet zijn opgemaakt met een lijst-element
- Het lijsttype moet passen bij de functie van de lijst (ongeordend, geordend of definitie)
- Lijst-elementen moeten correct zijn gestructureerd
Tabellen
- Tekst die er uit ziet als een tabel moet zijn opgemaakt met een tabel-element
- Tabelkoppen moeten worden opgemaakt met een tabelkop-element.
- Tabelcellen moeten programmatisch zijn gekoppeld aan de bijbehorende koppen
- Presentatietabellen moeten geen
<th>,<caption>,summary,headersofscopebevatten
Formulieren
- Zichtbare labels moeten programmatisch zijn gekoppeld aan hun bijbehorende formulierelement
- Groepen van gerelateerde invoervelden moeten zijn gegroepeerd als de individuele labels onvoldoende context bieden
Bronnen
- WCAG 2.2 – Succescriterium 1.3.1 Info en relaties
- Page Structure Tutorial | Web Accessibility Initiative (WAI) | W3C (Engelstalig)
- Tables Tutorial | Web Accessibility Initiative (WAI) | W3C (Engelstalig)
- WebAIM: Semantic Structure: Regions, Headings, and Lists (Engelstalig)
- WebAIM: Creating Accessible Tables – Layout Tables (Engelstalig)
- WebAIM: Creating Accessible Tables – Data Tables (Engelstalig)
- WebAIM: Creating Accessible Forms – Accessible Form Controls (Engelstalig)