Standarder · ARIA

Roll Widget

checkbox

Markerar ett element som en kryssruta med två eller tre tillstånd. Använd <input type="checkbox"> i första hand; nå bara för role="checkbox" när du inte kan använda det inbyggda elementet — till exempel när du bygger en tri-state-kontroll som måste visa ett blandat värde.

När ska rollen användas

Använd <input type="checkbox">. Det inbyggda elementet ger fokus, aktivering via Space, pseudoklassen :checked, formulärinlämning och egenskapen indeterminate i JavaScript för tri-state. role="checkbox" finns för två fall:

  • Du behöver en tri-state-kryssruta exponerad som aria-checked="mixed" (ett “markera alla” som återspeglar underordnade element).
  • Ett designsystem levererar en anpassad kryssrutekomponent du inte kan ersätta.

Om du implementerar role="checkbox" på ett icke-input-element måste du sätta aria-checked (det krävs), hantera tabindex="0" och hantera keydown för Space.

Tangentbord och fokuskontrakt

Enligt APG:s checkbox-mönster:

  • Tab flyttar fokus till kryssrutan.
  • Space växlar aria-checked mellan "true" och "false" (och "mixed" för tri-state).
  • Enter aktiverar INTE en kryssruta — endast Space. (Inbyggda input-element ignorerar också Enter i de flesta webbläsare.)

Fokus stannar på kryssrutan efter aktivering.

Vanliga fel

  • role="checkbox" utan att aria-checked-attributet är satt. Tillståndet krävs från det ögonblick elementet finns i DOM.
  • Att använda aria-checked="true" enbart som en CSS-krok — uppdatera det visuella utseendet men aldrig attributet vid klick.
  • Anpassade kryssrutor som svarar på klick men inte på Space.
  • Att linda in ett inbyggt <input> inuti en <div role="checkbox"> — duplicerad semantik förvirrar skärmläsare.
  • Tri-state-kontroller som med Space cyklar false → true → mixed → false. APG specificerar false → true → false; mixed sätts programmatiskt av sidan, inte av användaren.

Exempel

<!-- Föredraget -->
<label>
  <input type="checkbox" name="terms" required>
  Jag godkänner villkoren
</label>

<!-- Anpassat tri-state "markera alla" -->
<div
  role="checkbox"
  tabindex="0"
  aria-checked="mixed"
  aria-labelledby="selectAllLabel"
>
</div>
<span id="selectAllLabel">Markera alla rader</span>