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.
Test komponenten
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
Når brukeren kan velge flere alternativer.
Når det er mer enn fem alternativer.
Når brukeren skal slå én innstilling av eller på.
Varianter
| Variant | Beskrivelse |
|---|---|
| Standard | Radioknapp med label |
| Tile | Radioknapp med ramme. Gir tydelig avgrensning og større klikkflate |
Størrelser
Radioknapper finnes i tre størrelser. Sett størrelsen på gruppen, så får alle radioknappene 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 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
Unngå
Bruk checkbox når brukeren kan velge flere
Radioknapper passer bare når valgene ikke kan kombineres i ett svar.
Gjør slik
Unngå
Antall alternativer
En gruppe trenger minst to radioknapper. Har du mer enn fem alternativer, bør du vurdere select.
Gjør slik
Unngå
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.
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
| Element | Beskrivelse |
|---|---|
| 1. Label | Spørsmålet gruppen stiller |
| 2. Påkrevd- eller valgfritt-merking | Viser om brukeren må svare |
| 3. Hjelpetekst | Forklarer spørsmålet |
| 4. Ekspanderende hjelpetekst | Mer informasjon eller lenker |
| 5. Radioknapper | Alternativene brukeren velger mellom |
| 6. Hjelpetekst på radioknapp | Forklarer ett alternativ |
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.
valueer verdien til valgt radioknapp, somRadioNodeList.valuei HTML. Den er tom når ingen er valgt. Du kan lese og settevaluepå selve gruppen: på elementet i Elements og pårefi React. 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 gruppens verdi.value-change(onValueChangei React) gir verdien direkte.focusogblurutlø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
namefår navnet til gruppen. Har ikke gruppenname, bruker denid, og ellers et generert navn. - Påkrevd og deaktivert.
requiredgjør hele gruppen påkrevd.disableddeaktiverer alle radioknappene, som<fieldset disabled>. - Tile og feil.
hasTileoghasErrorpå 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
inputSizefra 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
namehører sammen. requiredpå é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
namesinidsom 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
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:
- Verdien til valgt alternativ, som
RadioNodeList.value. Tom streng når ingen er valgt,onfor et alternativ utenvalue. Å 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:
- 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
requiredpå é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
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:
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.targeter gruppen, mednameogvalue(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.targeter gruppen, mednameogvalue(gruppens verdi, verdien til valgt radio (streng)). Fungerer medregisterogControlleri 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
Props
- Prop:
id- Type:
string- Beskrivelse:
- Unik ID for radiobutton
- Prop:
name?- Type:
string- Beskrivelse:
- Navn for radiobutton. Hvis inni en PktRadioGroup, og
nameikke er satt, så vilnamearves 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: '…' } }}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:
- Hendelse som utløses når radiobutton endres