Skip to main content

Button

Button lar brukeren utføre en handling, som å sende inn et skjema, lagre endringer eller navigere videre i en prosess.

Egnet til

  • Handlinger som skjer umiddelbart (f.eks. lagre, sende, bekrefte)
  • Navigasjon mellom steg i en prosess
  • Primære og sekundære handlinger i en visning
  • Handlinger som påvirker innhold eller systemtilstand

Uegnet til

  • Navigasjon til nye sider uten at noe utføres — bruk lenke (<a>) i stedet
  • Handlinger som ikke er tilgjengelige eller ikke kan utføres
  • Visuell dekorasjon uten funksjon
  • For mange samtidige valg

Bruk

Laster...

Eksempler

Varianter

primary er standardvarianten og bør brukes for den viktigste handlingen på siden. Unngå to primary-knapper ved siden av hverandre.

Laster...

Fare

Bruk danger for destruktive handlinger som sletting eller avbryt-operasjoner der konsekvensen er vanskelig å reversere.

Laster...

Størrelser

Laster...

Full bredde

Laster...

Med ikon

Ikon-knapper med tekst trenger ingen ekstra ARIA — teksten er den tilgjengelige labelen. Plasser ikonet foran teksten.

Laster...

Ikonknapp (uten tekst)

Knapper med bare ikon ha aria-label som beskriver handlingen. Bruk iconOnly for å gjøre knappen rund.

Laster...
Ikonknapp uten aria-label

En knapp med bare ikon og ingen aria-label er usynlig for skjermlesere. Brukeren hører bare "knapp" — ingen beskrivelse av hva den gjør.

Laster

Når en asynkron operasjon er i gang, sett loading og loadingLabel. Knappen deaktiveres, en spinner vises, og loadingLabel annonseres til skjermleseren.

I React erstattes children (inkludert ikon) automatisk med spinner og loadingLabel. I HTML må du selv erstatte innholdet og sette disabled + data-loading="true".

Spinneren arver knappens tekstfarge, så den får riktig kontrast i alle varianter — også på fylt primary-bakgrunn.

Laster...

Deaktivert

Laster...

Vurder om brukeren i stedet bør se en forklaring på hvorfor handlingen ikke er tilgjengelig. En disabled-knapp uten kontekst er forvirrende.

Som lenke

Bruk as="a" når knappen navigerer til en URL. Den beholder button-styling, men rendres som <a>.

Laster...

Varianter, størrelser og ikoner virker likt på lenke-knapper. Merk at type ikke settes når komponenten rendrer et anker — attributtet er kun gyldig på <button>.

Laster...

Retningslinjer

Bruk knapp til handling, lenke til navigasjon

En knapp gjør noe: lagrer, sender, bekrefter. En lenke flytter brukeren et annet sted. Ser de like ut, gjetter brukeren, og skjermleseren annonserer feil type element.

Skriv hva knappen gjør

"Lagre endringer" er tydeligere enn "OK", og "Send søknad" tydeligere enn "Send". Teksten skal kunne leses alene, uten hjelp fra det som står rundt: en skjermleserbruker som navigerer mellom knapper hører bare labelen.

Hold den samtidig kort nok til å stå på én linje. To ord er ofte nok, og da holder også layouten seg stabil på smale skjermer.

Bruk hierarkiet til å vise hva som er viktigst

Knappene har fire nivåer, og de er der for å prioritere:

NivåBrukes til
Primærhovedhandlingen i visningen
Sekundæralternative handlinger
Tertiærstøttende handlinger av mindre betydning
Destruktivsletting og andre endringer som ikke kan angres

Står en tertiærknapp alene, gi den et ikon. Uten ikon ser den ut som vanlig tekst, og folk oppdager ikke at den kan trykkes.

Bruk én primærknapp per visning

Én knapp skal svare på "hva gjør jeg nå?". Er det to primærknapper på samme skjerm, konkurrerer de, og brukeren må ta et valg du egentlig kunne tatt selv.

Plasser primærknappen først

Ligger flere knapper på rad, kommer primærknappen først. Unntaket er stegvis navigasjon: der står "Forrige" til venstre for "Neste", fordi rekkefølgen følger retningen brukeren beveger seg i.

Gi ikonknapper en aria-label

En knapp med bare ikon sier ingenting til en skjermleser før du gir den aria-label. Selv med labelen på plass krever den at brukeren kjenner ikonet, så hold deg til de innarbeidede (lukk, slett, rediger) eller sett tekst på knappen.

Bekreft destruktive handlinger

Sletting og andre endringer som ikke kan angres, skal enten bekreftes i en Modal eller merkes med danger-prop. Helst begge: fargen varsler, dialogen stopper.

Ikke bruk disabled uten forklaring

En grå knapp uten forklaring er en blindvei. Skriv hva som mangler for at den skal bli aktiv, eller skjul handlingen til den er relevant.

Tilpass bredden til innholdet

Knapper følger teksten sin. Full bredde er nyttig i mobile skjemaer og modaler, men brukt overalt gjør det at alle handlinger ser like viktige ut.

Universell utforming

Hva du selv må sørge for

  • Ikonknapper må ha aria-label. Knapper uten synlig tekst er meningsløse for skjermlesere uten en beskrivende label. Labelen skal beskrive handlingen, ikke ikonet: aria-label="Slett melding", ikke aria-label="Søppelkasse-ikon".
  • Gi loadingLabel ved loading-tilstand. Uten denne er knappen anonym for skjermlesere mens den laster.
  • Unngå disabled som standard. Disabled-knapper sier ikke brukeren hva som mangler. Der det er mulig, la knappen være aktiv og gi tydelig feilmelding ved innsending.
  • Bruk riktig element: <button> (standard) for handlinger og as="a" / <a> for navigasjon. Ikke legg click-handlers på <div> eller <span>.
  • Ikke stol på farge alene. Forskjeller mellom knappetyper må ikke kun kommuniseres med farge. Tekst og eventuelt ikon må også skille dem fra hverandre.
  • Gi tilbakemelding på handling. Når en knapp aktiveres, skal brukeren få tydelig tilbakemelding. Bruk loading-tilstanden for asynkrone operasjoner for å hindre usikkerhet og gjentatte klikk.

Hva komponenten gjør automatisk

  • type="button" settes som standard så knappen ikke sender inn skjema utilsiktet.
  • disabled settes ved loading=true slik at knappen ikke kan aktiveres mens operasjonen pågår.
  • aria-label byttes til loadingLabel ved loading slik at skjermleser-brukere vet hva som skjer.
  • Spinner rendres automatisk ved loading=true og erstatter eventuelle ikoner.
  • Fokusindikator via :focus-visible — synlig for tastaturbrukere, ikke for mus.

Tastaturnavigasjon

TastHandling
TabFlytter fokus til knappen
Shift+TabFlytter fokus til forrige fokuserbare element
EnterAktiverer knappen
SpaceAktiverer knappen

Skjermleser

  • Ved fokus: "[knappetekst], knapp"
  • Ikonknapp: "[aria-label], knapp"
  • Ved loading: "[loadingLabel], knapp, deaktivert"
  • Danger-variant: ingen ekstra annonsering — den visuelle fare-indikasjonen er ikke eksponert semantisk. Konteksten rundt knappen må forklare konsekvensen.

WCAG-kriterier

Sist gjennomgått: 2026-05-29 — alle 56 WCAG 2.2-kriterier vurdert

WCAG-kriterier11 ditt ansvar · 14 håndtert · 41 ikke relevant · 0 ikke på plass
Ditt ansvar (11)
KriteriumNivåHva du må gjøre
4.1.2 Navn, rolle, verdiASett aria-label på ikonknapper. En knapp med bare ikon og ingen synlig tekst er meningsløs for skjermlesere uten en beskrivende label. Bruk aria-label="Last opp vedlegg" direkte på knappen. Labelen skal beskrive handlingen, ikke ikonet.
2.4.6 Overskrifter og ledeteksterAASett aria-label på ikonknapper. En knapp med bare ikon og ingen synlig tekst er meningsløs for skjermlesere uten en beskrivende label. Bruk aria-label="Last opp vedlegg" direkte på knappen. Labelen skal beskrive handlingen, ikke ikonet.
3.3.1 Identifikasjon av feilAUnngå disabled som standard — foretrekk tydelig feilmelding. Disabled-knapper sier ikke brukeren hva som mangler. Der det er mulig, la knappen være aktiv og gi tydelig feilmelding ved innsending. Hvis disabled brukes, sørg for at brukeren har fått forklart hvorfor.
3.3.3 Forslag ved feilAAUnngå disabled som standard — foretrekk tydelig feilmelding. Disabled-knapper sier ikke brukeren hva som mangler. Der det er mulig, la knappen være aktiv og gi tydelig feilmelding ved innsending. Hvis disabled brukes, sørg for at brukeren har fått forklart hvorfor.
4.1.2 Navn, rolle, verdiABruk semantisk HTML-element. Bruk standard <button> for handlinger og <a> (via as="a") for navigasjon. Ikke bruk <div> eller <span> som knapp — det bryter nativ tastaturnavigasjon og skjermleser-annonsering.
4.1.2 Navn, rolle, verdiAGi loadingLabel ved loading-tilstand. Når loading=true vises loadingLabel som knappens innhold og aria-label. Uten loadingLabel er knappen anonym for skjermlesere under lasting. Bruk norsk tekst som «Sender inn…» eller «Laster…».
3.3.1 Identifikasjon av feilAGi loadingLabel ved loading-tilstand. Når loading=true vises loadingLabel som knappens innhold og aria-label. Uten loadingLabel er knappen anonym for skjermlesere under lasting. Bruk norsk tekst som «Sender inn…» eller «Laster…».
1.3.3 Sensoriske egenskaperAKombiner tertiærknapp alene med ikon. En tertiærknapp uten tekst og ikon kan forveksles med vanlig tekst. Dersom tertiærknapp brukes uten omgivende kontekst som tydelig viser at det er en handling, skal den alltid ha et ikon.
2.4.6 Overskrifter og ledeteksterAAKombiner tertiærknapp alene med ikon. En tertiærknapp uten tekst og ikon kan forveksles med vanlig tekst. Dersom tertiærknapp brukes uten omgivende kontekst som tydelig viser at det er en handling, skal den alltid ha et ikon.
3.3.4 Forhindring av feil (juridisk, økonomisk, data)AABekreft destruktive handlinger. Handlinger som sletter eller endrer data permanent bør enten kreve en ekstra bekreftelse (f.eks. en modal) eller tydelig merkes som destruktive med danger-prop. Ikke stol på at farge alene kommuniserer alvorlighetsgraden.
1.4.1 Bruk av fargeABekreft destruktive handlinger. Handlinger som sletter eller endrer data permanent bør enten kreve en ekstra bekreftelse (f.eks. en modal) eller tydelig merkes som destruktive med danger-prop. Ikke stol på at farge alene kommuniserer alvorlighetsgraden.
Håndtert av komponenten (14)
KriteriumNivåHva komponenten gjør
1.3.1 Informasjon og relasjonerANative <button>-element med implisitt rolle. Tekst-innhold gir tilgjengelig navn automatisk.
1.3.2 Meningsfull rekkefølgeAInnholdet følger naturlig lekkefølge i DOM.
1.4.1 Bruk av fargeADanger-tilstand kommuniseres med fargeendring og semantisk klasse — ikke farge alene.
1.4.4 Endre tekststørrelseAARelative enheter — skalerer korrekt ved 200 % zoom.
1.4.10 OmflytAAReflower korrekt ned til 320px viewport.
1.4.11 Kontrast for ikke-tekstlig innholdAAFokusindikator oppfyller 3:1 kontrastkrav.
2.1.1 TastaturANative <button> aktiveres med Enter og Space. Fullt opererbart med tastatur.
2.1.2 Ingen tastaturfelleAFokus kan navigeres ut med Tab og Shift+Tab.
2.4.3 FokusrekkefølgeAFølger naturlig tab-rekkefølge i DOM.
2.4.7 Synlig fokusAATydelig fokusindikator via :focus-visible med outline-token.
2.5.8 Målstørrelse (minimum)AAMinimumsstørrelse md oppfyller 24×24 px klikkflate. iconOnly bruker aspect-ratio: 1/1 og lik padding på alle sider — klikkflaten er alltid kvadratisk.
3.2.1 Ved fokusAFokus trigger ingen kontekstendring.
1.4.3 Kontrast (minimum)AATekst- og ikonfarge i alle varianter bruker --ix-color-component-button-*-foreground-* tokens mot sine respektive fill-tokens. Disabled-tilstand (opacity: 0.4) er unntatt fra kravet per WCAG.
4.1.2 Navn, rolle, verdiANative <button> med implisitt rolle=button. Tilgjengelig navn fra innhold eller aria-label. Native disabled settes ved loading.
Ikke relevant (41)
KriteriumNivåHvorfor ikke relevant
1.1.1 Ikke-tekstlig innholdAKnappen har ingen ikke-tekstlig innhold som bilder — ikon-barn er dekorativt og skjules med aria-hidden.
1.2.1 Bare lyd og bare video (forhåndsinnspilt)AIngen medieelementer.
1.2.2 Teksting (forhåndsinnspilt)AIngen medieelementer.
1.2.3 Synstolking eller mediealternativ (forhåndsinnspilt)AIngen medieelementer.
1.2.4 Teksting (direkte)AAIngen medieelementer.
1.2.5 Synstolking (forhåndsinnspilt)AAIngen medieelementer.
1.3.3 Sensoriske egenskaperAKnappen formidler ikke instruksjoner — den utfører en handling.
1.3.4 VisningsretningAAIngen fast orientering — tilpasser seg visningsretning.
1.3.5 Identifiser formål med inndataAAIkke et skjemafelt som ber om personlig informasjon.
1.4.2 Styring av lydAIngen lydelementer.
1.4.5 Bilder av tekstAAIngen bilder av tekst.
1.4.12 TekstavstandAA
1.4.13 Innhold ved hover eller fokusAA
2.1.4 TastatursnarveierAIngen egendefinerte tastatursnarveier.
2.2.1 Justerbar hastighetAIngen tidsbegrensede funksjoner.
2.2.2 Pause, stopp, skjulAIngen animasjon eller automatisk oppdatering.
2.3.1 Terskelverdi på tre glimtAIngen blinkende eller glimtende innhold.
2.4.1 Hoppe over blokkerASidekrav — gjelder ikke enkeltkomponenter.
2.4.2 SidetitlerASidekrav — gjelder ikke enkeltkomponenter.
2.4.4 Formål med lenke (i kontekst)ALenkeknapper (as="a") må ha meningsfull tekst — det er konsumentens ansvar.
2.4.5 Flere måterAASidekrav — gjelder ikke enkeltkomponenter.
2.4.6 Overskrifter og ledeteksterAA
2.4.11 Fokus ikke skjult (minimum)AAIngen sticky/overlappende elementer som kan skjule fokus.
2.5.1 PekerbevegelserAIngen drag-and-drop eller sveipebevegelser.
2.5.2 Avbryt pekerANative button-element — nettleseren håndterer pekerinteraksjon.
2.5.4 BevegelsesaktiveringAIngen bevegelsesbasert interaksjon.
2.5.6 Samtidige inndatamekanismerA
2.5.7 DrabevegelserAIngen drag-and-drop.
3.1.1 Språk på sidenASidekrav — gjelder ikke enkeltkomponenter.
3.1.2 Språk på deler av innholdAAKomponenten setter ikke lang-attributt — innhold er på sidespråket.
3.2.2 Ved inndataAKnappen trigger ingen automatisk kontekstendring ved fokus.
3.2.3 Konsistent navigasjonAASidekrav — gjelder ikke enkeltkomponenter.
3.2.4 Konsistent identifikasjonAASystemkrav — gjelder konsistens på tvers av sider, ikke enkeltkomponenter.
3.2.6 Konsistent hjelpASidekrav — gjelder plassering av hjelpefunksjon på tvers av sider.
3.3.1 Identifikasjon av feilA
3.3.2 Ledetekster eller instruksjonerA
3.3.3 Forslag ved feilAA
3.3.4 Forhindring av feil (juridisk, økonomisk, data)AAFlytkrav — gjelder bekreftelse/reversering av transaksjoner, ikke enkeltfelter.
3.3.7 Redundant oppføringAFlytkrav — gjelder at brukeren ikke skal gjenta informasjon i en prosess.
3.3.8 Tilgjengelig autentisering (minimum)AAIkke en autentiseringskomponent.
4.1.3 StatusmeldingerAAKnappen genererer ingen statusmeldinger selv.

Props / API

PropTypeStandardBeskrivelse
variant'primary' | 'secondary' | 'tertiary''primary'Visuell variant
dangerbooleanfalseBruk fare-farger for destruktive handlinger
loadingbooleanfalseVis lasteindikator og deaktiver for skjermlesere
loadingLabelstringTekst vist og annonsert av skjermleser under lasting. Påkrevd når loading=true
size'sm' | 'md' | 'lg''md'Størrelse
width'full' | 'auto''auto''full' strekker knappen til full bredde av forelderen
iconOnlybooleanfalseGjør knappen rund — bruk kun når innholdet er et enkelt ikon. Krever aria-label
asElementType'button'Render som annet element, f.eks. 'a' for lenke-knapper
aria-labelstringSkjult label for skjermlesere. Påkrevd for ikonknapper uten synlig tekst
disabledbooleanDeaktiverer knappen helt (nativ HTML-attributt)

I tillegg støttes alle standard HTML-knapp-attributter (onClick, onFocus, type, form, name, value, tabIndex osv.) og settes direkte på <button>-elementet.

Tilpasning med CSS

Trenger du ix-button-stylingen på HTML du setter sammen selv, uten React-komponenten, kan du bruke klassene direkte.

Tilgjengelige klasser og selektorer

Element/tilstandSelektor / attributt
Knapp.ix-button
Variantdata-variant="primary" / "secondary" / "tertiary"
Fare-tilstanddata-danger="true"
Liten størrelsedata-size="sm"
Stor størrelsedata-size="lg"
Full bredde.ix-w-full
Ikonknapp (rund)data-icon-only
Lasterdata-loading="true" + disabled (innhold må erstattes med <span class="ix-spinner"> + tekst)

Eksempel: ren HTML

<button class="ix-button" data-variant="primary" type="button">
Send inn
</button>

<a class="ix-button" data-variant="secondary" href="/tilbake">
Avbryt
</a>

<button class="ix-button" data-variant="primary" data-danger="true" type="button">
Slett konto
</button>

<button class="ix-button" data-variant="secondary" data-icon-only type="button" aria-label="Slett">
<!-- ix-icon her -->
</button>

Relatert