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».

Har du noen innspill til komponenten?Gi oss beskjed!

Test komponenten

Hvordan vil du bli varslet?
Du kan velge flere.

Kodebygger

PktCheckboxGroup

Innhold
Utseende
Retning for alternativene. Avstanden mellom dem fĂžlger stĂžrrelsen (16, 12 og 8px)
StÞrrelse pÄ gruppen. Alternativene arver den, med mindre de har egen stÞrrelse
Teknisk
ID for gruppen. Brukes ogsÄ som navn pÄ alternativene nÄr name mangler
Gis til alternativer som ikke har eget name. Uten name brukes id, og uten den et generert navn
Skjema
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, name og focus() finnes ogsĂ„ pĂ„ elementet (Elements) og pĂ„ ref (React)
Verdiene som er krysset av fra start i en ukontrollert gruppe. Skjema-reset gÄr tilbake hit
Validering

Innhold

varsling-epost (PktCheckbox)

PktCheckbox

Innhold
Hjelpetekst som vises under labelen, for eksempel for Ă„ forklare feltet nĂŠrmere
Utseende
StÞrrelse pÄ tekst, hjelpetekst og tile. Uten verdi arves stÞrrelsen fra input-wrapperen rundt
Teknisk
Arves fra PktCheckboxGroup nÄr det ikke er satt
ID-en til skjemaet feltet hÞrer til, nÄr feltet ligger utenfor skjemaet
varsling-sms (PktCheckbox)

PktCheckbox

Innhold
Hjelpetekst som vises under labelen, for eksempel for Ă„ forklare feltet nĂŠrmere
Utseende
StÞrrelse pÄ tekst, hjelpetekst og tile. Uten verdi arves stÞrrelsen fra input-wrapperen rundt
Teknisk
Arves fra PktCheckboxGroup nÄr det ikke er satt
ID-en til skjemaet feltet hÞrer til, nÄr feltet ligger utenfor skjemaet
varsling-brev (PktCheckbox)

PktCheckbox

Innhold
Hjelpetekst som vises under labelen, for eksempel for Ă„ forklare feltet nĂŠrmere
Utseende
StÞrrelse pÄ tekst, hjelpetekst og tile. Uten verdi arves stÞrrelsen fra input-wrapperen rundt
Teknisk
Arves fra PktCheckboxGroup nÄr det ikke er satt
ID-en til skjemaet feltet hÞrer til, nÄr feltet ligger utenfor skjemaet

Gruppe eller enkeltstÄende

BrukNÄr
Gruppe (anbefalt)Brukeren kan krysse av for flere alternativer som hĂžrer sammen. Bruk PktCheckboxGroup
EnkeltstÄende checkboxBrukeren 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.

En gruppe med checkboxer
EnkeltstÄende checkbox

Relaterte komponenter

Varianter

VariantBeskrivelse
StandardCheckbox med label
TileCheckbox med ramme. Gir tydelig avgrensning og stĂžrre klikkflate

SlÄ pÄ tile for alle checkboxene med hasTile pÄ gruppen.

Checkbox med og uten rammeEnkeltstÄende checkbox

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ĂžrrelseBruk
Medium (standard)Bruk denne som hovedregel
SmallTrange flater, som tabeller og kompakte skjemaer
XSmallSvĂŠrt trange flater, som kompakte tabeller og fagsystemer med mye informasjon
Checkboxer i stĂžrrelsene medium, small og xsmall

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

Skriv en klar og konkret label

UnngÄ

UnngÄ ufullstendige og uklare labels

Bruk radioknapper nÄr brukeren bare kan velge ett alternativ

Kan brukeren bare velge ett alternativ, bruker du radioknapper.

GjĂžr slik

Bruk radioknapper nÄr ett valg utelukker de andre

UnngÄ

UnngÄ checkboxer nÄr brukeren bare skal velge ett alternativ

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

La brukeren krysse av selv

UnngÄ

UnngÄ at brukeren mÄ fjerne et kryss for Ä melde seg av

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.

Eksempel pÄ plassering av checkboxer

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
Checkboxer pÄ mobil

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

ElementBeskrivelse
1. CheckboxBoksen brukeren krysser av i
2. LabelTeksten som beskriver valget
3. HjelpetekstForklarer valget (valgfritt)
Anatomien til en checkbox

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. value er 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 sette value pĂ„ selve gruppen: pĂ„ elementet i Elements og pĂ„ ref i 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 (onChange i React) med gruppen som event.target, sĂ„ event.target.value er listen med verdier. value-change (onValueChange i React) returnerer listen som array. focus og blur utlĂž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 name fĂ„r navnet til gruppen. Har ikke gruppen name, bruker den id, og ellers et generert navn.
  • PĂ„krevd. Med required mĂ„ minst Ă©n checkbox vĂŠre krysset av. Til da er alle checkboxene ugyldige med meldingen «Velg minst ett alternativ». Det gir customError, som med setCustomValidity() i HTML. En checkbox med eget required mĂ„ fortsatt krysses av.
  • Deaktivert. disabled deaktiverer alle checkboxene, som <fieldset disabled>.
  • Tile og feil. hasTile og hasError pĂ„ 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

PktCheckboxGroup

Props

Prop:
label
Type:
string
Beskrivelse:
Ledetekst for gruppen. Blir til legend i 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: '
' } }} eller setPktStrings().
Type:
string
Beskrivelse:
Tekst pÄ «Les mer»-knappen
Prop:
id?
Type:
string
Beskrivelse:
ID for gruppen. Brukes ogsÄ som navn pÄ alternativene nÄr name mangler
Prop:
name?
Type:
string
Beskrivelse:
Gis til alternativer som ikke har eget name. Uten name brukes id, 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, name og focus() 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 customError med meldingen «Velg minst ett alternativ» til ett er krysset av. Sendes ikke videre som required til 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 hasError er 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: '
' } }} eller setPktStrings().
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: '
' } }} eller setPktStrings().
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.target er gruppen, med name og value (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.target er gruppen, med name og value (gruppens verdi, verdiene til avkryssede checkboxer (string[])). Fungerer med register og Controller i 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

PktCheckbox

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: '
' } }} eller setPktStrings().
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: '
' } }} eller setPktStrings().
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