🌐HTML
Zelfstudie met uitleg, live voorbeelden en oefeningen: van je eerste webpagina tot een volledige, toegankelijke portfolio-pagina.
Overzicht
Werk de onderdelen hieronder in je eigen tempo af: lees de uitleg, doe het opzoekwerk en sluit af met een quizje. Klik een onderdeel open om te starten.
De bouwstenen van elke website: hoe een webpagina werkt, wat een tag is en hoe je je allereerste pagina schrijft.
Wat is HTML?
HTML staat voor HyperText Markup Language. Het is de taal waarmee je de inhoud en structuur van een webpagina beschrijft: dit is een titel, dit is een alinea, dit is een afbeelding, dit is een link naar een andere pagina.
HTML is geen programmeertaal (er zit geen logica in), maar een opmaaktaal (markup language). Elke website die je ooit bezocht, is opgebouwd uit HTML. Samen met twee andere talen vormt het de basis van het web:
| Taal | Rol | Vergelijking met een huis |
|---|---|---|
| HTML | inhoud en structuur | de muren, kamers en deuren |
| CSS | uitzicht: kleuren, lettertypes, layout | de verf, het behang en de inrichting |
| JavaScript | gedrag: reageren op klikken, gegevens ophalen | de elektriciteit en de bel |
In dit vak beginnen we bij de muren: eerst HTML, daarna komen CSS en JavaScript.
Hoe werkt het web?
Wanneer je een adres intypt, gebeurt er heel snel het volgende:
- Je browser (Chrome, Firefox, Edge, Safari, ...) vraagt de pagina op bij een server: het request.
- De server stuurt een tekstbestand terug met HTML: de response.
- Je browser leest die HTML en tekent de pagina op je scherm.
Request en responseJouw browser De server
| -- "Geef me index.html" --> |
| |
| <-- <h1>Welkom</h1> <p>...</p> -- |
|
(leest de HTML en toont de pagina)Belangrijk: een browser toont geen HTML-code, maar het resultaat ervan. Kies je in je browser Paginabron weergeven (of druk op Ctrl+U), dan zie je de HTML die de server stuurde. Bij elke website kan je dus kijken hoe ze gebouwd is.
Wat heb je nodig?
- Een teksteditor voor code: wij gebruiken Visual Studio Code. Kladblok werkt ook, maar VS Code kleurt je code en helpt je fouten te vermijden.
- Een browser om het resultaat te bekijken.
- Een map waarin je je bestanden bewaart, bijvoorbeeld
mijn-website.
Een HTML-bestand is gewoon een tekstbestand met de extensie .html. Dubbelklik je erop, dan opent je browser het. Geef bestanden altijd een duidelijke naam zonder spaties of hoofdletters (over-mij.html en niet Over mij.html). De startpagina van een website noemen we index.html.
Installeer in VS Code de extensie Live Server. Rechtsklik op je bestand, kies Open with Live Server, en je pagina ververst vanzelf telkens je bewaart.
Tags en elementen
HTML bestaat uit elementen. Een element bestaat meestal uit een openingstag, de inhoud en een sluittag. Tags staan tussen punthaken < > en de sluittag heeft een schuine streep.
Anatomie van een element<p>Dit is een alinea.</p>
↑ ↑ ↑
| | sluittag
| inhoud
openingstagElementen mogen in elkaar zitten (nesting). Sluit ze dan in de omgekeerde volgorde: wat je als laatste opent, sluit je als eerste.
<p>Dit is <strong>belangrijke</strong> tekst.</p> <!-- juist -->
<p>Dit is <strong>fout</p></strong> <!-- fout: verkeerd ingesloten -->Sommige elementen hebben geen inhoud en dus ook geen sluittag, zoals <br> (een regeleinde), <hr> (een lijn) en <img> (een afbeelding). Dat noemen we lege elementen.
Met <!-- tekst --> schrijf je een opmerking in je code. De browser toont die niet. Handig om uit te leggen waarom je iets deed.
Het skelet van elke HTML-pagina
Elke HTML-pagina heeft dezelfde vaste opbouw. Leer dit skelet goed: je schrijft het bij elke nieuwe pagina.
index.html<!DOCTYPE html>
<html lang="nl">
<head>
<meta charset="utf-8">
<title>Mijn eerste pagina</title>
</head>
<body>
<h1>Hallo wereld!</h1>
<p>Mijn eerste webpagina.</p>
</body>
</html>| Onderdeel | Betekenis |
|---|---|
<!DOCTYPE html> | zegt aan de browser dat dit een moderne HTML5-pagina is (moet bovenaan staan) |
<html lang="nl"> | het hoofdelement waarin alles zit; lang geeft de taal van de pagina aan |
<head> | informatie over de pagina die je niet ziet in het venster |
<meta charset="utf-8"> | zorgt dat letters als é, ë en € juist getoond worden |
<title> | de titel in het browsertabblad |
<body> | alles wat je wel op de pagina ziet |
Alles wat de bezoeker moet zien (titels, tekst, afbeeldingen) hoort in de <body>. In de <head> staat enkel wat de pagina beschrijft of nodig heeft (titel, tekenset, stijlen).
Zo werkt deze cursus
- Onder de uitleg vind je "Probeer zelf"-blokken: pas de HTML aan en klik op Uitvoeren om meteen het resultaat te zien.
- Bij de oefeningen typ je zelf HTML. Met Voorbeeld bekijk je je pagina, met Controleer wordt ze nagekeken op de gevraagde onderdelen.
- Vast? Gebruik de hint. Lukt het echt niet, dan kan je de oplossing tonen.
- Bij opzoekwerk zoek je zelf iets op: dat hoort bij het werk van een webontwikkelaar.
Verwerk wat je hierboven las met de onderdelen hieronder. Ze horen bij deze theorie.
🧪 Oefeningen — Wat is HTML?
Typ je code in het vak en klik op "Controleer". Je code wordt nagekeken op de vereiste onderdelen (waar een Voorbeeld-knop staat, kan je je pagina ook meteen bekijken). Je code wordt bewaard als je aangemeld bent.
Schrijf een volledige HTML-pagina: met doctype, een <html> met lang="nl", een <head> met <meta charset="utf-8"> en een <title> (met eigen tekst), en een <body> met een titel <h1> en een alinea <p>.
Schrijf één alinea <p> waarin het woord belangrijk vet staat (met <strong>) en het woord schuin schuin staat (met <em>). Sluit alle elementen juist af. Voeg ook een commentaar toe.
Voorbeeld: <p>Dit is <strong>belangrijk</strong> en <em>schuin</em>.</p>
🔍 Opzoekwerk — Wat is HTML?
Zoek het antwoord zelf op (internet, cursus, ...) en typ het hieronder. Wordt automatisch bewaard.
Tip: zoek naar "geschiedenis van HTML Tim Berners-Lee".
✓ opgeslagenTip: zoek naar "browser engines Blink Gecko WebKit".
✓ opgeslagen✅ Testjezelf-quiz — Wat is HTML?
Beantwoord alle vragen en klik daarna op "Controleer". Je mag zo vaak opnieuw proberen als je wil.
Titels, alinea’s en opmaak: zo geef je tekst structuur, voor mensen én voor zoekmachines.
Koppen: h1 tot h6
Met koppen (headings) geef je je pagina een structuur, zoals de titels en tussentitels in een boek. Er zijn zes niveaus: <h1> is de belangrijkste, <h6> de minst belangrijke.
Koppen vormen een boomstructuur<h1>Mijn hobby’s</h1>
<h2>Sport</h2>
<h3>Voetbal</h3>
<h3>Zwemmen</h3>
<h2>Muziek</h2>Gebruik <h1> één keer per pagina voor de hoofdtitel, en sla geen niveaus over (geen <h4> rechtstreeks onder een <h2>). Wil je gewoon grotere letters? Dat regel je later met CSS. Zoekmachines en schermlezers gebruiken de koppen om je pagina te begrijpen.
Alinea’s, regeleinden en lijnen
Tekst zet je in een alinea: <p>. De browser zet vóór en na elke alinea automatisch wat witruimte.
Meerdere spaties of enters achter elkaar telt de browser als één spatie. Wil je een nieuwe regel binnen een alinea, gebruik dan <br>. Een horizontale scheidingslijn maak je met <hr>. Beide zijn lege elementen (zonder sluittag).
<p>Dit is een alinea met veel spaties.</p>
<p>Straat 12<br>2400 Mol<br>België</p>
<hr>
<p>Na de lijn begint een nieuw stuk.</p> Tekst benadrukken
Met deze elementen geef je woorden extra betekenis:
| Element | Betekenis | Resultaat |
|---|---|---|
<strong> | belangrijk | belangrijk |
<em> | nadruk | nadruk |
<mark> | gemarkeerd | gemarkeerd |
<small> | kleine lettertjes | kleine lettertjes |
<sub> / <sup> | subscript / superscript | H2O, m2 |
<code> | stukje code | console.log() |
<del> / <ins> | verwijderd / toegevoegd |
Vroeger gebruikte men <b> en <i> voor vet en schuin. Kies liever <strong> en <em>: die zeggen waarom iets opvalt (belangrijk, nadruk), niet enkel hoe het eruitziet.
Citaten en vooropgemaakte tekst
Een langer citaat zet je in <blockquote>, een kort citaat binnen een zin in <q>. Wil je dat spaties en enters wel behouden blijven (bijvoorbeeld voor code of een gedicht), gebruik dan <pre>.
<blockquote>
<p>De beste manier om te leren programmeren is programmeren.</p>
</blockquote>
<p>Zoals mijn leraar zegt: <q>oefening baart kunst</q>.</p>
<pre>
Roosje rood,
Roosje wit,
</pre> Speciale tekens (entiteiten)
De tekens < en > horen bij tags. Wil je ze als tekst tonen, dan schrijf je een entiteit: een code die met & begint en met ; eindigt.
| Wil je zien | Schrijf je |
|---|---|
< | < (less than) |
> | > (greater than) |
& | & |
| © | © |
| € | € (of gewoon € typen) |
| een niet-afbreekbare spatie | |
Zo toon je bijvoorbeeld een tag in een handleiding: <p>Zie de tag <strong></p>. Precies dat doen we ook in deze cursus.
Verwerk wat je hierboven las met de onderdelen hieronder. Ze horen bij deze theorie.
🧪 Oefeningen — Tekst en koppen
Typ je code in het vak en klik op "Controleer". Je code wordt nagekeken op de vereiste onderdelen (waar een Voorbeeld-knop staat, kan je je pagina ook meteen bekijken). Je code wordt bewaard als je aangemeld bent.
Schrijf de body-inhoud van een pagina over jezelf: één <h1> met je naam, twee <h2>-koppen (bv. "Hobby’s" en "School") en onder elke <h2> minstens één alinea <p>.
Schrijf een adres in één alinea over drie regels (straat, postcode + stad, land) met <br>. Zet de stad vet met <strong> en voeg onder de alinea een scheidingslijn <hr> toe.
<p>Kerkstraat 12<br>2400 <strong>Mol</strong><br>België</p>
Schrijf een alinea die de tekst <h1> op de pagina toont (dus zichtbaar, niet als kop) met behulp van entiteiten. Zet daarna in dezelfde alinea het woord "Tom & Jerry" met een correct geschreven ampersand.
🔍 Opzoekwerk — Tekst en koppen
Zoek het antwoord zelf op (internet, cursus, ...) en typ het hieronder. Wordt automatisch bewaard.
Tip: zoek naar "heading structure accessibility SEO".
✓ opgeslagenTip: developer.mozilla.org -> HTML elements reference.
✓ opgeslagen✅ Testjezelf-quiz — Tekst en koppen
Beantwoord alle vragen en klik daarna op "Controleer". Je mag zo vaak opnieuw proberen als je wil.
Opsommingen, genummerde stappen en lijsten in lijsten: bijna elk menu op het web is eigenlijk een lijst.
Ongeordende lijst (ul)
Een lijst met opsommingstekens (bolletjes) maak je met <ul> (unordered list). Elk punt is een <li> (list item).
Een boodschappenlijst<ul>
<li>Melk</li>
<li>Brood</li>
<li>Kaas</li>
</ul>In een <ul> of <ol> staan enkel <li>-elementen als rechtstreekse kinderen. Tekst of een <p> rechtstreeks in de lijst is fout.
Genummerde lijst (ol)
Is de volgorde belangrijk (stappen, een top 3), gebruik dan <ol> (ordered list). De browser telt zelf mee. Met attributen pas je de teller aan:
<ol start="5">begint bij 5<ol reversed>telt achteruit<ol type="a">gebruikt letters (a, b, c)
<ol>
<li>Water koken</li>
<li>Pasta toevoegen</li>
<li>Tien minuten wachten</li>
</ol> Lijsten in lijsten
Een lijst mag binnen een <li> nog een lijst bevatten. Zo maak je een uitklapmenu of een inhoudsopgave. Let goed op het inspringen: dat maakt je code leesbaar.
Geneste lijst<ul>
<li>Frontend
<ul>
<li>HTML</li>
<li>CSS</li>
</ul>
</li>
<li>Backend
<ul>
<li>PHP</li>
<li>MySQL</li>
</ul>
</li>
</ul>Bijna elk navigatiemenu op het web is een <ul> met links in de <li>-elementen. Met CSS maak je er later een horizontale menubalk van. Daarom is het belangrijk dat je lijsten goed beheerst.
Beschrijvingslijst (dl)
Voor begrippen met een uitleg (zoals een woordenlijst) bestaat <dl>: een lijst met termen (<dt>) en hun beschrijving (<dd>).
<dl>
<dt>HTML</dt>
<dd>De taal voor de structuur van een pagina.</dd>
<dt>CSS</dt>
<dd>De taal voor het uitzicht.</dd>
</dl> Verwerk wat je hierboven las met de onderdelen hieronder. Ze horen bij deze theorie.
🧪 Oefeningen — Lijsten
Typ je code in het vak en klik op "Controleer". Je code wordt nagekeken op de vereiste onderdelen (waar een Voorbeeld-knop staat, kan je je pagina ook meteen bekijken). Je code wordt bewaard als je aangemeld bent.
Maak een lijst met een titel <h2> ("Mijn favoriete films") en daaronder een ongeordende lijst met minstens vier films.
Maak een genummerde lijst met drie stappen om een pagina te maken. Zet onder de tweede stap een ongeordende lijst met twee deelstappen (in dezelfde <li>).
🔍 Opzoekwerk — Lijsten
Zoek het antwoord zelf op (internet, cursus, ...) en typ het hieronder. Wordt automatisch bewaard.
Tip: rechtsklik op het menu, kies "Inspecteren".
✓ opgeslagenDenk aan: volgorde belangrijk of niet?
✓ opgeslagen✅ Testjezelf-quiz — Lijsten
Beantwoord alle vragen en klik daarna op "Controleer". Je mag zo vaak opnieuw proberen als je wil.
Het “hyper” in HyperText: pagina’s met elkaar verbinden, en begrijpen hoe bestandspaden werken.
Een link maken
Een link maak je met het anchor-element <a>. Het attribuut href (hypertext reference) bepaalt waarheen de link gaat. De tekst tussen de tags is wat de bezoeker aanklikt.
<a href="https://www.wikipedia.org">Ga naar Wikipedia</a>
<a href="over-mij.html">Over mij</a>Een link kan ook een afbeelding (of eender welk element) omsluiten: dan is dat aanklikbaar.
Absolute en relatieve paden
Een pad naar een pagina of afbeelding kan op twee manieren:
- Absoluut: het volledige webadres, inclusief
https://. Gebruik je voor pagina’s op een andere website. - Relatief: een pad vanaf het huidige bestand. Gebruik je voor je eigen bestanden: dat blijft werken als je site verhuist.
Een mapstructuurmijn-website/
├── index.html
├── over-mij.html
├── contact/
│ └── formulier.html
└── img/
└── foto.jpgVanuit index.html geldt:
| Doel | Pad |
|---|---|
| bestand in dezelfde map | over-mij.html |
| bestand in een submap | contact/formulier.html |
| afbeelding in de map img | img/foto.jpg |
| vanuit formulier.html terug naar index.html | ../index.html (twee puntjes = één map omhoog) |
Paden zijn hoofdlettergevoelig op de meeste servers: Foto.JPG is niet hetzelfde als foto.jpg. Gebruik daarom altijd kleine letters, streepjes en geen spaties in bestandsnamen. Een pad met een backslash (\) werkt ook niet: gebruik altijd /.
Openen in een nieuw tabblad
Met target="_blank" opent een link in een nieuw tabblad. Voeg dan altijd rel="noopener" toe: dat voorkomt dat de nieuwe pagina je oorspronkelijke pagina kan aansturen (veiligheid).
<a href="https://www.wikipedia.org" target="_blank" rel="noopener">Wikipedia (nieuw tabblad)</a>Gebruik het spaarzaam: enkel voor externe sites of documenten. Je eigen pagina’s laat je best in hetzelfde tabblad openen, zodat de bezoeker gewoon met de terugknop terug kan.
Naar een plek op dezelfde pagina (ankers)
Geef een element een id en verwijs ernaar met # plus die id. Ideaal voor een inhoudsopgave of een knop “terug naar boven”.
<a href="#contact">Ga naar contact</a>
... veel inhoud ...
<h2 id="contact">Contact</h2>Je kan ook combineren: over-mij.html#hobbys opent een andere pagina en springt meteen naar het element met id hobbys.
Mail, telefoon en downloads
Een link kan ook iets anders dan een pagina openen:
<a href="mailto:info@school.be">Stuur een mail</a>
<a href="tel:+3214123456">Bel ons</a>
<a href="documenten/rooster.pdf" download>Download het rooster</a>Met mailto: opent het e-mailprogramma, met tel: start op een gsm een oproep, en het attribuut download downloadt het bestand in plaats van het te openen.
Een menu bouwen
Nu je lijsten en links kent, kan je een navigatiemenu bouwen: een lijst met links, in een <nav>-element (dat leer je in het hoofdstuk over semantiek).
<nav>
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="over-mij.html">Over mij</a></li>
<li><a href="contact.html">Contact</a></li>
</ul>
</nav> Verwerk wat je hierboven las met de onderdelen hieronder. Ze horen bij deze theorie.
🧪 Oefeningen — Links en paden
Typ je code in het vak en klik op "Controleer". Je code wordt nagekeken op de vereiste onderdelen (waar een Voorbeeld-knop staat, kan je je pagina ook meteen bekijken). Je code wordt bewaard als je aangemeld bent.
Bouw een menu met een <nav> waarin een <ul> staat met drie links: Home (index.html), Over mij (over-mij.html) en Contact (contact.html). Elke link zit in een <li>.
<li><a href="index.html">Home</a></li>
Maak een link met de tekst "MDN Web Docs" naar https://developer.mozilla.org die in een nieuw tabblad opent en veilig is (rel="noopener"). Maak daarnaast een mail-link met tekst "Mail mij" naar info@school.be.
Maak bovenaan een link "Naar de conclusie" die springt naar een <h2> met id conclusie onderaan. Zet ertussen minstens één alinea.
🔍 Opzoekwerk — Links en paden
Zoek het antwoord zelf op (internet, cursus, ...) en typ het hieronder. Wordt automatisch bewaard.
Tip: zoek naar "target _blank noopener security".
✓ opgeslagenTip: zoek naar "parts of a URL".
✓ opgeslagen✅ Testjezelf-quiz — Links en paden
Beantwoord alle vragen en klik daarna op "Controleer". Je mag zo vaak opnieuw proberen als je wil.
Foto’s, bijschriften, video, audio en ingesloten pagina’s: zo maak je je site levendig.
Een afbeelding tonen
Met het lege element <img> toon je een afbeelding. Twee attributen zijn verplicht:
src(source): waar het bestand staat (pad of webadres);alt: een alternatieve tekst die de afbeelding beschrijft. Ze wordt getoond als de afbeelding niet laadt, en voorgelezen door schermlezers voor blinde bezoekers.
<img src="img/foto.jpg" alt="Sam speelt voetbal op het schoolplein">
<img src="img/logo.png" alt="Logo van Provil" width="120" height="120">Beschrijf wat er te zien is of wat de functie is, niet “afbeelding van…”. Is een afbeelding puur decoratief, dan schrijf je een lege alt: alt="" (dan slaat een schermlezer ze over). Laat alt nooit weg.
Breedte, hoogte en formaten
Met width en height (in pixels, zonder eenheid) geef je de afmetingen op. Geef je er maar één op, dan schaalt de andere mee. Vul ze best altijd in: zo weet de browser vooraf hoeveel plaats hij moet vrijhouden en springt je pagina niet rond terwijl de foto laadt.
| Formaat | Gebruik |
|---|---|
| JPG | foto’s (klein bestand, geen doorzichtigheid) |
| PNG | screenshots, logo’s, doorzichtige achtergrond |
| SVG | iconen en logo’s: scherp op elke grootte |
| WebP | modern, kleiner dan JPG en PNG |
| GIF | eenvoudige animaties |
Zet geen foto van 8 MB op je site en laat ze dan door de browser verkleinen. Verklein de afbeelding eerst zelf: een snelle pagina is belangrijk, zeker op gsm.
Figure en figcaption
Een afbeelding met bijschrift hoort in een <figure>, met het bijschrift in <figcaption>. Zo weet de browser dat het bijschrift bij de afbeelding hoort.
<figure>
<img src="img/school.jpg" alt="De hoofdingang van de school">
<figcaption>De school in het najaar van 2025.</figcaption>
</figure> Video en audio
Sinds HTML5 speel je video en audio rechtstreeks af, zonder extra plugins:
<video src="media/intro.mp4" controls width="400"></video>
<audio src="media/geluid.mp3" controls></audio>Het attribuut controls toont de knoppen (afspelen, volume, ...). Zo’n attribuut zonder waarde noemen we een booleaans attribuut: het staat er, of het staat er niet. Andere voorbeelden zijn autoplay, loop en muted.
Browsers laten video met geluid niet automatisch starten. Bezoekers vinden dat ook storend: laat de bezoeker zelf op afspelen klikken.
Andere pagina’s insluiten met iframe
Met <iframe> toon je een andere webpagina binnen je pagina. Zo sluit je bijvoorbeeld een YouTube-video of een Google Maps-kaart in: die sites geven je de juiste code onder “Insluiten” of “Embed”.
<iframe src="https://www.openstreetmap.org/export/embed.html"
width="400" height="300" title="Kaart van de school"></iframe>Geef een iframe altijd een title: schermlezers gebruiken die om te vertellen waarover het gaat.
Verwerk wat je hierboven las met de onderdelen hieronder. Ze horen bij deze theorie.
🧪 Oefeningen — Afbeeldingen en media
Typ je code in het vak en klik op "Controleer". Je code wordt nagekeken op de vereiste onderdelen (waar een Voorbeeld-knop staat, kan je je pagina ook meteen bekijken). Je code wordt bewaard als je aangemeld bent.
Toon de afbeelding https://commons.wikimedia.org/wiki/Special:FilePath/HTML5_logo_and_wordmark.svg met een zinvolle alt-tekst en een width van 200.
<img src="..." alt="..." width="200">
Maak een <figure> met daarin een <img> (met src en alt, mag een eigen pad zoals img/foto.jpg zijn) en een <figcaption> met tekst.
Voeg een <video> toe met src="media/intro.mp4", met bedieningsknoppen (controls) en een width van 400.
🔍 Opzoekwerk — Afbeeldingen en media
Zoek het antwoord zelf op (internet, cursus, ...) en typ het hieronder. Wordt automatisch bewaard.
Tip: zoek naar "how to write good alt text".
✓ opgeslagenTip: zoek naar "image formats for the web".
✓ opgeslagen✅ Testjezelf-quiz — Afbeeldingen en media
Beantwoord alle vragen en klik daarna op "Controleer". Je mag zo vaak opnieuw proberen als je wil.
Gegevens in rijen en kolommen netjes weergeven: lesroosters, prijslijsten, resultaten.
De opbouw van een tabel
Een tabel bouw je rij per rij:
<table>: de hele tabel<tr>(table row): een rij<th>(table header): een kopcel (standaard vet en gecentreerd)<td>(table data): een gewone cel
<table>
<tr>
<th>Vak</th>
<th>Uren</th>
</tr>
<tr>
<td>Web</td>
<td>4</td>
</tr>
<tr>
<td>Netwerken</td>
<td>3</td>
</tr>
</table>Zonder CSS heeft een tabel geen randen. Met CSS voeg je randen en kleuren toe (zie de CSS-cursus). In de voorbeelden hier zetten we tijdelijk een stijl in om de randen te tonen.
Kop, lichaam en voet
Voor een nette, toegankelijke tabel verdeel je de rijen in groepen en geef je de tabel een titel:
<caption>: de titel van de tabel (meteen na<table>)<thead>: de kop<tbody>: de eigenlijke gegevens<tfoot>: de voet (totalen)
<table>
<caption>Uurrooster van maandag</caption>
<thead>
<tr><th>Uur</th><th>Vak</th></tr>
</thead>
<tbody>
<tr><td>8u30</td><td>Web</td></tr>
<tr><td>9u20</td><td>Netwerken</td></tr>
</tbody>
<tfoot>
<tr><td colspan="2">Einde om 16u</td></tr>
</tfoot>
</table> Cellen samenvoegen: colspan en rowspan
Met colspan laat je een cel over meerdere kolommen lopen, met rowspan over meerdere rijen. Tel goed: een rij die één cel met colspan="2" heeft, heeft daarna nog maar (aantal kolommen − 2) cellen nodig.
<tr>
<td colspan="2">Deze cel is twee kolommen breed</td>
</tr>
<tr>
<td rowspan="2">Twee rijen hoog</td>
<td>A</td>
</tr>
<tr>
<td>B</td>
</tr> Wanneer gebruik je een tabel (en wanneer niet)?
Een tabel is voor gegevens die echt in rijen en kolommen horen. Vroeger bouwde men hele websites met tabellen om dingen naast elkaar te zetten. Dat is verouderd en slecht voor toegankelijkheid. Voor de layout gebruik je CSS (Flexbox, Grid, Bootstrap).
- Wel een tabel: rooster, prijslijst, scores, vergelijking van producten.
- Geen tabel: een menu, twee kolommen tekst, een fotogalerij.
Verwerk wat je hierboven las met de onderdelen hieronder. Ze horen bij deze theorie.
🧪 Oefeningen — Tabellen
Typ je code in het vak en klik op "Controleer". Je code wordt nagekeken op de vereiste onderdelen (waar een Voorbeeld-knop staat, kan je je pagina ook meteen bekijken). Je code wordt bewaard als je aangemeld bent.
Maak een tabel met een <caption>, een kop met twee <th> ("Dag" en "Vak") in een <thead>, en in een <tbody> minstens drie rijen met gegevens (<td>).
Maak een tabel van 3 kolommen. De eerste rij heeft één kopcel <th> die over alle drie de kolommen loopt (colspan). De tweede rij heeft drie gewone cellen.
🔍 Opzoekwerk — Tabellen
Zoek het antwoord zelf op (internet, cursus, ...) en typ het hieronder. Wordt automatisch bewaard.
Tip: zoek naar "th scope attribute accessibility".
✓ opgeslagenTip: zoek naar "why not use tables for layout".
✓ opgeslagen✅ Testjezelf-quiz — Tabellen
Beantwoord alle vragen en klik daarna op "Controleer". Je mag zo vaak opnieuw proberen als je wil.
Elementen extra informatie meegeven, en ze een naam of groep geven zodat CSS en JavaScript ze kunnen terugvinden.
Wat is een attribuut?
Een attribuut geeft extra informatie over een element. Je schrijft het altijd in de openingstag, als naam="waarde". Je kent er al een aantal:
<a href="https://www.wikipedia.org" target="_blank">Wikipedia</a>
<img src="foto.jpg" alt="Een foto" width="200">
<html lang="nl">- Gebruik altijd dubbele aanhalingstekens rond de waarde.
- Schrijf attribuutnamen in kleine letters.
- Meerdere attributen scheid je met een spatie; de volgorde maakt niet uit.
- Sommige attributen zijn booleaans: ze hebben geen waarde (
controls,disabled,required).
Globale attributen
Sommige attributen mag je bij elk element gebruiken:
| Attribuut | Betekenis |
|---|---|
id | een unieke naam voor dit ene element |
class | een groepsnaam die meerdere elementen kunnen delen |
title | een tooltip bij het aanwijzen met de muis |
lang | de taal van dit element (bv. en voor een Engels citaat) |
hidden | verbergt het element |
style | inline CSS (liever vermijden, gebruik een stylesheet) |
data-* | eigen gegevens bewaren, bv. data-id="12" |
id: een unieke naam
Met id geef je een element een unieke naam. Er mag op een pagina maar één element met dezelfde id zijn. Waarom heb je dat nodig?
- Om met een link naar dat element te springen (
href="#contact"); - Om er met CSS één specifiek element mee op te maken;
- Om het met JavaScript/jQuery op te zoeken en de waarde ervan te lezen of aan te passen:
$('#naam').val().
<h1 id="paginatitel">Mijn website</h1>
<input type="text" id="naam">
<button type="button" id="verstuur">Verstuur</button>Kies beschrijvende namen zonder spaties en zonder speciale tekens: paginatitel of verstuur-knop, niet Mijn Knop!. Kies één schrijfwijze en hou die vol (bv. kleine letters met streepjes).
class: een groepsnaam
Met class geef je meerdere elementen dezelfde groepsnaam, zodat je ze samen kan opmaken. Een element mag ook meerdere klassen tegelijk hebben, gescheiden door een spatie.
<p class="waarschuwing">Let op: dit is belangrijk.</p>
<p class="waarschuwing">Ook dit is belangrijk.</p>
<p class="waarschuwing groot">Deze is belangrijk én groot.</p>| id | class | |
|---|---|---|
| Hoe vaak per pagina? | maar één keer | zo vaak je wil |
| Meerdere per element? | nee, één id | ja, gescheiden door spaties |
| Typisch gebruik | één specifiek element vinden | een groep elementen opmaken |
div en span: neutrale containers
Soms wil je elementen groeperen of een stukje tekst apart benoemen, zonder dat een bestaand element de juiste betekenis heeft. Daarvoor zijn er twee neutrale elementen:
<div>: een blok (staat op een eigen regel, neemt de volledige breedte), om grotere stukken te groeperen;<span>: een inline-stukje binnen een regel tekst.
<div class="kaart">
<h3>Sam</h3>
<p>Mijn favoriete kleur is <span class="rood">rood</span>.</p>
</div>Elk element is van nature een blokelement (zoals <p>, <h1>, <div>, <ul>) of een inline-element (zoals <a>, <strong>, <span>, <img>). Blokken beginnen op een nieuwe regel, inline-elementen lopen mee met de tekst.
Gebruik <div> enkel als er geen beter element bestaat. In het volgende hoofdstuk leer je de semantische elementen die je vaak in plaats van een div kan gebruiken.
data-attributen
Met data- gevolgd door een eigen naam kan je eigen gegevens aan een element hangen, die niet zichtbaar zijn maar waar JavaScript later aan kan. Handig om bijvoorbeeld het id van een record bij een knop te bewaren.
<button type="button" class="verwijder" data-id="12" data-naam="Sam">Verwijder Sam</button>Met jQuery lees je het uit met $('.verwijder').data('id'). In het PHP-vak gebruik je dit voortdurend om te weten welk bericht of welke gebruiker bij een knop hoort.
Verwerk wat je hierboven las met de onderdelen hieronder. Ze horen bij deze theorie.
🧪 Oefeningen — Attributen, id en class
Typ je code in het vak en klik op "Controleer". Je code wordt nagekeken op de vereiste onderdelen (waar een Voorbeeld-knop staat, kan je je pagina ook meteen bekijken). Je code wordt bewaard als je aangemeld bent.
Maak een invoerveld (<input type="text">) met id="naam" en een knop (<button type="button">) met id="verstuur" en de tekst "Verstuur".
Maak drie alinea’s. De eerste twee krijgen class="tip". De derde krijgt twee klassen: tip en belangrijk. Geef de derde ook een id="laatste".
Bouw een <div class="kaart"> met daarin een <h3> en een alinea. In de alinea staat een woord in een <span class="markering">. Geef de knop <button> onderaan een data-id="7".
🔍 Opzoekwerk — Attributen, id en class
Zoek het antwoord zelf op (internet, cursus, ...) en typ het hieronder. Wordt automatisch bewaard.
Tip: zoek naar "HTML id vs class".
✓ opgeslagenTip: zoek naar "block vs inline elements HTML".
✓ opgeslagen✅ Testjezelf-quiz — Attributen, id en class
Beantwoord alle vragen en klik daarna op "Controleer". Je mag zo vaak opnieuw proberen als je wil.
Elementen die zeggen wat ze zijn: header, nav, main, section, article, aside en footer. Zo bouw je pagina’s die iedereen (en elke machine) begrijpt.
Waarom semantiek?
Met alleen <div>-elementen kan je alles bouwen, maar dan weet niemand wat wat is. Semantisch betekent: het element zegt wat de betekenis van de inhoud is. Dat helpt:
- schermlezers: die kunnen bijvoorbeeld rechtstreeks naar het hoofdgedeelte of het menu springen;
- zoekmachines: die begrijpen beter waar de belangrijke inhoud staat;
- jezelf en je team:
<nav>is duidelijker dan<div class="menu">.
<!-- Zonder semantiek --> <!-- Met semantiek -->
<div class="header"> <header>
<div class="menu"> <nav>
<div class="hoofd"> <main>
<div class="voet"> <footer> De semantische bouwstenen
| Element | Betekenis |
|---|---|
<header> | inleiding van de pagina of van een onderdeel (logo, titel, menu) |
<nav> | een groep navigatielinks |
<main> | de hoofdinhoud van de pagina (één keer per pagina) |
<section> | een thematisch deel met een eigen kop |
<article> | op zichzelf staande inhoud: een nieuwsbericht, blogpost, kaart |
<aside> | bijkomende info naast de hoofdinhoud (zijbalk, tip, reclame) |
<footer> | voet van de pagina of een onderdeel (contact, copyright) |
<address> | contactgegevens |
<time> | een datum of tijdstip: <time datetime="2025-09-01">1 september</time> |
Een volledige pagina
Zo ziet de opbouw van een gewone pagina eruit:
index.html (enkel de body)<body>
<header>
<h1>Mijn website</h1>
<nav>
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="nieuws.html">Nieuws</a></li>
</ul>
</nav>
</header>
<main>
<section>
<h2>Welkom</h2>
<p>Dit is de startpagina.</p>
</section>
<section>
<h2>Nieuws</h2>
<article>
<h3>Open deur</h3>
<p>Op <time datetime="2025-03-15">15 maart</time> houden we een open deur.</p>
</article>
</section>
<aside>
<p>Tip: schrijf je nu in!</p>
</aside>
</main>
<footer>
<p>© 2025 Provil ICW</p>
</footer>
</body>Een pagina heeft een hoofd-header en -footer, maar een <article> kan ook een eigen <header> (titel + datum) en <footer> (auteur) hebben.
section, article of div?
Een goede vuistregel:
- Kan de inhoud op zichzelf staan en zou je ze los kunnen delen (nieuwsbericht, product, reactie)? Dan is het een
<article>. - Is het een thematisch deel van de pagina met een eigen kop? Dan is het een
<section>. - Heb je enkel een container voor de opmaak, zonder eigen betekenis? Dan is het een
<div>.
Geen probleem: een <div> gebruiken is niet verkeerd, zolang er geen passender element bestaat. Semantiek is een hulp, geen wet.
Verwerk wat je hierboven las met de onderdelen hieronder. Ze horen bij deze theorie.
🧪 Oefeningen — Semantische structuur
Typ je code in het vak en klik op "Controleer". Je code wordt nagekeken op de vereiste onderdelen (waar een Voorbeeld-knop staat, kan je je pagina ook meteen bekijken). Je code wordt bewaard als je aangemeld bent.
Bouw de body-inhoud van een pagina met: een <header> met een <h1> en een <nav> (met een lijst van twee links), een <main> met een <section> (met <h2> en <p>) en een <footer> met een alinea.
Schrijf een <article> met een <h2>, een datum in een <time datetime="2025-03-15">, een alinea en een <footer> waarin de auteur staat.
🔍 Opzoekwerk — Semantische structuur
Zoek het antwoord zelf op (internet, cursus, ...) en typ het hieronder. Wordt automatisch bewaard.
Tip: developer.mozilla.org -> <section> en <article>.
✓ opgeslagenTip: zoek naar "ARIA landmarks HTML5 elements".
✓ opgeslagen✅ Testjezelf-quiz — Semantische structuur
Beantwoord alle vragen en klik daarna op "Controleer". Je mag zo vaak opnieuw proberen als je wil.
Tekstvelden, keuzelijsten, vinkjes en knoppen: de bouwstenen waarmee bezoekers gegevens ingeven.
Hoe werken wij met invoervelden?
In oude handleidingen zie je invoervelden altijd in een <form> met een submit-knop, waarbij de pagina herlaadt. Wij doen dat niet meer. Onze invoervelden staan gewoon op de pagina, elk met een id. Met jQuery lees je de waarde ($("#naam").val()) en stuur je ze met AJAX naar de server. Dat leer je in de vakken JavaScript en PHP. Hier leer je enkel de elementen zelf.
Een knop die niets automatisch verstuurt schrijf je daarom altijd als <button type="button">.
Het input-element
Het lege element <input> is een invoerveld. Het type bepaalt wat voor veld je krijgt:
| Type | Veld |
|---|---|
text | gewone tekst (standaard) |
email | e-mailadres (op gsm krijg je het juiste toetsenbord) |
password | tekst die als puntjes getoond wordt |
number | een getal, met pijltjes |
date | een datumkiezer |
checkbox | een vinkje (aan of uit) |
radio | één keuze uit een groep |
range | een schuifbalk |
color | een kleurkiezer |
file | een bestand kiezen |
Label: hoort bij een veld
Bij elk veld hoort een label: de tekst die zegt wat je moet invullen. Koppel het aan het veld met for (dat verwijst naar de id van het veld).
<label for="naam">Jouw naam</label>
<input type="text" id="naam">Het voordeel: klik je op het label, dan krijgt het veld meteen de focus (bij vinkjes wordt het aan- of uitgevinkt). En schermlezers weten bij welk veld de tekst hoort.
Een placeholder is grijze hulptekst die verdwijnt zodra je typt. Gebruik hem als extra voorbeeld, maar nooit in plaats van een label.
Vinkjes en keuzerondjes
Checkboxes laten je meerdere dingen aan- of uitvinken. Radio-knoppen laten je maar één optie uit een groep kiezen; ze horen bij dezelfde groep als ze dezelfde name hebben.
<p>Welke talen ken je?</p>
<input type="checkbox" id="html" value="html"> <label for="html">HTML</label>
<input type="checkbox" id="css" value="css" checked> <label for="css">CSS</label>
<p>Jouw klas?</p>
<input type="radio" id="k5" name="klas" value="5ICW"> <label for="k5">5ICW</label>
<input type="radio" id="k6" name="klas" value="6ICW"> <label for="k6">6ICW</label>Het attribuut checked vinkt een optie vooraf aan. Met jQuery lees je later of een vinkje aan staat met $('#css').is(':checked').
Meer regels: textarea en select
Voor meerdere regels tekst gebruik je <textarea> (met sluittag; de begintekst staat ertussen). Voor een keuzelijst gebruik je <select> met daarin een <option> per keuze.
<label for="bericht">Bericht</label>
<textarea id="bericht" rows="4" cols="40"></textarea>
<label for="vak">Favoriet vak</label>
<select id="vak">
<option value="">-- kies --</option>
<option value="web">Web</option>
<option value="net">Netwerken</option>
<option value="prog" selected>Programmeren</option>
</select>Wat de bezoeker ziet staat tussen de option-tags, wat je met jQuery uitleest (.val()) is het value-attribuut.
Handige attributen
| Attribuut | Wat het doet |
|---|---|
placeholder | grijze hulptekst in een leeg veld |
value | de beginwaarde |
required | het veld is verplicht |
disabled | het veld is uitgeschakeld |
readonly | je kan de waarde zien maar niet wijzigen |
maxlength | maximaal aantal tekens |
min / max | grenzen voor getallen en data |
autofocus | cursor staat er meteen in |
Attributen zoals required en maxlength helpen de bezoeker, maar een kwaadwillende kan ze omzeilen. De echte controle gebeurt altijd ook in PHP (zie de PHP-cursus).
Verwerk wat je hierboven las met de onderdelen hieronder. Ze horen bij deze theorie.
🧪 Oefeningen — Invoervelden en knoppen
Typ je code in het vak en klik op "Controleer". Je code wordt nagekeken op de vereiste onderdelen (waar een Voorbeeld-knop staat, kan je je pagina ook meteen bekijken). Je code wordt bewaard als je aangemeld bent.
Maak een veld voor een e-mailadres: een <label> met de tekst "E-mail" dat via for gekoppeld is aan een <input type="email"> met id="email", een placeholder en het attribuut required.
Maak: (1) twee radio-knoppen met dezelfde name="klas" (values 5ICW en 6ICW), elk met een label; (2) een checkbox met id="nieuwsbrief" en een label; (3) een <select id="vak"> met minstens drie <option> met een value.
Maak een <textarea id="bericht"> van 4 rijen (rows) met een maxlength van 200, en een knop <button type="button" id="verstuur"> met de tekst "Verstuur". Gebruik geen <form>.
🔍 Opzoekwerk — Invoervelden en knoppen
Zoek het antwoord zelf op (internet, cursus, ...) en typ het hieronder. Wordt automatisch bewaard.
Tip: developer.mozilla.org -> <input>.
✓ opgeslagenTip: zoek naar "form submit vs AJAX page reload".
✓ opgeslagen✅ Testjezelf-quiz — Invoervelden en knoppen
Beantwoord alle vragen en klik daarna op "Controleer". Je mag zo vaak opnieuw proberen als je wil.
HTML is de structuur. Om je pagina mooi en interactief te maken koppel je er CSS en JavaScript aan. Hier leer je hoe, en hoe je je bestanden ordent.
Drie talen, drie bestanden
Een nette website scheidt haar taken: HTML voor de inhoud, CSS voor het uitzicht en JavaScript voor het gedrag. Elk in een eigen bestand, zodat je alles makkelijk kan terugvinden en hergebruiken op meerdere pagina’s.
Een nette mapstructuurmijn-website/
├── index.html
├── css/
│ └── stijl.css
├── js/
│ └── app.js
└── img/
└── logo.png CSS koppelen
Een extern CSS-bestand koppel je in de head met het element <link>:
<head>
<meta charset="utf-8">
<title>Mijn pagina</title>
<link rel="stylesheet" href="css/stijl.css">
</head>Het bestand zelf bevat enkel CSS, bijvoorbeeld:
css/stijl.cssh1 {
color: #1d4ed8;
}
.waarschuwing {
background: #fef3c7;
}Voor een klein testje kan je CSS ook rechtstreeks in de pagina zetten met <style> in de head, of bij één element met het style-attribuut. Dat noemen we inline. Voor echte projecten gebruik je altijd een extern bestand.
Dat is waar de id en de class uit het vorige hoofdstuk voor dienen: in CSS schrijf je #paginatitel { … } voor een id en .waarschuwing { … } voor een klasse. Alles over CSS leer je in de CSS-cursus.
JavaScript koppelen
JavaScript voeg je toe met het element <script>. Zet het onderaan de body, vlak vóór </body>: dan bestaat alle HTML al wanneer je script ze zoekt.
index.html<body>
<h1>Mijn pagina</h1>
<button type="button" id="knop">Klik mij</button>
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script src="js/app.js"></script>
</body>- Eerst laad je jQuery (via een CDN, een server die de bibliotheek voor je host), pas daarna je eigen script dat jQuery gebruikt: de volgorde telt!
- Je eigen script zet je in een apart bestand (
js/app.js) dat je metsrcinlaadt. - Een
<script>heeft altijd een sluittag, ook metsrc.
js/app.js$('#knop').on('click', function () {
alert('Je klikte op de knop!');
}); Het volledige plaatje
Dit is een complete pagina met alle drie de talen gekoppeld:
index.html<!DOCTYPE html>
<html lang="nl">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Mijn pagina</title>
<link rel="stylesheet" href="css/stijl.css">
</head>
<body>
<h1 id="titel">Mijn pagina</h1>
<button type="button" id="knop">Klik mij</button>
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script src="js/app.js"></script>
</body>
</html>Ook een bibliotheek zoals Bootstrap koppel je zo: een <link> voor de CSS in de head en een <script> voor de JavaScript onderaan de body, meestal via een CDN. Je leert dat in de Bootstrap-cursus.
Verwerk wat je hierboven las met de onderdelen hieronder. Ze horen bij deze theorie.
🧪 Oefeningen — HTML koppelen aan CSS en JavaScript
Typ je code in het vak en klik op "Controleer". Je code wordt nagekeken op de vereiste onderdelen (waar een Voorbeeld-knop staat, kan je je pagina ook meteen bekijken). Je code wordt bewaard als je aangemeld bent.
Schrijf een volledige pagina (met doctype, html, head en body). Koppel in de head het stylesheet css/stijl.css met <link> en zet in de body een <h1 id="titel"> met tekst.
De link hoort in de head: <link rel="stylesheet" href="css/stijl.css">
Vul de onderkant van de body aan: laad eerst jQuery (https://code.jquery.com/jquery-3.7.1.min.js) en daarna je eigen script js/app.js, beide met <script src="…">. Er staat al een knop.
Maak een knop met id="knop", een alinea met id="uitvoer" en laad jQuery. Schrijf daarna in een <script>: bij een klik (.on('click', …)) op de knop verandert de tekst van #uitvoer naar "Hallo!" (met .text()). Test met Voorbeeld!
🔍 Opzoekwerk — HTML koppelen aan CSS en JavaScript
Zoek het antwoord zelf op (internet, cursus, ...) en typ het hieronder. Wordt automatisch bewaard.
Tip: zoek naar "what is a CDN".
✓ opgeslagenTip: zoek naar "script defer async difference".
✓ opgeslagen✅ Testjezelf-quiz — HTML koppelen aan CSS en JavaScript
Beantwoord alle vragen en klik daarna op "Controleer". Je mag zo vaak opnieuw proberen als je wil.
Een goede website is er voor iedereen: ook voor blinde bezoekers, mensen zonder muis, trage gsm’s en zoekmachines.
Waarom toegankelijkheid?
Ruim één op de vijf mensen heeft een vorm van beperking: slechter zicht, gehoor, motoriek, kleurenblindheid, ... Sommigen gebruiken een schermlezer die de pagina voorleest, anderen bedienen alles met het toetsenbord. Ook tijdelijke situaties tellen: een gebroken arm, fel zonlicht op je gsm, een trage verbinding.
Het goede nieuws: als je HTML netjes schrijft, zoals je in deze cursus leert, ben je al ver. Toegankelijke sites zijn bovendien ook beter voor zoekmachines zoals Google.
Voor overheidssites en steeds meer bedrijven is toegankelijkheid wettelijk verplicht (Europese richtlijn). De internationale richtlijnen heten WCAG.
De basischecklist
- Taal instellen:
<html lang="nl">. Een schermlezer weet dan hoe hij moet uitspreken. - Een duidelijke title: elke pagina een eigen, beschrijvende titel.
- Alt-tekst bij elke afbeelding: beschrijvend, of
alt=""voor pure decoratie. - Logische kopstructuur: één h1, geen niveaus overslaan.
- Labels bij alle invoervelden (met
forenid). - Betekenisvolle linkteksten: niet “klik hier”, maar “Download het rooster”. Schermlezers lezen vaak enkel de lijst van links voor.
- Semantische elementen: nav, main, footer, button, ... in plaats van alles div.
- Voldoende contrast tussen tekst en achtergrond (CSS).
- Bedienbaar met toetsenbord: probeer je site eens enkel met Tab en Enter.
Een link is een link, een knop is een knop
Gebruik voor wat iets doet een <button> en voor wat je naar een andere pagina brengt een <a>. Een <div> met een klik-gedrag is voor een toetsenbordgebruiker of schermlezer niet bruikbaar: hij is niet focusseerbaar en niemand weet dat je erop kan klikken.
<!-- Slecht: een div als knop -->
<div class="knop" id="verstuur">Verstuur</div>
<!-- Goed -->
<button type="button" id="verstuur">Verstuur</button> ARIA: een woordje extra
Soms is HTML alleen niet genoeg. Met ARIA-attributen geef je extra uitleg aan hulpprogramma’s. Het belangrijkste dat je nu al mag kennen is aria-label: een naam voor een element waar geen zichtbare tekst bij staat.
<button type="button" id="sluit" aria-label="Sluit het venster">✖</button>
<nav aria-label="Hoofdmenu">...</nav>Kan je het met een gewoon HTML-element (button, nav, label) oplossen? Doe dat dan. ARIA is enkel een aanvulling.
Zoekmachines en gsm: meta-tags
In de head staan ook gegevens voor zoekmachines en voor gsm’s:
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Het portfolio van Sam, leerling 5ICW: webprojecten en hobby’s.">
<title>Portfolio van Sam | Provil ICW</title>
<link rel="icon" href="img/favicon.png">
</head>| Tag | Doel |
|---|---|
viewport | Onmisbaar voor gsm’s: zonder deze regel toont een gsm je pagina als een uitgezoomde desktopsite. |
description | de korte beschrijving onder je titel in de Google-resultaten (±150 tekens) |
<title> | de blauwe titel in de Google-resultaten: uniek per pagina |
rel="icon" | het icoontje in het tabblad (favicon) |
Verwerk wat je hierboven las met de onderdelen hieronder. Ze horen bij deze theorie.
🧪 Oefeningen — Toegankelijkheid en zoekmachines
Typ je code in het vak en klik op "Controleer". Je code wordt nagekeken op de vereiste onderdelen (waar een Voorbeeld-knop staat, kan je je pagina ook meteen bekijken). Je code wordt bewaard als je aangemeld bent.
Schrijf de <head> van een pagina over een sportclub: met <meta charset> (utf-8), de viewport-meta (width=device-width, initial-scale=1), een description-meta met tekst, een <title> met tekst en een favicon (rel="icon", href img/favicon.png).
<meta name="viewport" content="width=device-width, initial-scale=1">
Deze pagina heeft zes toegankelijkheidsfouten. Herstel ze: (1) geef <html> een lang="nl"; (2) geef de <title> tekst; (3) geef de afbeelding een alt-tekst; (4) geef het invoerveld een id en een gekoppeld <label for>; (5) vervang de <h4> door een <h2> (geen niveau overslaan); (6) vervang de linktekst "klik hier" door een beschrijvende tekst.
🔍 Opzoekwerk — Toegankelijkheid en zoekmachines
Zoek het antwoord zelf op (internet, cursus, ...) en typ het hieronder. Wordt automatisch bewaard.
Tip: zoek naar "screen reader demo website".
✓ opgeslagenTip: zoek naar "WebAIM contrast checker".
✓ opgeslagen✅ Testjezelf-quiz — Toegankelijkheid en zoekmachines
Beantwoord alle vragen en klik daarna op "Controleer". Je mag zo vaak opnieuw proberen als je wil.
Elke ontwikkelaar maakt fouten. De kunst is ze snel te vinden: met de ontwikkelaarstools van je browser en de validator.
Browsers zijn vergevingsgezind
HTML is bijzonder tolerant: vergeet je een sluittag, dan probeert de browser te raden wat je bedoelde en toont hij toch iets. Dat klinkt handig, maar het betekent dat een pagina er bij jou goed kan uitzien en er in een andere browser anders uitziet. Fouten maken je site dus onvoorspelbaar.
In tegenstelling tot PHP of JavaScript krijg je bij foute HTML meestal geen melding. Je moet zelf leren de fouten te zien: daarom controleren we onze code met tools.
De meestgemaakte fouten
| Fout | Voorbeeld |
|---|---|
| Sluittag vergeten | <p>Tekst (zonder </p>) |
| Verkeerd genest | <strong><em>tekst</strong></em> |
| Aanhalingsteken vergeten | <a href="index.html>Home</a> |
| Foute bestandsnaam of pad | <img src="Foto.JPG"> terwijl het bestand foto.jpg heet |
| Tekst rechtstreeks in een lijst | <ul><p>Hoi</p></ul> |
| Twee keer dezelfde id | <p id="a">…</p><p id="a">…</p> |
| Attribuut in de sluittag | </a href="…"> |
| Vergeten te bewaren | je wijzigt de code maar vergeet Ctrl+S en ververst niet |
De ontwikkelaarstools van je browser
Druk op F12 (of rechtsklik → Inspecteren) en de DevTools openen. Drie tabbladen gebruik je meteen:
- Elements (Elementen): toont de HTML zoals de browser ze begrepen heeft, inclusief eventuele automatische reparaties. Beweeg over een regel en het element licht op in de pagina. Je kan tekst en attributen zelfs live aanpassen om iets te testen (niet bewaard).
- Console: toont fouten van JavaScript en meldingen zoals “Failed to load resource” als een afbeelding of bestand niet gevonden wordt.
- Het tabblad Network (Netwerk) toont alle bestanden die geladen worden en met welke status:
200is goed,404betekent “bestand niet gevonden” (klopt je pad wel?).
Open Network, ververs de pagina en zoek de afbeelding. Staat er 404? Dan klopt de bestandsnaam of het pad niet, of het bestand staat in een andere map.
De W3C-validator
Op validator.w3.org kan je je HTML laten controleren. Je plakt je code (of geeft een webadres), klikt op Check en krijgt een lijst met fouten (errors) en waarschuwingen (warnings), telkens met het regelnummer.
- Begin altijd bij de eerste fout: één vergeten sluittag veroorzaakt vaak tien vervolgfouten.
- Los een fout op, controleer opnieuw, en herhaal.
Je code-editor helpt je ook: de kleuren van je code veranderen plots als er iets fout gaat, en met Shift+Alt+F (of rechtsklik → Format Document) zet hij alles netjes in met de juiste inspringing, zodat een ontbrekende sluittag meteen opvalt.
Zo zoek je een fout
- Lees de pagina: wat zie je, en wat had je verwacht?
- Ververs (F5) en controleer of je wel bewaard hebt.
- Open DevTools → Elements en bekijk hoe de browser jouw HTML begrepen heeft. Zit het element waar je het verwacht?
- Kijk naar de Console en Network voor rode meldingen en 404’s.
- Valideer je code en los de eerste fout op.
- Maak het kleiner: haal stukken code weg tot de fout verdwijnt. Dan weet je waar hij zit.
Tip: probeer eens de code hieronder te repareren en kijk wat er in de browser gebeurt met de fouten.
Verwerk wat je hierboven las met de onderdelen hieronder. Ze horen bij deze theorie.
🧪 Oefeningen — Fouten zoeken en valideren
Typ je code in het vak en klik op "Controleer". Je code wordt nagekeken op de vereiste onderdelen (waar een Voorbeeld-knop staat, kan je je pagina ook meteen bekijken). Je code wordt bewaard als je aangemeld bent.
Deze pagina bevat zes fouten. Vind en herstel ze: (1) <head> wordt niet afgesloten; (2) de <h1> wordt niet afgesloten; (3) <strong> en <em> zijn verkeerd genest; (4) de alinea wordt niet afgesloten; (5) de eerste <li> wordt niet afgesloten; (6) de aanhalingstekens bij src, alt en href ontbreken of zijn niet gesloten.
Deze lijst is fout opgebouwd: een <p> mag niet rechtstreeks in een <ul> staan en het laatste item is niet afgesloten. Zorg dat de <ul> enkel volledige <li>-elementen bevat. De tekst "Fruit" moet blijven bestaan, bijvoorbeeld als kopje boven de lijst.
🔍 Opzoekwerk — Fouten zoeken en valideren
Zoek het antwoord zelf op (internet, cursus, ...) en typ het hieronder. Wordt automatisch bewaard.
Tip: validator.w3.org -> "Validate by Direct Input".
✓ opgeslagenTip: F12 -> Elements -> dubbelklik op tekst.
✓ opgeslagen✅ Testjezelf-quiz — Fouten zoeken en valideren
Beantwoord alle vragen en klik daarna op "Controleer". Je mag zo vaak opnieuw proberen als je wil.
Tijd om alles samen te brengen: je bouwt een volledige, toegankelijke portfolio-pagina van nul tot af.
De opdracht
Je maakt een persoonlijke portfolio-pagina: een pagina die jezelf voorstelt. Je gebruikt alles wat je geleerd hebt. De pagina bevat:
- een volledig skelet met doctype, lang, charset, viewport, description en title;
- een header met je naam (h1) en een menu (nav met ul en drie links die naar onderdelen op dezelfde pagina springen);
- een main met vier sections: Over mij (tekst en foto met alt en figcaption), Mijn vaardigheden (een lijst), Mijn rooster (een tabel) en Contact (label, invoerveld en knop, zonder form);
- een footer met een mail-link.
Plan eerst, bouw daarna
Een goede ontwikkelaar begint niet meteen te typen. Maak eerst een schets van de structuur (op papier of in je hoofd) en bouw daarna stap voor stap:
Structuur van het eindprojectPortfolio
├── header (h1 + nav)
├── main
│ ├── section#over-mij (h2, p, figure)
│ ├── section#vaardigheden (h2, ul)
│ ├── section#rooster (h2, table)
│ └── section#contact (h2, label + input + button)
└── footer (p + mailto-link)- Schrijf het skelet (doctype tot body).
- Zet de grote blokken neer: header, main, footer.
- Vul één section per keer in en bekijk telkens het voorbeeld.
- Controleer je pagina op toegankelijkheid (alt, label, kopvolgorde).
- Valideer ze op validator.w3.org.
Een mogelijke uitwerking
Probeer eerst zelf! Kom je er niet uit, kijk dan hoe het kan (dit is de oplossing van de oefening hieronder):
index.html<!DOCTYPE html>
<html lang="nl">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Portfolio van Sam Peeters, leerling 5ICW.">
<title>Portfolio van Sam Peeters</title>
</head>
<body>
<header>
<h1>Sam Peeters</h1>
<nav>
<ul>
<li><a href="#over-mij">Over mij</a></li>
<li><a href="#vaardigheden">Vaardigheden</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
</nav>
</header>
<main>
<section id="over-mij">
<h2>Over mij</h2>
<p>Ik ben Sam en ik leer websites bouwen.</p>
<figure>
<img src="img/sam.jpg" alt="Sam achter zijn laptop" width="240">
<figcaption>Aan het werk in de klas.</figcaption>
</figure>
</section>
<section id="vaardigheden">
<h2>Mijn vaardigheden</h2>
<ul>
<li>HTML</li>
<li>CSS</li>
<li>JavaScript</li>
</ul>
</section>
<section id="rooster">
<h2>Mijn rooster</h2>
<table>
<caption>Vakken op maandag</caption>
<thead>
<tr><th>Uur</th><th>Vak</th></tr>
</thead>
<tbody>
<tr><td>8u30</td><td>Web</td></tr>
<tr><td>10u20</td><td>Netwerken</td></tr>
</tbody>
</table>
</section>
<section id="contact">
<h2>Contact</h2>
<label for="bericht">Jouw bericht</label>
<textarea id="bericht" rows="3"></textarea>
<button type="button" id="verstuur">Verstuur</button>
</section>
</main>
<footer>
<p>© 2025 Sam Peeters | <a href="mailto:sam@school.be">sam@school.be</a></p>
</footer>
</body>
</html> Hoe nu verder?
Je pagina is bijna klaar voor het echte werk, maar ziet er nog erg sober uit. Dat is normaal: HTML is de structuur. De volgende stappen:
- CSS: kleuren, lettertypes, marges, layout met Flexbox en Grid;
- Bootstrap: een kant-en-klaar raamwerk voor een responsieve layout;
- JavaScript en jQuery: je pagina reageert op klikken en typen;
- PHP en MySQL: gegevens bewaren en tonen, zodat je berichtenveld echt werkt.
Je bewaarde pagina is meteen het vertrekpunt voor elk van die cursussen. Veel succes en vooral: blijf oefenen!
Verwerk wat je hierboven las met de onderdelen hieronder. Ze horen bij deze theorie.
🧪 Oefeningen — Eindproject: een portfolio-pagina
Typ je code in het vak en klik op "Controleer". Je code wordt nagekeken op de vereiste onderdelen (waar een Voorbeeld-knop staat, kan je je pagina ook meteen bekijken). Je code wordt bewaard als je aangemeld bent.
Bouw de volledige pagina zoals beschreven in De opdracht. Gebruik de ids over-mij, vaardigheden, rooster en contact voor de secties en laat het menu daarheen springen. Gebruik Voorbeeld om bij te sturen; klik op Controleer om te zien wat er nog ontbreekt.
🔍 Opzoekwerk — Eindproject: een portfolio-pagina
Zoek het antwoord zelf op (internet, cursus, ...) en typ het hieronder. Wordt automatisch bewaard.
Tip: zoek naar "publish static website free GitHub Pages".
✓ opgeslagenTip: zoek naar "developer portfolio examples".
✓ opgeslagen✅ Testjezelf-quiz — Eindproject: een portfolio-pagina
Beantwoord alle vragen en klik daarna op "Controleer". Je mag zo vaak opnieuw proberen als je wil.
⚠️ Je verliet deze pagina
Je wisselde van tabblad (of verliet de pagina) terwijl je bezig was met een oefening, opdracht of zelftest. Dit werd geregistreerd als het verlaten van de oefening en kan als vals spelen bestempeld worden.