Naar de inhoud
Gratis naslagwerk over HTML
HTML leren en naslaan
Naslag / Formulieren

Het element <input type="checkbox">

<input>-elementen van het type checkbox worden standaard weergegeven als vakjes die worden aangevinkt wanneer ze worden geactiveerd, zoals je zou kunnen zien op een officieel overheidsformulier op papier. Het exacte uiterlijk hangt af van de configuratie van het besturingssysteem waarop de browser draait. Doorgaans is dit een vierkant, maar het kan afgeronde hoeken hebben. Met een checkbox kun je enkele waarden selecteren voor verzending in een formulier (of niet).

Code
<fieldset>
  <legend>Choose your monster's features:</legend>

  <div>
    <input type="checkbox" id="scales" name="scales" checked />
    <label for="scales">Scales</label>
  </div>

  <div>
    <input type="checkbox" id="horns" name="horns" />
    <label for="horns">Horns</label>
  </div>
</fieldset>
Resultaat in de browser

Waarde

Een string die de waarde van de checkbox weergeeft. Deze wordt niet aan de clientzijde weergegeven, maar op de server is dit de value die wordt gegeven aan de gegevens die worden verzonden met de name van de checkbox. Bekijk het volgende voorbeeld:

HTML
<form>
  <div>
    <input
      type="checkbox"
      id="subscribeNews"
      name="subscribe"
      value="newsletter" />
    <label for="subscribeNews">Subscribe to newsletter?</label>
  </div>
  <div>
    <button type="submit">Subscribe</button>
  </div>
</form>

In dit voorbeeld hebben we een naam van subscribe en een waarde van newsletter. Wanneer het formulier wordt verzonden, is het naam/waarde-paar van de gegevens subscribe=newsletter.

Als het value-attribuut was weggelaten, is de standaardwaarde voor de checkbox on, dus de verzonden gegevens zouden in dat geval subscribe=on zijn.

Opmerking

Als een checkbox niet is aangevinkt wanneer het bijbehorende formulier wordt verzonden, wordt noch de naam, noch de waarde naar de server verzonden. Er is geen HTML-only manier om de niet-aangevinkte status van een checkbox weer te geven (bijvoorbeeld value=unchecked). Als je een standaardwaarde voor de checkbox wilt verzenden wanneer deze niet is aangevinkt, kun je JavaScript toevoegen om een <input type="hidden"> binnen het formulier te maken met een waarde die een niet-aangevinkte status aangeeft.

Aanvullende attributen

Naast de gemeenschappelijke attributen die door alle <input>-elementen worden gedeeld, ondersteunen checkbox-invoervelden de volgende attributen.

checked

Een Booleaans attribuut dat aangeeft of deze checkbox standaard is aangevinkt (wanneer de pagina wordt geladen). Het geeft niet aan of deze checkbox momenteel is aangevinkt: als de status van de checkbox verandert, weerspiegelt dit content-attribuut de wijziging niet. (Alleen het IDL-attribuut checked van HTMLInputElement wordt bijgewerkt.)
Opmerking

In tegenstelling tot andere invoerbesturingselementen wordt de waarde van een checkbox alleen opgenomen in de verzonden gegevens als de checkbox op dat moment checked is. Als dat zo is, wordt de waarde van het value-attribuut van de checkbox gerapporteerd als de waarde van de invoer, of on als er geen value is ingesteld. In tegenstelling tot andere browsers blijft Firefox standaard de dynamische aangevinkte status behouden van een <input> tussen paginaladingen. Gebruik het attribuut autocomplete om deze functie te beheren.

value

Het value-attribuut is een attribuut dat alle <input>-elementen delen; het dient echter een speciaal doel voor invoervelden van het type checkbox: wanneer een formulier wordt verzonden, worden alleen checkboxes die op dat moment zijn aangevinkt naar de server verzonden, en de gerapporteerde waarde is de waarde van het value-attribuut. Als de value niet anders is opgegeven, is dit standaard de string on. Dit wordt gedemonstreerd in de sectie Waarde hierboven.

switch

Een Booleaans attribuut dat alleen van toepassing is op checkbox-invoervelden. Indien aanwezig, geeft dit aan dat de checkbox een aan/uit-switch voorstelt in plaats van een normale checkbox. Het verandert het uiterlijk van het checkbox-besturingselement, maar het onderliggende gedrag blijft hetzelfde als dat van een normale checkbox.

Opmerking

Dit attribuut stelt user agents in staat om switch-ARIA-semantiek bloot te stellen aan hulptechnologieën — zonder dat documenten expliciet role="switch" hoeven op te geven. De opmaak en API lijken op die van checkboxes, behalve dat de pseudoklasse :indeterminate nooit overeenkomt.

Let op

Dit attribuut is nog experimenteel en heeft beperkte browserondersteuning. Het attribuut wordt genegeerd in niet-ondersteunde browsers.

Checkbox-invoervelden gebruiken

We hebben hierboven al het meest basale gebruik van checkboxes behandeld. Laten we nu naar de andere veelvoorkomende checkbox-gerelateerde functies en technieken kijken die je nodig hebt.

Meerdere checkboxes verwerken

Het voorbeeld dat we hierboven zagen bevatte slechts één checkbox; in praktijksituaties zul je waarschijnlijk meerdere checkboxes tegenkomen. Als ze volledig onafhankelijk van elkaar zijn, kun je ze gewoon allemaal apart behandelen, zoals hierboven getoond. Als ze echter allemaal gerelateerd zijn, is het niet zo eenvoudig.

In de volgende demo nemen we bijvoorbeeld meerdere checkboxes op waarmee de gebruiker zijn interesses kan selecteren (zie de volledige versie in de sectie Voorbeelden).

HTML
<fieldset>
  <legend>Choose your interests</legend>
  <div>
    <input type="checkbox" id="coding" name="interest" value="coding" />
    <label for="coding">Coding</label>
  </div>
  <div>
    <input type="checkbox" id="music" name="interest" value="music" />
    <label for="music">Music</label>
  </div>
</fieldset>
Resultaat in de browser

In dit voorbeeld zie je dat we elke checkbox dezelfde name hebben gegeven. Als beide checkboxes zijn aangevinkt en het formulier vervolgens wordt verzonden, krijg je een string van naam/waarde-paren verzonden als volgt: interest=coding&interest=music. Wanneer deze string de server bereikt, moet je deze op een andere manier parsen dan als een associatieve array, zodat alle waarden van interest, niet alleen de laatste waarde, worden vastgelegd. Zie bijvoorbeeld Handle Multiple Checkboxes with a Single Serverside Variable voor een techniek die met Python wordt gebruikt.

Vakjes standaard aanvinken

Om een checkbox standaard aangevinkt te maken, geef je hem het checked-attribuut. Zie het onderstaande voorbeeld:

HTML
<fieldset>
  <legend>Choose your interests</legend>
  <div>
    <input type="checkbox" id="coding" name="interest" value="coding" checked />
    <label for="coding">Coding</label>
  </div>
  <div>
    <input type="checkbox" id="music" name="interest" value="music" />
    <label for="music">Music</label>
  </div>
</fieldset>
Resultaat in de browser

Switch als checkbox

Het volgende voorbeeld toont hoe je een checkbox laat lijken op en zich laat gedragen als een aan/uit-schakelaar.

HTML
<form>
  <fieldset>
    <legend>Adjust your setting</legend>
    <div>
      <label for="theme">Dark mode</label>
      <input type="checkbox" name="theme" id="theme" switch checked />
    </div>
    <div>
      <label for="notifications">Notifications</label>
      <input type="checkbox" name="notifications" id="notifications" switch />
    </div>
    <button type="submit">Submit</button>
  </fieldset>
</form>
Opmerking

Hoewel slechts sommige browsers de checkbox als een switch weergeven, is het gedrag in alle browsers hetzelfde.

Resultaat in de browser

Een groter klikgebied voor je checkboxes bieden

In de bovenstaande voorbeelden heb je misschien gemerkt dat je een checkbox kunt omschakelen door zowel op het bijbehorende <label>-element als op de checkbox zelf te klikken. Dit is een erg nuttige functie van HTML-formulierlabels die het makkelijker maakt om de gewenste optie aan te klikken, vooral op apparaten met een klein scherm zoals smartphones.

Naast toegankelijkheid is dit nog een goede reden om <label>-elementen goed in je formulieren op te zetten.

Checkboxes met onbepaalde status

Een checkbox kan zich in een onbepaalde (indeterminate) status bevinden. Dit wordt ingesteld via de indeterminate-eigenschap van het HTMLInputElement-object via JavaScript (het kan niet worden ingesteld met een HTML-attribuut):

JS
inputInstance.indeterminate = true;

Wanneer indeterminate true is, heeft de checkbox in de meeste browsers een horizontale lijn in het vakje (het lijkt enigszins op een liggend streepje of minteken) in plaats van een vinkje.

Opmerking

Dit is puur een visuele wijziging. Het heeft geen invloed op of de value van de checkbox wordt gebruikt bij een formulierverzending. Dat wordt bepaald door de checked-status, ongeacht de indeterminate-status.

Er zijn niet veel gebruikssituaties voor deze eigenschap. De meest voorkomende is wanneer er een checkbox beschikbaar is die "eigenaar" is van een aantal suboptions (die ook checkboxes zijn). Als alle suboptions zijn aangevinkt, is de bezittende checkbox ook aangevinkt, en als ze allemaal niet zijn aangevinkt, is de bezittende checkbox niet aangevinkt. Als een of meer van de suboptions een andere status hebben dan de andere, bevindt de bezittende checkbox zich in de onbepaalde status.

Dit is te zien in het onderstaande voorbeeld (met dank aan CSS Tricks voor de inspiratie). In dit voorbeeld houden we de ingrediënten bij die we verzamelen voor een recept. Wanneer je de checkbox van een ingrediënt aan- of uitvinkt, controleert een JavaScript-functie het totale aantal aangevinkte ingrediënten:

  • Als er geen zijn aangevinkt, wordt de checkbox van de receptnaam ingesteld op niet-aangevinkt.
  • Als er één of twee zijn aangevinkt, wordt de checkbox van de receptnaam ingesteld op indeterminate.
  • Als alle drie zijn aangevinkt, wordt de checkbox van de receptnaam ingesteld op checked.

In dit geval wordt de indeterminate-status dus gebruikt om aan te geven dat het verzamelen van de ingrediënten is begonnen, maar dat het recept nog niet compleet is.

JS
const overall = document.querySelector("#enchantment");
const ingredients = document.querySelectorAll("ul input");

overall.addEventListener("click", (e) => {
  e.preventDefault();
});

for (const ingredient of ingredients) {
  ingredient.addEventListener("click", updateDisplay);
}

function updateDisplay() {
  let checkedCount = 0;
  for (const ingredient of ingredients) {
    if (ingredient.checked) {
      checkedCount++;
    }
  }

  if (checkedCount === 0) {
    overall.checked = false;
    overall.indeterminate = false;
  } else if (checkedCount === ingredients.length) {
    overall.checked = true;
    overall.indeterminate = false;
  } else {
    overall.checked = false;
    overall.indeterminate = true;
  }
}
HTML
<form>
  <fieldset>
    <legend>Complete the recipe</legend>
    <div>
      <input type="checkbox" id="enchantment" name="enchantment" />
      <label for="enchantment">Enchantment table</label>
      <ul>
        <li>
          <input type="checkbox" id="book" name="ingredient" value="book" />
          <label for="book">Book</label>
        </li>
        <li>
          <input
            type="checkbox"
            id="diamonds"
            name="ingredient"
            value="diamonds" />
          <label for="diamonds">Diamonds (x2)</label>
        </li>
        <li>
          <input
            type="checkbox"
            id="obsidian"
            name="ingredient"
            value="obsidian" />
          <label for="obsidian">Obsidian (x4)</label>
        </li>
      </ul>
    </div>
  </fieldset>
</form>
Resultaat in de browser

Validatie

Checkboxes ondersteunen validatie (aangeboden aan alle <input>-elementen). De meeste ValidityState's zijn echter altijd false. Als de checkbox het attribuut required heeft, maar niet is aangevinkt, dan is ValidityState.valueMissing true.

Voorbeelden

Het volgende voorbeeld is een uitgebreide versie van het voorbeeld "meerdere checkboxes" dat we hierboven zagen — het heeft meer standaardopties, plus een "other"-checkbox die, wanneer aangevinkt, ervoor zorgt dat er een tekstveld verschijnt om een waarde voor de optie "other" in te voeren. Dit wordt bereikt met een kort blok JavaScript. Het voorbeeld bevat impliciete labels, waarbij de <input> zich direct binnen de <label> bevindt. Het tekstinvoerveld, zonder zichtbaar label, bevat het aria-label-attribuut dat de toegankelijke naam ervan biedt. Dit voorbeeld bevat ook wat CSS om de styling te verbeteren.

HTML

HTML
<form>
  <fieldset>
    <legend>Choose your interests</legend>
    <div>
      <label>
        <input type="checkbox" id="coding" name="interest" value="coding" />
        Coding
      </label>
    </div>
    <div>
      <label>
        <input type="checkbox" id="music" name="interest" value="music" />
        Music
      </label>
    </div>
    <div>
      <label>
        <input type="checkbox" id="art" name="interest" value="art" />
        Art
      </label>
    </div>
    <div>
      <label>
        <input type="checkbox" id="sports" name="interest" value="sports" />
        Sports
      </label>
    </div>
    <div>
      <label>
        <input type="checkbox" id="cooking" name="interest" value="cooking" />
        Cooking
      </label>
    </div>
    <div>
      <label>
        <input type="checkbox" id="other" name="interest" value="other" />
        Other
      </label>
      <input
        type="text"
        id="otherValue"
        name="other"
        aria-label="Other interest" />
    </div>
    <div>
      <button type="submit">Submit form</button>
    </div>
  </fieldset>
</form>

CSS

CSS
html {
  font-family: sans-serif;
}

form {
  width: 600px;
  margin: 0 auto;
}

div {
  margin-bottom: 10px;
}

fieldset {
  background: cyan;
  border: 5px solid blue;
}

legend {
  padding: 10px;
  background: blue;
  color: cyan;
}

JavaScript

JS
const otherCheckbox = document.querySelector("#other");
const otherText = document.querySelector("#otherValue");
otherText.style.visibility = "hidden";

otherCheckbox.addEventListener("change", () => {
  if (otherCheckbox.checked) {
    otherText.style.visibility = "visible";
    otherText.value = "";
  } else {
    otherText.style.visibility = "hidden";
  }
});

Technische samenvatting

Waarde Een string die de waarde van de checkbox weergeeft.
Gebeurtenissen change en input
Ondersteunde gemeenschappelijke attributen checked en switch
IDL-attributen checked, indeterminate en value
DOM-interface

HTMLInputElement

Impliciete ARIA-rol checkbox

Verwante elementen