Checkbox
Release dato: 04.10.2023
Sist oppdatert: 02.10.2026
Med avkryssingsbokser kan brukeren velge ett eller flere alternativer. Har du flere alternativer kan du samle dem i komponenten PktCheckboxGroup.
En enkeltstÄende avkryssingsboks bruker du nÄr brukeren skal bekrefte én ting, for eksempel «Jeg har lest vilkÄrene».
Test komponenten
Gruppe eller enkeltstÄende
| Bruk | NÄr |
|---|---|
| Gruppe (anbefalt) | Brukeren kan krysse av for flere alternativer som hĂžrer sammen. Bruk PktCheckboxGroup |
| EnkeltstÄende checkbox | Brukeren skal bekrefte én ting, for eksempel samtykke. Bruk PktCheckbox alene |
Med gruppen fÄr du:
- én label for hele spÞrsmÄlet
- hjelpetekst og feilmelding
- pÄkrevd- eller valgfritt-merking, og en sjekk av at minst ett alternativ er krysset av
- samme navn, stÞrrelse og tile pÄ alle checkboxene
- én verdi for hele gruppen: en liste med alternativene som er krysset av
Switch kan ogsÄ stÄ i en gruppe, sammen med checkboxer eller alene. Gruppen kan ogsÄ inneholde et tekstfelt som vises nÄr brukeren krysser av for «Annet». Se Alternativet «Annet» under Implementasjon i kode.
Relaterte komponenter
NÄr brukeren bare kan velge ett alternativ.
NÄr brukeren skal slÄ en innstilling av eller pÄ.
NÄr brukeren skal velge fra en lang liste.
Varianter
| Variant | Beskrivelse |
|---|---|
| Standard | Checkbox med label |
| Tile | Checkbox med ramme. Gir tydelig avgrensning og stĂžrre klikkflate |
SlÄ pÄ tile for alle checkboxene med hasTile pÄ gruppen.
Ubestemt tilstand
En checkbox kan vise at noen, men ikke alle, underliggende alternativer er krysset av. Bruk indeterminate pÄ en checkbox som styrer en gruppe andre checkboxer, for eksempel «Velg alle».
StĂžrrelser
Checkboxer finnes i tre stÞrrelser. Sett stÞrrelsen pÄ gruppen, sÄ fÄr alle checkboxene den.
| StĂžrrelse | Bruk |
|---|---|
| Medium (standard) | Bruk denne som hovedregel |
| Small | Trange flater, som tabeller og kompakte skjemaer |
| XSmall | SvĂŠrt trange flater, som kompakte tabeller og fagsystemer med mye informasjon |
Retningslinjer for bruk
Bruk checkbox nÄr
- brukeren kan krysse av for ett eller flere alternativer
- alternativene kan kombineres
- brukeren skal bekrefte noe, for eksempel at vilkÄrene er lest
UnngÄ checkbox nÄr
- brukeren bare kan velge ett alternativ. Bruk radio button
- én innstilling skal slÄs av eller pÄ og virke med en gang. Bruk switch
- det er mer enn ti alternativer. Vurder combobox
Skriv tydelige labels
Labelen pÄ gruppen sier hva du spÞr om. Labelen pÄ hver checkbox sier hva valget betyr, ikke bare «Ja» eller «Nei».
GjĂžr slik
UnngÄ
Bruk radioknapper nÄr brukeren bare kan velge ett alternativ
Kan brukeren bare velge ett alternativ, bruker du radioknapper.
GjĂžr slik
UnngÄ
La brukeren krysse av selv
Brukeren skal selv krysse av for Ä gi samtykke (opt-in). Ikke kryss av pÄ forhÄnd, for eksempel for nyhetsbrev eller vilkÄr. Dette er et krav i GDPR.
GjĂžr slik
UnngÄ
Plassering
Plasser checkboxene under hverandre. Da ser brukeren lettere hvilken tekst som hĂžrer til hvilken checkbox.
Har du to eller tre korte alternativer, kan du legge dem pÄ rad med layout="horizontal" pÄ gruppen. Bryter labelene over flere linjer, skal checkboxene stÄ under hverandre. Har du mange alternativer, setter du dem i én kolonne, sÄ er de lette Ä skanne.
Responsivitet
PÄ mobil skal checkboxene alltid stÄ under hverandre.
Test at
- teksten bryter riktig pÄ smÄ skjermer
- checkboxer med tile fortsatt er oversiktlige
- fokusringen og klikkflatene fungerer godt pÄ berÞringsskjerm
Universell utforming
Gi hver checkbox en tydelig label
Hver checkbox trenger en kort og tydelig label som ikke er lik noen andre pÄ siden. En checkbox uten synlig label, for eksempel i en tabell, trenger likevel en skjult label for skjermlesere. WCAG 2.1: 1.3.1 Info and Relationships, 2.4.6 Headings and Labels.
Bruk gruppen
Gruppen setter checkboxene i et fieldset med labelen som legend. Da leser skjermlesere opp spÞrsmÄlet sammen med hvert alternativ.
Ikke kryss av pÄ forhÄnd
Brukeren skal ta valget selv. Se La brukeren krysse av selv.
UnngÄ deaktiverte checkboxer
Brukere forstÄr ofte ikke hvorfor en checkbox er deaktivert. Vis heller en hjelpetekst eller en feilmelding. MÄ du deaktivere en checkbox, forklar hvorfor og hva som skal til for Ä aktivere den.
Tastatur
Brukeren flytter til en checkbox med tabulatortasten og krysser av med mellomrom.
Anatomi
| Element | Beskrivelse |
|---|---|
| 1. Checkbox | Boksen brukeren krysser av i |
| 2. Label | Teksten som beskriver valget |
| 3. Hjelpetekst | Forklarer valget (valgfritt) |
Implementasjon i kode
Hvordan ta komponenten i bruk?
import @oslokommune/punkt-elements/dist/pkt-checkbox-group.js;
import @oslokommune/punkt-elements/dist/pkt-checkbox.js;import { PktCheckboxGroup, PktCheckbox } from '@oslokommune/punkt-react';<script src="https://punkt-cdn.oslo.kommune.no/19/elements/pkt-checkbox-group.js" type="module"></script>
<script src="https://punkt-cdn.oslo.kommune.no/19/elements/pkt-checkbox.js" type="module"></script>Gruppen holder pÄ verdien
NÄr du bruker PktCheckboxGroup / pkt-checkbox-group, er gruppen skjemafeltet du skal forholde deg til. Sett name, value, onChange og required pÄ gruppen, ikke pÄ checkboxene.
const [varsling, setVarsling] = useState([])
<PktCheckboxGroup
name="varsling"
label="Hvordan vil du bli varslet?"
value={varsling}
onValueChange={setVarsling}
required
>
<PktCheckbox id="epost" value="epost" label="E-post" />
<PktCheckbox id="sms" value="sms" label="SMS" />
<PktCheckbox id="push" value="push" label="Varsler i appen" isSwitch />
</PktCheckboxGroup>Med React Hook Form registrerer du gruppen:
<PktCheckboxGroup label="Hvordan vil du bli varslet?" {...register('varsling', { required: true })}>
<PktCheckbox id="epost" value="epost" label="E-post" />
<PktCheckbox id="sms" value="sms" label="SMS" />
</PktCheckboxGroup>I Elements:
<pkt-checkbox-group name="varsling" label="Hvordan vil du bli varslet?" required>
<pkt-checkbox id="epost" value="epost" label="E-post"></pkt-checkbox>
<pkt-checkbox id="sms" value="sms" label="SMS"></pkt-checkbox>
</pkt-checkbox-group>Slik oppfĂžrer gruppen seg
- Verdi.
valueer en liste med verdiene til checkboxene som er krysset av, i samme rekkefÞlge som i skjemaet. Deaktiverte checkboxer er ikke med. Du kan ogsÄ lese og settevaluepÄ selve gruppen: pÄ elementet i Elements og pÄrefi React. I Elements kan du skrive verdiene kommaseparert i attributtet. Setter du verdien fra kode, utlÞser det ingen events. - Events. Gruppen utlÞser
change(onChangei React) med gruppen somevent.target, sÄevent.target.valueer listen med verdier.value-change(onValueChangei React) returnerer listen som array.focusogblurutlÞses nÄr fokus kommer inn i eller forlater gruppen, ikke nÄr fokus flytter seg mellom checkboxene. - Fokus.
focus()pÄ gruppen flytter fokus til den fÞrste checkboxen som er krysset av, eller til den fÞrste checkboxen dersom ingen er valgt. - Navn. Checkboxer uten eget
namefÄr navnet til gruppen. Har ikke gruppenname, bruker denid, og ellers et generert navn. - PÄkrevd. Med
requiredmÄ minst én checkbox vÊre krysset av. Til da er alle checkboxene ugyldige med meldingen «Velg minst ett alternativ». Det gircustomError, som medsetCustomValidity()i HTML. En checkbox med egetrequiredmÄ fortsatt krysses av. - Deaktivert.
disableddeaktiverer alle checkboxene, som<fieldset disabled>. - Tile og feil.
hasTileoghasErrorpÄ gruppen gjelder alle checkboxene. En checkbox kan slÄ dem pÄ selv, men ikke slÄ dem av nÄr gruppen har slÄtt dem pÄ.
Alternativet «Annet»
Legg et tekstfelt inne i gruppen, rett etter alternativet «Annet», og vis det nÄr brukeren krysser av for «Annet». Tekstfeltet har sitt eget name og sendes som et eget felt. Det pÄvirker ikke verdien til gruppen eller valideringen av checkboxene.
const [varsling, setVarsling] = useState([])
<PktCheckboxGroup name="varsling" label="Hvordan vil du bli varslet?" value={varsling} onValueChange={setVarsling}>
<PktCheckbox id="epost" value="epost" label="E-post" />
<PktCheckbox id="annet" value="annet" label="Annet" />
{varsling.includes('annet') && <PktTextinput id="varsling-annet" name="varsling-annet" label="Hva annet?" />}
</PktCheckboxGroup>I Elements skjuler du tekstfeltet med hidden og disabled. Med disabled blir tekstfeltet ikke sendt med skjemaet mens det er skjult.
<pkt-checkbox-group id="varsling" name="varsling" label="Hvordan vil du bli varslet?">
<pkt-checkbox id="epost" value="epost" label="E-post"></pkt-checkbox>
<pkt-checkbox id="annet" value="annet" label="Annet"></pkt-checkbox>
<pkt-textinput
id="varsling-annet"
name="varsling-annet"
label="Hva annet?"
hidden
disabled
></pkt-textinput>
</pkt-checkbox-group>
<script>
const gruppe = document.getElementById('varsling')
const annet = document.getElementById('varsling-annet')
gruppe.addEventListener('change', (event) => {
if (event.target !== gruppe) return
annet.hidden = annet.disabled = !gruppe.value.includes('annet')
})
</script>I Elements gÄr events fra tekstfeltet gjennom gruppen, som gjennom et vanlig fieldset. Lytter du pÄ change pÄ gruppen, sjekker du at event.target er gruppen. I React kalles onChange pÄ gruppen bare nÄr brukeren endrer checkboxene.
EnkeltstÄende checkbox
Skal brukeren bare bekrefte én ting, bruker du PktCheckbox alene. Med required mÄ den vÊre krysset av fÞr skjemaet kan sendes.
<PktCheckbox id="vilkar" name="vilkar" value="ja" label="Jeg har lest vilkÄrene" required />Uten gruppe
Du kan ogsÄ bruke checkboxer uten PktCheckboxGroup, for eksempel i en PktInputWrapper med hasFieldset. Da setter du name pÄ hver checkbox selv, og required gjelder bare checkboxen du setter den pÄ.
Testing
Elements: Dersom du skal skrive tester med JSDOM eller liknende er det viktig at du lar komponenten bli rendret ferdig fĂžr du tester den. Dette kan gjĂžres ved Ă„ kjĂžre denne kodelinjen fĂžr testene kjĂžres:
await window.customElements.whenDefined("pkt-checkbox-group");Bruker dere data-testid til Ä finne elementer i testene, sendes attributtet videre til selve skjemaelementet. Vil dere heller ha data-testid pÄ <pkt-checkbox>, setter dere skipForwardTestid pÄ elementet.
Test om en checkbox er krysset av med :checked, ikke med .checked. Vi har ikke funnet ut hvorfor .checked noen ganger gir feil svar i tester, for i nettleseren fungerer den. Det kan hjelpe Ă„ vente litt fĂžr dere leser verdien.
I punkt-testing-utils tester vi slik: element.querySelectorAll(':checked').length.
Egenskaper
Props
- Prop:
label- Type:
string- Beskrivelse:
- Ledetekst for gruppen. Blir til
legendi fieldset - Prop:
helptext?- Type:
string- Beskrivelse:
- Hjelpetekst over alternativene
- Prop:
helptextDropdown?- Type:
string- Beskrivelse:
- Hjelpetekst som vises nÄr brukeren Äpner «Les mer»
- Prop:
helptextDropdownButton?- Status:
- DeprecatedBruk
strings={{ forms: { readMore: 'âŠ' } }}ellersetPktStrings(). - Type:
string- Beskrivelse:
- Tekst pÄ «Les mer»-knappen
- Prop:
id?- Type:
string- Beskrivelse:
- ID for gruppen. Brukes ogsÄ som navn pÄ alternativene nÄr
namemangler - Prop:
name?- Type:
string- Beskrivelse:
- Gis til alternativer som ikke har eget
name. Utennamebrukesid, og uten den et generert navn - Prop:
value?- Type:
string[]- Beskrivelse:
- Verdiene til avkryssede alternativer i DOM-rekkefĂžlge, som
FormData.getAll(name). Deaktiverte alternativer er ikke med. Elements tar ogsÄ imot kommaseparerte verdier i attributtet. à sette verdien fra kode fyrer ingen events. Gruppeelementet er skjemafeltet, sÄvalue,nameogfocus()finnes ogsÄ pÄ elementet (Elements) og pÄref(React) - Prop:
defaultValue?- Type:
string[]- Beskrivelse:
- Verdiene som er krysset av fra start i en ukontrollert gruppe. Skjema-reset gÄr tilbake hit
- Prop:
layout?- Type:
"vertical" | "horizontal"- Standardverdi:
"vertical"- Beskrivelse:
- Retning for alternativene. Avstanden mellom dem fĂžlger stĂžrrelsen (16, 12 og 8px)
- Prop:
inputSize?input-size?- Type:
"xsmall" | "small" | "medium"- Standardverdi:
"medium"- Beskrivelse:
- StÞrrelse pÄ gruppen. Alternativene arver den, med mindre de har egen stÞrrelse
- Prop:
hasTile?- Type:
boolean- Standardverdi:
false- Beskrivelse:
- Viser alle alternativene som tile. Et alternativ kan slÄ pÄ tile selv, men ikke slÄ det av nÄr gruppen har slÄtt det pÄ
- Prop:
required?- Type:
boolean- Standardverdi:
false- Beskrivelse:
- Minst ett alternativ mÄ krysses av. Alternativene fÄr
customErrormed meldingen «Velg minst ett alternativ» til ett er krysset av. Sendes ikke videre somrequiredtil alternativene - Prop:
disabled?- Type:
boolean- Standardverdi:
false- Beskrivelse:
- Deaktiverer alle alternativene, som
<fieldset disabled>. Kan ikke overstyres pÄ et enkelt alternativ - Prop:
hasError?- Type:
boolean- Standardverdi:
false- Beskrivelse:
- Viser feiltilstand pÄ gruppen og alle alternativene
- Prop:
errorMessage?- Type:
string- Beskrivelse:
- Vises under alternativene nÄr
hasErrorer satt - Prop:
useWrapper?- Type:
boolean- Standardverdi:
true- Beskrivelse:
- Skjuler ledetekst og hjelpetekst visuelt nÄr den er av. Gruppen beholder navnet sitt for skjermlesere
- Prop:
requiredTag?- Type:
boolean- Standardverdi:
false- Beskrivelse:
- Viser en merking som indikerer at gruppen er pÄkrevd
- Prop:
requiredText?- Status:
- DeprecatedBruk
strings={{ forms: { required: 'âŠ' } }}ellersetPktStrings(). - Type:
string- Beskrivelse:
- Tekst som vises i pÄkrevd-merkingen
- Prop:
optionalTag?- Type:
boolean- Standardverdi:
false- Beskrivelse:
- Viser en merking som indikerer at gruppen er valgfri
- Prop:
optionalText?- Status:
- DeprecatedBruk
strings={{ forms: { optional: 'âŠ' } }}ellersetPktStrings(). - Type:
string- Beskrivelse:
- Tekst som vises i valgfritt-merkingen
- Prop:
tagText?- Type:
string- Beskrivelse:
- Tekst som vises i en tag ved siden av ledeteksten
Slots
- Slot:
default- Beskrivelse:
PktCheckbox/pkt-checkbox, ogsÄ som switch (isSwitch)- Slot:
helptext- Beskrivelse:
- Hjelpetekst med markup (Elements)
Events
- Event:
change- Type:
Event- Beskrivelse:
- Fyres av gruppen nÄr brukeren krysser av eller fjerner et kryss. Skjemafeltet er gruppen:
event.targeter gruppen, mednameogvalue(gruppens verdi, verdiene til avkryssede checkboxer (string[])). Alternativenes egne events stopper ved gruppen - Event:
input- Type:
InputEvent- Beskrivelse:
- Fyres av gruppen rett fĂžr
change, med verdien allerede oppdatert - Event:
value-change- Type:
CustomEvent- Beskrivelse:
- Gruppens nye verdi i
detail - Event:
focus- Type:
FocusEvent- Beskrivelse:
- NÄr fokus kommer inn i gruppen. Fyres ikke nÄr fokus flytter seg mellom alternativene
- Event:
blur- Type:
FocusEvent- Beskrivelse:
- NÄr fokus forlater gruppen. Fyres ikke nÄr fokus flytter seg mellom alternativene
- Event:
onChange- Type:
Event- Beskrivelse:
- Kalles nÄr brukeren krysser av eller fjerner et kryss. Skjemafeltet er gruppen:
event.targeter gruppen, mednameogvalue(gruppens verdi, verdiene til avkryssede checkboxer (string[])). Fungerer medregisterogControlleri React Hook Form - Event:
onValueChange- Type:
string[]- Beskrivelse:
- Kalles med gruppens nye verdi nÄr brukeren krysser av eller fjerner et kryss
- Event:
onFocus- Type:
FocusEvent- Beskrivelse:
- NÄr fokus kommer inn i gruppen, ikke mellom alternativene
- Event:
onBlur- Type:
FocusEvent- Beskrivelse:
- NÄr fokus forlater gruppen, ikke mellom alternativene
Props
- Prop:
label?- Type:
string- Beskrivelse:
- Tekst (label)
- Prop:
checkHelptext?- Type:
string- Beskrivelse:
- Hjelpetekst som vises under labelen, for eksempel for Ă„ forklare feltet nĂŠrmere
- Prop:
name?- Type:
string- Beskrivelse:
- Arves fra PktCheckboxGroup nÄr det ikke er satt
- Prop:
form?- Type:
string- Beskrivelse:
- ID-en til skjemaet feltet hÞrer til, nÄr feltet ligger utenfor skjemaet
- Prop:
value?- Type:
string- Beskrivelse:
- Verdi
- Prop:
id- Type:
string- Beskrivelse:
- ID
- Prop:
defaultChecked?- Type:
boolean- Standardverdi:
false- Beskrivelse:
- ForhÄndsvalgt
- Prop:
checked?- Type:
boolean- Standardverdi:
false- Beskrivelse:
- Huket av
- Prop:
indeterminate?- Type:
boolean- Standardverdi:
false- Beskrivelse:
- Setter checkboxen i en ubestemt tilstand, ofte brukt for 'select all' checkboxer der noen men ikke alle elementer er valgt
- Prop:
hasTile?- Type:
boolean- Standardverdi:
false- Beskrivelse:
- Boks (tile)
- Prop:
inputSize?input-size?- Type:
"xsmall" | "small" | "medium"- Beskrivelse:
- StÞrrelse pÄ tekst, hjelpetekst og tile. Uten verdi arves stÞrrelsen fra input-wrapperen rundt
- Prop:
disabled?- Type:
boolean- Standardverdi:
false- Beskrivelse:
- Deaktivert
- Prop:
hasError?- Type:
boolean- Standardverdi:
false- Beskrivelse:
- Feil
- Prop:
isSwitch?- Type:
boolean- Standardverdi:
false- Beskrivelse:
- Switch
- Prop:
labelPosition?- Type:
"right" | "left"- Standardverdi:
"right"- Beskrivelse:
- Posisjon
- Prop:
hideLabel?- Type:
boolean- Standardverdi:
false- Beskrivelse:
- Skjul tekst/label
- Prop:
requiredTag?- Type:
boolean- Standardverdi:
false- Beskrivelse:
- Viser en merking som indikerer at feltet er pÄkrevd
- Prop:
requiredText?- Status:
- DeprecatedBruk
strings={{ forms: { required: 'âŠ' } }}ellersetPktStrings(). - Type:
string- Beskrivelse:
- Tekst som vises i pÄkrevd-merkingen
- Prop:
optionalTag?- Type:
boolean- Standardverdi:
false- Beskrivelse:
- Viser en merking som indikerer at feltet er valgfritt
- Prop:
optionalText?- Status:
- DeprecatedBruk
strings={{ forms: { optional: 'âŠ' } }}ellersetPktStrings(). - Type:
string- Beskrivelse:
- Tekst som vises i valgfritt-merkingen
- Prop:
tagText?- Type:
string- Beskrivelse:
- Tekst som vises i en tag ved siden av label
Events
- Event:
change- Type:
- â
- Beskrivelse:
- Returnerer checkboxens verdi nÄr den endres