Beetje Coderen

Les 4

Lijsten en tabellen

Opsommingen en tabellen voor gestructureerde gegevens.

⏱ 45–60 minuten leestijd + oefenen

🎯 Na deze les kun je

  • geordende en ongeordende lijsten maken
  • een tabel met kop en bijschrift opbouwen
  • weten wanneer een tabel wel en niet past

In de vorige les stonden de ingrediënten van de appeltaart in één lange alinea. Dat leest slecht. Gegevens die bij elkaar horen, zet je in een lijst; gegevens met rijen en kolommen in een tabel. In deze les leer je allebei, en ook wanneer je een tabel juist níet gebruikt.

Ongeordende lijsten

Een lijst waarbij de volgorde niet uitmaakt, is een unordered list:

<h2>Ingrediënten</h2>
<ul>
  <li>300 g bloem</li>
  <li>200 g boter</li>
  <li>150 g suiker</li>
  <li>1 ei</li>
</ul>

<ul> is de lijst, elke <li> (list item) een punt. De browser zet er bolletjes voor.

Geordende lijsten

Telt de volgorde wel, zoals bij stappen, gebruik dan een ordered list:

<ol>
  <li>Verwarm de oven voor op 175 °C.</li>
  <li>Kneed het deeg.</li>
  <li>Bekleed de springvorm.</li>
</ol>

De browser nummert zelf. Voeg je een stap toe, dan schuiven de nummers vanzelf op. Met attributen pas je de nummering aan: <ol start="4"> begint bij 4, <ol reversed> telt af, <ol type="a"> gebruikt letters.

Geneste lijsten

Een lijst mag in een <li> staan:

<ul>
  <li>Voor het deeg
    <ul>
      <li>300 g bloem</li>
      <li>200 g boter</li>
    </ul>
  </li>
  <li>Voor de vulling
    <ul>
      <li>1 kg appels</li>
      <li>2 tl kaneel</li>
    </ul>
  </li>
</ul>

Let op: de binnenste <ul> staat binnen de <li>, vóór de </li>.

In een <ul> of <ol> mogen alleen <li>-elementen direct staan. <ul><p>Tekst</p></ul> is ongeldig. Zet de tekst in een <li>, of buiten de lijst.

Definitielijsten

Voor begrippen met een uitleg is er <dl> (description list):

<dl>
  <dt>Springvorm</dt>
  <dd>Bakvorm met een losse bodem en een rand die je kunt openen.</dd>
  <dt>Blind bakken</dt>
  <dd>De bodem voorbakken zonder vulling.</dd>
</dl>

Tabellen

Een tabel gebruik je voor gegevens die in rijen en kolommen horen: een rooster, een prijslijst, uitslagen.

<table>
  <caption>Lesrooster klas 1B, week 42</caption>
  <thead>
    <tr>
      <th scope="col">Tijd</th>
      <th scope="col">Maandag</th>
      <th scope="col">Dinsdag</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th scope="row">08:30</th>
      <td>Programmeren</td>
      <td>Databases</td>
    </tr>
    <tr>
      <th scope="row">10:15</th>
      <td>Engels</td>
      <td>Webdesign</td>
    </tr>
  </tbody>
</table>
Element Betekenis
<table> de tabel
<caption> titel van de tabel, direct na <table>
<thead> / <tbody> / <tfoot> kop, inhoud, voet
<tr> table row: een rij
<th> table header: een kopcel
<td> table data: een gewone cel

th en scope

Een schermlezer leest bij elke cel de bijbehorende koppen voor: "Dinsdag, 10:15, Webdesign". Daarvoor moet hij weten welke cel een kop is (<th>) en of die kop voor een kolom of een rij geldt (scope="col" of scope="row"). Bij een eenvoudige tabel raadt de browser het meestal goed, maar met scope weet je het zeker.

Cellen samenvoegen

Een cel kan over meerdere kolommen of rijen lopen:

<tr>
  <th scope="row">12:00</th>
  <td colspan="2">Pauze</td>
</tr>

colspan="2" laat de cel over twee kolommen lopen; rowspan doet hetzelfde over rijen. Gebruik het met mate; ingewikkelde tabellen zijn lastig te volgen, vooral met een schermlezer.

Wanneer géén tabel

Vroeger bouwden webmakers hele pagina's met tabellen, om dingen naast elkaar te krijgen. Dat doe je niet meer:

  • Een schermlezer kondigt elke tabel aan als "tabel met 3 kolommen" en leest cel voor cel. Voor een layout is dat verwarrend.
  • Op een smal scherm kan een tabel niet netjes onder elkaar vallen.

Voor layout gebruik je CSS (flexbox en grid, les 10 en 11). Een vuistregel: heeft het kolomkoppen die zinvol zijn? Dan is het een tabel. Zo niet, dan niet.

Uitgewerkt voorbeeld: prijslijst

Voorspel voordat je de code leest: moet dit een lijst of een tabel zijn?

Koffie € 2,80 · Thee € 2,40 · Croissant € 1,95 — met per product ook het aantal calorieën.

Antwoord: een tabel, want er zijn kolommen met een betekenis (product, prijs, calorieën).

<table>
  <caption>Prijslijst lunchroom</caption>
  <thead>
    <tr>
      <th scope="col">Product</th>
      <th scope="col">Prijs</th>
      <th scope="col">kcal</th>
    </tr>
  </thead>
  <tbody>
    <tr><th scope="row">Koffie</th><td>€ 2,80</td><td>5</td></tr>
    <tr><th scope="row">Thee</th><td>€ 2,40</td><td>2</td></tr>
    <tr><th scope="row">Croissant</th><td>€ 1,95</td><td>230</td></tr>
  </tbody>
</table>

Zonder calorieën, met alleen product en prijs, kan het ook een lijst zijn. Beide zijn goed; kies wat het duidelijkst is.

De tabel heeft nog geen randen. Die voeg je later met CSS toe.

Typische fouten

Symptoom Oorzaak
Tekst staat boven de tabel in plaats van erin Tekst direct in <tr> of <table> gezet; alles moet in <td> of <th>.
Kolommen verspringen Rijen hebben een verschillend aantal cellen (tel colspan mee).
Validator: Element p not allowed as child of element ul Iets anders dan <li> direct in een lijst.

Oefeningen

Oefening 1. Maak een geordende lijst met de stappen om thee te zetten, en een ongeordende lijst met wat je nodig hebt.

Modelantwoord oefening 1
<h2>Nodig</h2>
<ul>
  <li>Waterkoker</li>
  <li>Theezakje</li>
  <li>Mok</li>
</ul>
<h2>Stappen</h2>
<ol>
  <li>Kook water.</li>
  <li>Hang het theezakje in de mok.</li>
  <li>Giet het water erop en wacht 3 minuten.</li>
</ol>

Oefening 2. Lijst of tabel? (a) De navigatie van een site. (b) Uitslagen van een voetbalcompetitie met gespeeld, gewonnen, punten. (c) Een recept met de stappen.

Modelantwoord oefening 2

(a) Lijst (<ul> met links; les 5 en 10). (b) Tabel: rijen en betekenisvolle kolommen. (c) Geordende lijst.

Oefening 3. Voeg aan de prijslijst een <tfoot> toe met de tekst Alle prijzen zijn inclusief btw over de volle breedte.

Modelantwoord oefening 3
<tfoot>
  <tr><td colspan="3">Alle prijzen zijn inclusief btw.</td></tr>
</tfoot>

<tfoot> staat na <tbody> in de code.

Lab: lesrooster als tabel

  1. Maak rooster.html met je eigen lesrooster van één week als tabel.
  2. Gebruik caption, thead en tbody, en th met scope="col" voor de dagen en scope="row" voor de tijden.
  3. Voeg een pauze toe met colspan over alle dagen.
  4. Zet onder de tabel een ongeordende lijst met je vakken.
  5. beetje check html-css-les4

Samenvatting

  • <ul> als volgorde niet uitmaakt, <ol> als dat wel zo is; elk punt een <li>.
  • <dl> met <dt> en <dd> voor begrippen en uitleg.
  • Tabellen alleen voor gegevens in rijen en kolommen: caption, thead, tbody, th met scope.
  • Nooit tabellen voor layout.

Volgende les: semantische HTML, de structuur van een hele pagina.

Lab

Lesrooster als tabel

Dit lab doe je helemaal in je browser; er wordt niets op een server uitgevoerd.

Klaar? Controleer je werk met:

$ beetje check html-css-les4

📝 Quiz: lijsten en tabellen

5 vragen · 70% nodig om te slagen

1. Welke lijst gebruik je voor de stappen van een recept?
2. Wat mag er direct in een <ul> staan?
3. Wat doet scope="col" op een <th>?
4. Wanneer gebruik je géén tabel?
5. Wat doet colspan="2"?