Radio button

Release dato: 04.10.2023

Sist oppdatert: 02.10.2026

Med radioknapper velger brukeren ett av flere alternativer. Alle alternativene vises samtidig, så det er lett å sammenligne dem. Radioknapper passer best når det er fem alternativer eller færre.

Radioknapper står alltid i en gruppe. Gruppen lager du med komponenten PktRadioGroup.

Har du noen innspill til komponenten?Gi oss beskjed!

Test komponenten

Hvordan reiser du til jobb?
Velg det du gjør oftest.

Kodebygger

PktRadioGroup

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
Verdien til valgt alternativ, som RadioNodeList.value. Tom streng når ingen er valgt, on for et alternativ uten value. Å sette verdien fra kode fyrer ingen events. Gruppeelementet er skjemafeltet, så value, name og focus() finnes også på elementet (Elements) og på ref (React)
Verdien som er valgt fra start i en ukontrollert gruppe. Skjema-reset går tilbake hit
Validering

Innhold

reisemate-buss (PktRadioButton)

PktRadioButton

Innhold
Hjelpetekst som vises under radiobutton
Utseende
Størrelse på tekst, hjelpetekst og tile. Uten verdi arves størrelsen fra input-wrapperen rundt
Teknisk
Unik ID for radiobutton
Navn for radiobutton. Hvis inni en PktRadioGroup, og name ikke er satt, så vil name arves fra PktRadioGroup. Radioer med samme navn hører sammen
ID-en til skjemaet feltet hører til, når feltet ligger utenfor skjemaet
Verdien som sendes når radiobutton er valgt
reisemate-tog (PktRadioButton)

PktRadioButton

Innhold
Hjelpetekst som vises under radiobutton
Utseende
Størrelse på tekst, hjelpetekst og tile. Uten verdi arves størrelsen fra input-wrapperen rundt
Teknisk
Unik ID for radiobutton
Navn for radiobutton. Hvis inni en PktRadioGroup, og name ikke er satt, så vil name arves fra PktRadioGroup. Radioer med samme navn hører sammen
ID-en til skjemaet feltet hører til, når feltet ligger utenfor skjemaet
Verdien som sendes når radiobutton er valgt
reisemate-sykkel (PktRadioButton)

PktRadioButton

Innhold
Hjelpetekst som vises under radiobutton
Utseende
Størrelse på tekst, hjelpetekst og tile. Uten verdi arves størrelsen fra input-wrapperen rundt
Teknisk
Unik ID for radiobutton
Navn for radiobutton. Hvis inni en PktRadioGroup, og name ikke er satt, så vil name arves fra PktRadioGroup. Radioer med samme navn hører sammen
ID-en til skjemaet feltet hører til, når feltet ligger utenfor skjemaet
Verdien som sendes når radiobutton er valgt

Bruk radioknapper i en gruppe

PktRadioGroup samler radioknappene og gjør dem til ett skjemafelt. Med gruppen får du:

  • én label for hele spørsmålet
  • hjelpetekst og feilmelding
  • påkrevd- eller valgfritt-merking
  • samme navn på alle radioknappene, så bare én kan være valgt
  • samme størrelse og tile på alle radioknappene
  • én verdi for hele gruppen, som du leser og setter på gruppen

Gruppen kan også inneholde et tekstfelt som vises når brukeren velger «Annet». Se Alternativet «Annet» under Implementasjon i kode.

Relaterte komponenter

Varianter

VariantBeskrivelse
StandardRadioknapp med label
TileRadioknapp med ramme. Gir tydelig avgrensning og større klikkflate
Radioknapp uten rammeRadioknapp som tile, med grå ramme

Størrelser

Radioknapper finnes i tre størrelser. Sett størrelsen på gruppen, så får alle radioknappene 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
Radioknapper i størrelsene medium, small og xsmall

Retningslinjer for bruk

Bruk radioknapper når

  • brukeren skal velge ett av flere alternativer
  • alternativene ikke kan kombineres
  • brukeren bør se alle alternativene samtidig

Unngå radioknapper når

  • brukeren kan velge flere alternativer. Bruk checkbox
  • én innstilling skal slås av eller på. Bruk switch
  • det er mer enn fem alternativer. Bruk select

Skriv tydelige labels og hjelpetekster

Label på gruppen sier hva du spør om. Labelen på hver radioknapp sier hva valget betyr, ikke bare «Ja» eller «Nei». Ikke skriv kolon etter label, og ikke skriv hele ord med store bokstaver.

Skriv hjelpetekster som hele setninger. Du kan legge hjelpetekst på gruppen eller under hver radioknapp. Trenger du mer plass eller lenker, bruker du ekspanderende hjelpetekst.

Gjør slik

Skriv kort og tydelig i labelen og alternativene

Unngå

Unngå lange eller uklare tekster i labelen og alternativene

Bruk checkbox når brukeren kan velge flere

Radioknapper passer bare når valgene ikke kan kombineres i ett svar.

Gjør slik

Bruk checkbox når brukeren kan krysse av for flere alternativer

Unngå

Unngå radioknapper når brukeren skal kunne velge flere alternativer

Antall alternativer

En gruppe trenger minst to radioknapper. Har du mer enn fem alternativer, bør du vurdere select.

Gjør slik

Bruk select når du har mange alternativer

Unngå

Unngå radioknapper når du har mange alternativer

Plassering

Plasser radioknappene under hverandre. Da er de lettest å lese.

Har du to eller tre korte alternativer, kan du legge dem på rad med layout="horizontal" på gruppen. Bryter labelene over flere linjer, skal radioknappene stå under hverandre.

Responsivitet

Radioknappene tilpasser seg skjermstørrelsen. På mobil skal de alltid stå under hverandre.

Test at teksten bryter riktig, at den er lett å lese, og at fokus flytter seg riktig.

Radioknapper på mobil

Universell utforming

Gruppen setter radioknappene i et fieldset med labelen som legend. Da leser skjermlesere opp spørsmålet sammen med hvert alternativ.

  • Brukeren flytter mellom alternativene med piltastene og velger med mellomrom.
  • Sjekk at fokusringen synes når du bruker tabulatortasten.
  • Unngå deaktiverte radioknapper. Må du deaktivere noe, forklar hvorfor og hva som skal til for å aktivere det.

Anatomi

ElementBeskrivelse
1. LabelSpørsmålet gruppen stiller
2. Påkrevd- eller valgfritt-merkingViser om brukeren må svare
3. HjelpetekstForklarer spørsmålet
4. Ekspanderende hjelpetekstMer informasjon eller lenker
5. RadioknapperAlternativene brukeren velger mellom
6. Hjelpetekst på radioknappForklarer ett alternativ
Anatomien til en gruppe med radioknapper
Gruppe med radioknapper

Implementasjon i kode

Hvordan ta komponenten i bruk?

import @oslokommune/punkt-elements/dist/pkt-radio-group.js;
import @oslokommune/punkt-elements/dist/pkt-radiobutton.js;
import { PktRadioGroup, PktRadioButton } from '@oslokommune/punkt-react';
<script src="https://punkt-cdn.oslo.kommune.no/19/elements/pkt-radio-group.js" type="module"></script>
<script src="https://punkt-cdn.oslo.kommune.no/19/elements/pkt-radiobutton.js" type="module"></script>

Gruppen holder på verdien

Når du bruker PktRadioGroup / pkt-radio-group, er gruppen skjemafeltet du skal forholde deg til. Sett name, value, onChange og required på gruppen, ikke på radioknappene.

const [transport, setTransport] = useState('')

<PktRadioGroup
  name="transport"
  label="Hvordan reiser du til jobb?"
  value={transport}
  onValueChange={setTransport}
  required
>
  <PktRadioButton id="buss" value="buss" label="Buss" />
  <PktRadioButton id="tog" value="tog" label="Tog" />
</PktRadioGroup>

Med React Hook Form registrerer du gruppen:

<PktRadioGroup label="Hvordan reiser du til jobb?" {...register('transport', { required: true })}>
  <PktRadioButton id="buss" value="buss" label="Buss" />
  <PktRadioButton id="tog" value="tog" label="Tog" />
</PktRadioGroup>

I Elements:

<pkt-radio-group name="transport" label="Hvordan reiser du til jobb?" required>
  <pkt-radiobutton id="buss" value="buss" label="Buss"></pkt-radiobutton>
  <pkt-radiobutton id="tog" value="tog" label="Tog"></pkt-radiobutton>
</pkt-radio-group>

Slik oppfører gruppen seg

  • Verdi. value er verdien til valgt radioknapp, som RadioNodeList.value i HTML. Den er tom når ingen er valgt. Du kan lese og sette value på selve gruppen: på elementet i Elements og på ref i React. 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 gruppens verdi. value-change (onValueChange i React) gir verdien direkte. focus og blur utløses når fokus kommer inn i eller forlater gruppen, ikke når fokus flytter seg mellom radioknappene. I Elements stopper radioknappenes egne events ved gruppen.
  • Fokus. focus() på gruppen flytter fokus til valgt radioknapp, eller til det første valget om ingen er valgt.
  • Navn. Radioknapper uten eget name får navnet til gruppen. Har ikke gruppen name, bruker den id, og ellers et generert navn.
  • Påkrevd og deaktivert. required gjør hele gruppen påkrevd. disabled deaktiverer alle radioknappene, som <fieldset disabled>.
  • Tile og feil. hasTile og hasError på gruppen gjelder alle radioknappene. En radioknapp kan slå dem på selv, men ikke slå dem av når gruppen har slått dem på.
  • Størrelse. Radioknappene får inputSize fra gruppen, med mindre de har sin egen.

Alternativet «Annet»

Legg et tekstfelt inne i gruppen, rett etter alternativet «Annet», og vis det når brukeren velger «Annet». Tekstfeltet har sitt eget name og sendes som et eget felt. Det påvirker ikke verdien til gruppen eller valideringen av radioknappene.

const [reise, setReise] = useState('')

<PktRadioGroup name="reise" label="Hvordan reiser du til jobb?" value={reise} onValueChange={setReise}>
  <PktRadioButton id="buss" value="buss" label="Buss" />
  <PktRadioButton id="annet" value="annet" label="Annet" />
  {reise === 'annet' && <PktTextinput id="reise-annet" name="reise-annet" label="Hva annet?" />}
</PktRadioGroup>

I Elements skjuler du tekstfeltet med hidden og disabled. Med disabled blir tekstfeltet ikke sendt med skjemaet mens det er skjult.

<pkt-radio-group id="reise" name="reise" label="Hvordan reiser du til jobb?">
  <pkt-radiobutton id="buss" value="buss" label="Buss"></pkt-radiobutton>
  <pkt-radiobutton id="annet" value="annet" label="Annet"></pkt-radiobutton>
  <pkt-textinput
    id="reise-annet"
    name="reise-annet"
    label="Hva annet?"
    hidden
    disabled
  ></pkt-textinput>
</pkt-radio-group>

<script>
  const gruppe = document.getElementById('reise')
  const annet = document.getElementById('reise-annet')
  gruppe.addEventListener('change', (event) => {
    if (event.target !== gruppe) return
    annet.hidden = annet.disabled = gruppe.value !== '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 radioknappene.

Uten gruppe

Du kan også bruke radioknapper uten PktRadioGroup, for eksempel i en PktInputWrapper med hasFieldset. Da gjelder de samme reglene som for radioknapper i HTML:

  • Radioknapper med samme name hører sammen.
  • required på én radioknapp gjør hele gruppen påkrevd. Kravet er oppfylt når én av dem er valgt.
  • I Elements får en radioknapp uten name sin id som navn. Den blir da en gruppe for seg selv.
<PktInputWrapper forId="transport" label="Hvordan reiser du til jobb?" hasFieldset>
  <PktRadioButton id="buss" name="transport" value="buss" label="Buss" />
  <PktRadioButton id="tog" name="transport" value="tog" label="Tog" />
</PktInputWrapper>

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-radio-group");

Egenskaper

PktRadioGroup

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:
Verdien til valgt alternativ, som RadioNodeList.value. Tom streng når ingen er valgt, on for et alternativ uten value. Å 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:
Verdien som er valgt 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:
Gjør hele gruppen påkrevd, som required på én radio i HTML. Kravet er oppfylt når ett alternativ er valgt
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:
PktRadioButton / pkt-radiobutton
Slot:
helptext
Beskrivelse:
Hjelpetekst med markup (Elements)

Events

Event:
change
Type:
Event
Beskrivelse:
Fyres av gruppen når brukeren velger et alternativ. Skjemafeltet er gruppen: event.target er gruppen, med name og value (gruppens verdi, verdien til valgt radio (streng)). 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 velger et alternativ. Skjemafeltet er gruppen: event.target er gruppen, med name og value (gruppens verdi, verdien til valgt radio (streng)). Fungerer med register og Controller i React Hook Form
Event:
onValueChange
Type:
string
Beskrivelse:
Kalles med gruppens nye verdi når brukeren velger et alternativ
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

PktRadioButton

Props

Prop:
id
Type:
string
Beskrivelse:
Unik ID for radiobutton
Prop:
name?
Type:
string
Beskrivelse:
Navn for radiobutton. Hvis inni en PktRadioGroup, og name ikke er satt, så vil name arves fra PktRadioGroup. Radioer med samme navn hører sammen
Prop:
form?
Type:
string
Beskrivelse:
ID-en til skjemaet feltet hører til, når feltet ligger utenfor skjemaet
Prop:
label
Type:
string
Beskrivelse:
Tekst i label for radiobutton
Prop:
checked?
Type:
boolean
Standardverdi:
false
Beskrivelse:
Er radiobutton valgt?
Prop:
defaultChecked?
Type:
boolean
Standardverdi:
false
Beskrivelse:
Skal radiobutton være valgt som standard?
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:
Er radiobutton deaktivert?
Prop:
checkHelptext?
Type:
string
Beskrivelse:
Hjelpetekst som vises under radiobutton
Prop:
value?
Type:
string
Beskrivelse:
Verdien som sendes når radiobutton er valgt
Prop:
hasError?
Type:
boolean
Standardverdi:
false
Beskrivelse:
Indikerer om radiobutton har en feil
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:
Hendelse som utløses når radiobutton endres