Les 4: Formulieren
Home HTML-track Les 4

📝 Formulieren

⏱ Geschatte leestijd: 25 minuten · 7 stappen

Formulieren zijn de manier waarop gebruikers gegevens naar een server sturen: inloggen, registreren, een bestelling plaatsen. In de Symfony-track leer je hoe de server die gegevens verwerkt — maar eerst moet je de HTML-kant begrijpen.

1 De <form>-tag

Wat betekent dit?

<form> is de container voor alle formulierelementen. Het heeft twee belangrijke attributen:
action — het adres (URL) waar de gegevens naartoe worden gestuurd.
method — hoe ze worden gestuurd: get (gegevens zichtbaar in de URL) of post (gegevens onzichtbaar, voor wachtwoorden en gevoelige data).

Basisstructuur van een formulier
<form action="/verstuur" method="post">
  <!-- Hier komen de velden -->
  <button type="submit">Versturen</button>
</form>

💡 GET vs POST: gebruik method="get" voor zoekopdrachten (de zoekterm in de URL is handig om te delen). Gebruik method="post" voor alles met wachtwoorden of persoonlijke gegevens.

2 Tekstvelden: <input> en <label>

Wat betekent dit?

<input> is een zelf-sluitende tag voor een invoerveld. Het type-attribuut bepaalt het soort veld. Het name-attribuut is de naam waarmee de server het veld herkent — dit is verplicht als je de waarde wil ontvangen.

<label for="id"> koppelt een tekstetiket aan een veld. Klik je op de label, dan springt de cursor naar het veld. Altijd gebruiken voor toegankelijkheid.

Input met label
<label for="naam">Jouw naam:</label>
<input type="text" id="naam" name="naam" placeholder="bijv. Sara">

<label for="email">E-mailadres:</label>
<input type="email" id="email" name="email" required>

<label for="leeftijd">Leeftijd:</label>
<input type="number" id="leeftijd" name="leeftijd" min="1" max="120">

Wat betekent dit?

placeholder — grijze hint-tekst die verdwijnt zodra de gebruiker begint te typen.

Wat betekent dit?

required — het formulier kan niet verzonden worden als dit veld leeg is. De browser toont automatisch een foutmelding.

3 Meer input-types

Het type-attribuut bepaalt hoe het veld eruit ziet én hoe de browser het valideert. Op mobiel toont de browser ook een aangepast toetsenbord.

Veelgebruikte input-types
<!-- Wachtwoordveld: tekens verborgen -->
<input type="password" name="wachtwoord">

<!-- Checkbox: aan/uit -->
<input type="checkbox" id="akkoord" name="akkoord">
<label for="akkoord">Ik ga akkoord met de voorwaarden</label>

<!-- Radio buttons: één keuze uit meerdere -->
<input type="radio" id="man" name="geslacht" value="man">
<label for="man">Man</label>
<input type="radio" id="vrouw" name="geslacht" value="vrouw">
<label for="vrouw">Vrouw</label>

<!-- Datum -->
<input type="date" name="geboortedatum">

<!-- Verborgen waarde (voor de server, niet zichtbaar) -->
<input type="hidden" name="token" value="abc123">

💡 Radio buttons: geef alle opties in een groep dezelfde name. Dan weet de browser dat de gebruiker er maar één kan kiezen. Het value-attribuut is wat de server ontvangt als die optie is geselecteerd.

4 Meerdere regels en keuzelijsten

Wat betekent dit?

<textarea> is een invoerveld voor meerdere regels tekst. Gebruik het voor berichten of beschrijvingen. Het heeft een openings- en sluitingstag.

<label for="bericht">Bericht:</label>
<textarea id="bericht" name="bericht"
  rows="4" cols="40"
  placeholder="Typ hier...">
</textarea>

Wat betekent dit?

<select> toont een uitklapmenu. Elke optie staat in een <option>-tag. Het value-attribuut is wat de server ontvangt.

<label for="vak">Vak:</label>
<select id="vak" name="vak">
  <option value="">Kies...</option>
  <option value="html">HTML</option>
  <option value="css">CSS</option>
  <option value="js">JavaScript</option>
</select>

5 Oefening 1: Inlogformulier

Opdracht:

Maak een inlogformulier. Het formulier moet een e-mailveld, een wachtwoordveld en een submit-knop bevatten. Koppel elke input aan een label.

<form> met method="post"

<input type="email"> met bijbehorende <label>

<input type="password"> met bijbehorende <label>

<button type="submit">

editor
Live preview

6 Oefening 2: Contactformulier

Opdracht:

Maak een contactformulier met een naamveld, e-mailveld, een <select> voor onderwerp en een <textarea> voor het bericht.

<input type="text"> voor naam

<input type="email"> voor e-mail

<select> met minstens 2 <option>s

<textarea> voor bericht

editor
Live preview

7 Eindopdracht: Registratieformulier

Maak een volledig registratieformulier:

✓ Naam (type="text", required)

✓ E-mail (type="email", required)

✓ Wachtwoord (type="password", required)

✓ Geboortedatum (type="date")

✓ Minstens 2 radio buttons (bijv. niveau: beginner / gevorderd)

✓ Checkbox "Ik ga akkoord" (required)

✓ Submit-knop

✓ Elk veld heeft een <label>

editor
Live preview
📄 Volledig voorbeeld: registratie.html
<!DOCTYPE html>
<html lang="nl">
<head>
  <meta charset="UTF-8">
  <title>Registreren</title>
</head>
<body>
  <h1>Nieuw account aanmaken</h1>

  <form action="/registreer" method="post">

    <label for="naam">Naam:</label><br>
    <input type="text" id="naam" name="naam" required placeholder="Jouw naam"><br><br>

    <label for="email">E-mail:</label><br>
    <input type="email" id="email" name="email" required><br><br>

    <label for="ww">Wachtwoord:</label><br>
    <input type="password" id="ww" name="wachtwoord" required><br><br>

    <label for="geb">Geboortedatum:</label><br>
    <input type="date" id="geb" name="geboortedatum"><br><br>

    <p>Niveau:</p>
    <input type="radio" id="beg" name="niveau" value="beginner">
    <label for="beg">Beginner</label>
    <input type="radio" id="gev" name="niveau" value="gevorderd">
    <label for="gev">Gevorderd</label><br><br>

    <input type="checkbox" id="akkoord" name="akkoord" required>
    <label for="akkoord">Ik ga akkoord met de voorwaarden</label><br><br>

    <button type="submit">Registreren</button>
  </form>
</body>
</html>