Gebruik semantische, toegankelijke HTML waarbij elk selectievakje is gekoppeld aan het bijbehorende label. Dit doe je door de <input> te nesten in de <label> of door het kenmerk for van het label te koppelen aan de id van de invoer.
Moderne CSS biedt 2 manieren om selectievakjes op te maken: pas de systeemeigen weergave aan met accent-color of overschrijf de standaardpresentatie met appearance: none voor het element <input type="checkbox">.
Native aanpassing met accent-color
Gebruik accent-color voor eenvoudige, merkconsistente opmaak die de native weergave, het toetsenbordgedrag, de validatie en de focusindicatoren van het besturingssysteem behoudt.
.checkbox-native {
accent-color: #1a73e8;
/* Sizing is controlled via relative units */
inline-size: 1.25em;
aspect-ratio: 1;
margin: 0;
cursor: pointer;
}
Volledig aangepaste stijl met appearance: none
Gebruik appearance: none als je voor het ontwerp de vorm, grootte, statussen of indicatoren van het selectievakje wilt kunnen bepalen. Hiermee wordt de native visuele stijl verwijderd, terwijl de <input> het interactieve doel blijft.
Stel expliciete relatieve grootten in voor --checkbox-size en --checkbox-icon-size, omdat appearance: none de standaarddimensies van de browser verwijdert. Houd het icoon kleiner dan het selectievakje om ruimte te bieden voor de rand en visuele opvulling.
/* Reusable SVG assets */
:root {
--icon-check: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3.5' stroke-linecap='round' stroke-linejoin='round'><polyline points='20 6 9 17 4 12'></polyline></svg>");
--icon-dash: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='4.5' stroke-linecap='round' stroke-linejoin='round'><line x1='5' y1='12' x2='19' y2='12'></line></svg>");
}
/* Custom checkbox */
.checkbox-custom {
--checkbox-size: 1.25em;
--checkbox-icon-size: 0.7em;
appearance: none;
display: inline-grid;
place-content: center;
inline-size: var(--checkbox-size);
aspect-ratio: 1;
margin: 0;
border: 2px solid currentColor;
cursor: pointer;
&::before {
content: "";
inline-size: var(--checkbox-icon-size);
aspect-ratio: 1;
background-color: currentColor;
mask: var(--checkbox-icon) no-repeat center / contain;
scale: 0;
@media (prefers-reduced-motion: no-preference) {
transition: scale 150ms ease;
}
@media (forced-colors: active) {
background-color: CanvasText;
}
}
&:checked {
--checkbox-icon: var(--icon-check);
}
&:indeterminate {
--checkbox-icon: var(--icon-dash);
}
&:is(:checked, :indeterminate)::before {
scale: 1;
}
&:focus-visible {
outline: 2px solid currentColor;
outline-offset: 2px;
}
&:disabled {
cursor: not-allowed;
opacity: 0.5;
}
}
De onbepaalde status
De onbepaalde status kan niet worden ingesteld via een HTML-kenmerk. Stel de DOM-eigenschap indeterminate in JavaScript (checkbox.indeterminate = true) in en zorg dat de pseudoklasse :indeterminate visueel verschilt van zowel de status :checked als de status Uitgevinkt:
- Systeemeigen (
accent-color): De browser past automatisch de stijl toe met deaccent-colorvan het element (er is geen extra:indeterminateCSS-regel nodig). - Aangepast (
appearance: none): Wissel--checkbox-iconom naarvar(--icon-dash)op.checkbox-custom:indeterminate, zoals hierboven getoond.
const selectAll = document.querySelector("#select-all");
selectAll.indeterminate = true;
Toegankelijkheid en interactie
- Gebruik WEL
:focus-visiblein plaats van:focusom focusindicatoren op aangepaste selectievakjes op te maken, zodat er een duidelijke contour verschijnt voor toetsenbordnavigatie zonder dat deze wordt getoond bij muisklikken. - Gebruik
outline: noneNIET en verberg geen focusindicatoren op selectievakjes. Zorg dat het selectievakje of de wrapper
<label>een interactief hitdoel van minimaal44px x 44pxbiedt, terwijl het visuele selectievakje de grootte in relatieve eenheden behoudt:label { display: inline-flex; align-items: center; gap: 0.65rem; min-block-size: 44px; cursor: pointer; }WEL een
:disabled-stijlvariant bieden die de dekking verlaagt encursor: not-allowedinstelt om inactieve statussen duidelijk over te brengen.
Problemen om rekening mee te houden bij het gebruik van accent-color
De browserweergave van accent-color varieert.
Voor indicatoren die meestal over een achtergrond met accentkleur worden geschilderd, zoals selectievakjes en keuzerondjes, kunnen browsers verschillende behandelingen toepassen:
- Chromium en Firefox selecteren meestal een contrasterende indicatorkleur.
- Safari kan in plaats daarvan een witte indicator behouden in de lichte modus of een zwarte indicator in de donkere modus, terwijl de accentkleur erachter wordt aangepast. Deze aanpassing biedt niet altijd voldoende contrast voor elke geleverde kleur. Test daarom belangrijke combinaties in Safari, waaronder zowel lichte als donkere kleurenschema's. Ga er niet van uit dat Safari automatisch de indicatorkleur kiest die het beste contrast biedt.
Reservestrategieën
Fallbacks en browserondersteuning voor accent-color
De property accent-color is progressive enhancement.
Browsers die deze property niet ondersteunen, negeren deze en gebruiken de standaard UI-kleuren.