Semantiek: header/nav/main/footer
Waarom je layout “werkt”, maar je pagina toch onlogisch voelt
Je krijgt een trainingsopdracht: bouw een simpele site met een logo bovenaan, een menu, een hoofdtekst en onderaan contactgegevens. Je maakt vlug een paar <div>’s, zet er wat CSS op, en het ziet er prima uit. Totdat je moet uitbreiden: een tweede pagina, een andere volgorde, een screenreader-test, of feedback zoals “waar is de hoofdinhoud?” of “waarom moet ik 30 keer tabben voordat ik bij de tekst ben?”.
Dat is het moment waarop semantiek belangrijk wordt. Niet omdat de browser anders “kapot” gaat, maar omdat je pagina dan begrijpelijk wordt—voor mensen, voor hulpmiddelen (screenreaders), en voor jezelf als je later terugkomt in de code. Met <header>, <nav>, <main> en <footer> geef je de <body> een duidelijke ruggengraat: wat is navigatie, wat is inhoud, en wat is algemene pagina-informatie?
In deze les leer je hoe je deze vier semantische “landmarks” correct inzet, welke inhoud waar hoort, en welke fouten beginners vaak maken waardoor de structuur alsnog onduidelijk blijft.
Semantiek in HTML: betekenis boven uiterlijk
Semantiek betekent: je kiest HTML-elementen op basis van betekenis en functie, niet op basis van “hoe het eruit moet zien”. Een <header> is niet “een balk bovenin”; het is een gebied met introductie- of oriëntatie-informatie. Een <nav> is niet “een rij knopjes”; het is navigatie. En <main> is niet “een container”; het is de unieke hoofdinhoud van díe pagina.
Belangrijke begrippen:
-
Semantisch element: een tag die de rol van content beschrijft (zoals
<nav>), in plaats van een generieke container (<div>). -
Landmarks: herkenbare gebieden in een pagina waar hulpmiddelen en browsers snel naartoe kunnen springen (header/nav/main/footer zijn veelgebruikte landmarks).
-
Document outline (mentaal model): de logische indeling van je pagina. Ook zonder CSS moet het duidelijk zijn wat de gebruiker als eerste/laatste en als “kern” ziet.
Dit sluit direct aan op de vorige les over <head> versus <body>: je hield metadata en resources netjes in de head, en je zette zichtbare content in de body. Semantiek is de volgende stap: je maakt de content in de body zelf ook geordend en betekenisvol, zodat de pagina voorspelbaar blijft als je groeit van “één pagina” naar “een kleine site”.
Een bruikbare analogie: als de <head> de backstage-instructies zijn, dan zijn <header>, <nav>, <main>, <footer> de bewegwijzering in het gebouw. Je kunt nog steeds overal posters ophangen (CSS), maar zonder duidelijke borden verdwaalt iedereen—mens én machine.
De vier landmarks die elke beginner snel vooruit helpen
<header>: introductie, branding en context (maar niet “alles bovenaan”)
De <header> bevat meestal content die de gebruiker helpt te begrijpen waar ze zijn en wat dit is: branding, paginatitel, korte introductie, en soms hulpmiddelen zoals zoeken. Belangrijk: een header is semantisch gekoppeld aan het gedeelte waar hij bij hoort. Je kunt dus een <header> hebben voor de hele pagina, maar óók bijvoorbeeld binnen een <article> (een artikelheader met titel, auteur, datum). Beginners denken vaak dat er “maar één header mag”; in de praktijk is het vooral: wees consequent en logisch.
Wat zet je er typisch in op paginaniveau?
-
Een logo of sitenaam (vaak klikbaar naar home).
-
Een paginah1 of titelgebied (soms in combinatie met het logo).
-
Een korte tagline of introzin, als die functioneel is.
-
Optioneel: een zoekveld of call-to-action die bij “oriëntatie” hoort.
Best practices die veel verwarring voorkomen:
-
Gebruik
<header>voor introductie/oriëntatie, niet als willekeurige wrapper voor styling. Als je alleen een achtergrondkleur wilt, is dat geen semantische reden—dan kan een<div>ook, maar liever stijl je een echte header of een ander passend element. -
Houd je header “licht”: als je er complete secties met content in gaat stapelen, vervaagt het verschil met
<main>. Vraag jezelf: “Helpt dit de gebruiker oriënteren, of is het inhoud die gelezen/benut wordt als kern?” -
Let op focusvolgorde: items in de header (logo, zoek, menu) komen vaak vroeg in de tabvolgorde. Te veel interactieve dingen bovenaan kan frustrerend zijn.
Veelvoorkomende valkuilen en misvattingen:
-
Misvatting: “Header = bovenkant van het scherm.” Een sticky balk kan een header zijn, maar een header hoeft niet sticky te zijn, en “bovenaan” alleen is geen betekenis.
-
Valkuil: een
<header>binnen<main>gebruiken voor “de bovenkant van de layout” terwijl het eigenlijk een paginabrede header is. Dat maakt later hergebruik en herkenbaarheid lastiger. -
Valkuil: meerdere grote headers op paginaniveau zonder duidelijk doel. Dat maakt landmarks voor hulpmiddelen onduidelijker in plaats van duidelijker.
<nav>: echte navigatie, herkenbaar voor mens én hulpmiddel
<nav> is bedoeld voor een blok met belangrijke navigatielinks. Dat kan het hoofdmenu zijn, maar ook bijvoorbeeld een subnavigatie of een “contents”-lijst bij een document. De winst van <nav> is dat de rol expliciet is: screenreaders bieden vaak een snelle manier om van landmark naar landmark te springen (“Spring naar navigatie”), en gebruikers kunnen sneller oriënteren.
Wat hoort er wel/niet in?
-
Wel: links naar hoofdpagina’s (Home, Over ons, Contact), categorieën, belangrijke secties, breadcrumbs als die navigatie geven.
-
Niet: losse “lees meer”-links in de tekst, social icons die vooral extern promoten (kan soms wel, maar wees kritisch), of een lijst links die eigenlijk bij de inhoud hoort (bijv. bronnenlijst).
Een belangrijk principe: je mag meerdere <nav>’s hebben als ze verschillende doelen hebben, maar houd het begrijpelijk. Een hoofdnav bovenaan en een subnav in een zijbalk kan prima—als het voor een gebruiker logisch voelt dat er meerdere navigatiegebieden zijn.
Best practices:
-
Stop navigatielinks in een duidelijke structuur (vaak een
<ul>met<li>en<a>), zodat de relaties zichtbaar zijn: “dit is een lijst keuzes”. -
Voorzie een nav van een herkenbare label (zichtbaar of via aria) als je meerdere navs hebt. Zonder labels kan een gebruiker “navigatie, navigatie, navigatie” horen zonder te weten welke welke is. (Als beginner onthoud je vooral: meerdere navs = zorg dat ze te onderscheiden zijn.)
-
Plaats
<nav>waar een gebruiker het verwacht, maar laat semantiek leidend zijn. Je kunt nav ook in een footer hebben (footer-navigatie), zolang het echte navigatie is.
Typische misconcepties:
-
Misvatting: “Alles met links is nav.” Nee: navigatie gaat om oriëntatie en verplaatsen binnen site/secties, niet om elke hyperlink.
-
Valkuil: een
<nav>vol knoppen die geen links zijn (bijv.<button>zonder navigatiedoel). Dan is het eerder een toolbar of filter UI dan navigatie.
<main>: precies één keer, met de unieke kern van de pagina
<main> is de plek voor de unieke hoofdinhoud van de pagina. Dit is vaak het belangrijkste landmark voor toegankelijkheid: veel gebruikers willen snel “naar de main content” om menu’s over te slaan. Daarom is de regel simpel en streng: gebruik exact één <main> per pagina, en niet als kind van <header>, <nav>, <aside> of <footer>.
Wat betekent “uniek” in de praktijk?
-
Op een homepage is main: de kernblokken die de homepage definiëren (hero, highlights, belangrijkste info).
-
Op een contactpagina is main: het contactformulier, adres, openingstijden—de content die die pagina “de contactpagina” maakt.
-
Dingen die op elke pagina terugkomen (siteheader, global nav, footer) horen dus meestal buiten main.
Best practices die direct rust geven:
-
Zet in
<main>een duidelijke hoofdtitel (<h1>) of een helder startpunt van inhoud. Dit helpt zowel visueel als in hulpmiddelen. -
Houd “chrome” (logo, menu, algemene CTA’s) buiten main. Als je steeds dezelfde component herhaalt op meerdere pagina’s, is het een sterke hint dat het geen main is.
-
Denk aan onderhoud: als jij later een tweede pagina maakt, wil je dat alleen
<main>echt verandert. Dat is een praktisch controlepunt.
Veelvoorkomende fouten:
-
Valkuil: meerdere
<main>’s omdat je “meerdere hoofdblokken” hebt. Dat voelt logisch, maar het breekt het landmark-model: er kan maar één “hoofdin-houd” zijn per document. -
Misvatting: “Main is hetzelfde als een wrapper voor layout.” Nee: main gaat om betekenis. Je kunt nog steeds een wrapper-div gebruiken voor grid/flex, maar main is het inhoudelijke anker.
<footer>: afsluiting, meta-info en handige eind-links
De <footer> bevat meestal informatie die de pagina of site afrondt: copyright, contact, gerelateerde links, voorwaarden, social links, en soms een kleine navigatie. Net als <header> kan een footer op pagina-niveau staan, maar ook binnen een specifiek onderdeel (bijv. een <article> met een footer voor tags, auteur, deelknoppen). Het doel is steeds: afsluitende of aanvullende informatie bij dat stuk content.
Wat zet je er vaak in (paginabreed)?
-
Contactgegevens, adres, openingstijden (als die sitebreed relevant zijn).
-
Copyright en juridische links (privacy, voorwaarden).
-
Extra navigatie (sitemap-achtig), mits het echt helpt.
-
Social links, nieuwsbrief inschrijving (kan, maar overdrijf niet).
Best practices:
-
Zie footer niet als “dumpplaats” voor alles wat je niet kwijt kunt. Als het kerninformatie is om je taak te begrijpen (bijv. instructie voor een training), hoort het waarschijnlijk in main.
-
Als je footer navigatie bevat, overweeg een
<nav>binnen de footer, zodat je expliciet maakt: “dit deel van de footer is navigatie”. -
Hou het scanbaar: footers worden vaak snel gescand en moeten niet voelen als een tweede main.
Veelvoorkomende valkuilen:
-
Misvatting: “Footer = altijd onderaan het scherm.” Net als header gaat het om betekenis; CSS bepaalt de positie.
-
Valkuil: belangrijke content (bijv. volledige productbeschrijving) in de footer zetten omdat “er nog ruimte was”. Dat maakt de pagina onlogisch voor gebruikers en hulpmiddelen.
Hier is het verschil tussen deze elementen in één overzicht:
| Vraag | <header> |
<nav> |
<main> |
<footer> |
|---|---|---|---|---|
| Hoofdfunctie | Oriëntatie en introductie bij een pagina of onderdeel. Denk aan branding, titel, korte context. | Navigatie naar belangrijke plekken: sitepagina’s, secties, categorieën. | De unieke kerninhoud van de pagina: wat deze pagina “is”. | Afsluitende/aanvullende info: contact, juridisch, extra links, meta. |
| Hoeveel keer per pagina? | Vaak 1 op paginaniveau, maar kan meerdere keren bij onderdelen (bijv. in <article>). |
Kan meerdere keren, maar alleen waar het echt navigatie is. Zorg dat navs te onderscheiden zijn. | Precies 1 per pagina. Niet nesten in header/nav/footer/aside. | Vaak 1 op paginaniveau, kan ook per onderdeel (bijv. artikelfooter). |
| Wat hoort er typisch in? | Logo, sitenaam, paginatitel, intro, zoekfunctie. Niet de hele inhoud. | Lijst met links, menu-structuur, breadcrumbs. Niet “elke link”. | Titels, paragrafen, afbeeldingen, formulieren—de kern. Herhaalbare siteonderdelen liever buiten main. | Copyright, contact, privacy, extra navigatie, social links. Niet de hoofdboodschap. |
| Veelgemaakte beginnerfout | Header gebruiken als “bovenste div voor styling” en er van alles in gooien. | Elk blok met links in <nav> stoppen, ook als het inhoudelijke links zijn. |
Meerdere mains maken of main als layout-wrapper gebruiken. | Footer als rommelbak gebruiken voor content die eigenlijk in main hoort. |
[[flowchart-placeholder]]
Twee trainingssituaties waarin semantiek direct verschil maakt
Voorbeeld 1: Trainingssite met “Home / Oefeningen / Contact” en een logo
Je maakt een pagina met een logo linksboven en een horizontaal menu. Visueel is het simpel, maar semantisch wil je dat iemand (of een reviewer met een screenreader) snel snapt: “dit is de sitekop, dit is navigatie, en dit is de content”. Een logische basisindeling is: <header> met branding, <nav> met de menu-links, dan <main> met de inhoud, en onderaan <footer> met contact/copyright.
Stap voor stap hoe je dit toepast:
- Plaats in de
<body>eerst een paginabrede<header>. Zet daarin bijvoorbeeld het logo als link naar home en eventueel de sitenaam. Dit geeft directe oriëntatie. - Zet daarna een
<nav>met een lijst links. Door een<ul>te gebruiken leg je structuur vast: het is een set keuzes, niet losse decoratieve links. - Zet vervolgens
<main>met een duidelijke start: een<h1>(bijv. “Oefeningen”) en de bijbehorende tekst of kaarten. Dit is het deel dat per pagina het meest verandert. - Sluit af met
<footer>met herbruikbare info (contactgegevens, privacy-link). Dit blijft vaak gelijk over alle pagina’s.
Impact en beperkingen:
-
Impact: je pagina is makkelijker te begrijpen zonder CSS, en hulpmiddelen kunnen sneller navigeren tussen landmarks. Ook als je later CSS omgooit, blijft de betekenis overeind.
-
Beperking: semantiek vervangt geen goede inhoudshiërarchie; je moet nog steeds headings logisch gebruiken. Maar het voorkomt veel “waar hoort dit?”-discussies bij review.
Voorbeeld 2: Pagina “springt raar” bij laden en tabben voelt onlogisch
In een trainingsopdracht merk je: bij het laden lijkt de focus soms “bovenin” te blijven hangen en je moet veel tabben langs knoppen in een grote bovenbalk voordat je bij de tekst komt. Dit lijkt op een interactie-/toegankelijkheidsprobleem, maar semantiek helpt je de pagina opnieuw te organiseren zodat de volgorde en rollen duidelijk zijn.
Stap voor stap wat je checkt en verbetert:
- Kijk of je bovenaan een enorme container hebt die eigenlijk alles bevat (logo, menu, zoek, promo’s, misschien zelfs een hele eerste tekstsectie). Als dit allemaal in
<header>zit, is je header semantisch “te zwaar”. - Knip de kerninhoud los en zet die in
<main>. Alles wat de pagina uniek maakt (uitleg, opdrachtcontext, formulier) hoort daar. - Beperk interactieve elementen in de header tot wat echt oriëntatie is (logo, zoek, eventueel een primaire CTA). Veel extra knoppen kunnen beter naar main als het onderdeel is van de taak.
- Gebruik
<nav>alleen voor echte navigatie. Als je bovenaan een rij filters of acties hebt die geen paginanavigatie zijn, hoort dat niet automatisch in nav—dat is eerder UI binnen main.
Impact en beperkingen:
-
Impact: tabvolgorde en “landmark jumps” worden logisch: eerst oriëntatie, dan navigatie, dan kerninhoud. Reviewers ervaren minder “ik verdwaal”.
-
Beperking: als je echt veel interactieve UI hebt, moet je daarnaast ook goed nadenken over headings, labels en focusbeheer. Semantiek is de basis, maar niet het enige ingrediënt.
Een compacte, herbruikbare body-structuur
Als je twijfelt: begin met een simpele, consistente basis die je in opdrachten kunt hergebruiken. Dit is geen “magisch template”, maar een betrouwbare startstructuur waar je later onderdelen aan kunt toevoegen.```html
Paginatitel
Hier staat de unieke hoofdinhoud van deze pagina.
```
Let op wat dit je oplevert: zelfs zonder styling kun je de pagina “hardop” logisch lezen. En als je later CSS toevoegt, blijft de structuur stabiel—je verschuift uiterlijk, niet betekenis.
Belangrijkste punten om mee te nemen
-
Semantische landmarks maken je pagina begrijpelijk:
<header>(oriëntatie),<nav>(navigatie),<main>(unieke kern),<footer>(afronding/aanvulling). -
Gebruik
<main>exact één keer en zet daar de content die deze pagina uniek maakt. -
Gebruik
<nav>alleen voor echte navigatie; niet elke linklijst is navigatie. -
Laat CSS het uiterlijk bepalen; laat HTML de betekenis dragen.
Next, we'll build on this by exploring Content: tekst, lijsten en links [30 minutes].