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

Kom i gang

Result
Loading...
Kode
Live Editor
<Button>Send inn</Button>

Eksempler

Varianter

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

Result
Loading...
Kode
Live Editor
<>
  <Button variant="primary">Primary</Button>
  <Button variant="secondary">Secondary</Button>
  <Button variant="tertiary">Tertiary</Button>
</>

Fare

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

Result
Loading...
Kode
Live Editor
<>
  <Button danger>Slett konto</Button>
  <Button variant="secondary" danger>Avbryt overføring</Button>
</>

Størrelser

Result
Loading...
Kode
Live Editor
<>
  <Button size="sm">Liten</Button>
  <Button>Medium (standard)</Button>
  <Button size="lg">Stor</Button>
</>

Full bredde

Result
Loading...
Kode
Live Editor
<Button width="full">Fortsett</Button>

Med ikon

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

Result
Loading...
Kode
Live Editor
<Button>
  <Icon name="sparing" />
  Pålogget
</Button>

Ikonknapp (uten tekst)

Knapper med bare ikon ha aria-label som beskriver handlingen.

Result
Loading...
Kode
Live Editor
<Button aria-label="Gå til sparing">
  <Icon name="sparing" />
</Button>
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 for skjermlesere og loadingLabel annonseres.

Result
Loading...
Kode
Live Editor
<Button loading loadingLabel="Sender inn…">
  Send inn
</Button>

Deaktivert

Result
Loading...
Kode
Live Editor
<Button disabled>Deaktivert</Button>

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

Result
Loading...
Kode
Live Editor
<Button as="a" href="https://www.sparebank1.no">
  Gå til sparebank1.no
</Button>

Retningslinjer

Bruk riktig komponent: handling vs. navigasjon

Knapper skal brukes når brukeren utfører en handling som påvirker systemet — som å lagre, sende eller bekrefte noe. Dersom brukeren kun skal navigere til en ny side uten at noe behandles, skal lenke brukes i stedet. Skillet er viktig både for brukerens forventninger og for tilgjengelighet.

Tydelig handling i label gir forutsigbarhet

Knappetekst skal beskrive hva som skjer når brukeren klikker. Den bør være handlingsorientert og konkret. "Lagre endringer" er tydeligere enn "OK", fordi den forklarer hva handlingen faktisk gjør.

Unngå generiske labels

Generiske tekster som "OK", "Send" eller "Neste" kan være uklare uten kontekst. Der det er mulig, bør teksten spesifisere hva som skjer — som "Send søknad" eller "Gå til betaling".

Teksten skal være kort og énlinjet

Knappetekst skal være kort og presis. Korte tekster gjør knapper lettere å skanne og sikrer at layouten holder seg stabil på tvers av skjermstørrelser.

Hierarki skaper struktur og prioritering

Knapper skal ha et tydelig visuelt hierarki som viser hva som er viktigst å gjøre:

  • Primærknapp — hovedhandlingen i en visning
  • Sekundærknapp — alternative handlinger
  • Tertiærknapp — mindre viktige eller støttende handlinger
  • Destruktiv knapp — handlinger som sletter eller endrer data permanent

Dersom en tertiær knapp brukes alene, skal den alltid kombineres med ikon. Dette sikrer at den fremstår som en handling og ikke forveksles med vanlig tekst.

Én primær handling per visning

Hver side eller seksjon bør ha én tydelig primær handling. Denne bør fremheves visuelt slik at det er klart hva brukeren skal gjøre videre. Flere primære knapper skaper konkurranse om oppmerksomheten og gjør det vanskeligere å ta en beslutning.

Plassering og rekkefølge påvirker valg

Når flere knapper plasseres ved siden av hverandre, skal primærknappen stå først. Et unntak er navigasjon mellom steg, som "Forrige" og "Neste" — der skal den sekundære knappen "Forrige" stå først. Dette samsvarer med brukerens forventning om retning og progresjon.

Ikonknapper krever ekstra tydelighet

Knapper som kun består av ikon er forbeholdt løsninger for mer erfarne brukere, siden handlingen ikke beskrives med tekst. Unntak kan gjøres for godt etablerte ikoner som lukk eller slett — men knappen må alltid ha en tilgjengelig tekst via aria-label.

Bekreft 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 bruk disabled uten forklaring

Disabled-knapper kan være vanskelig å forstå hvis det ikke er tydelig hvorfor de ikke kan brukes. Vurder om handlingen heller bør skjules, eller om det bør forklares hva som mangler for at knappen skal bli aktiv.

Tilpass bredde til innhold og kontekst

Knapper bør som hovedregel tilpasse seg innholdet sitt. Full bredde kan brukes der det gir mening — for eksempel på mobil — men bør brukes bevisst for å unngå at alle handlinger fremstår som like viktige.

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 — bruk <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.
  • aria-disabled="true" settes ved loading=true slik at skjermlesere vet at knappen midlertidig er utilgjengelig.
  • aria-label byttes til loadingLabel ved loading slik at skjermleser-brukere vet hva som skjer.
  • 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-08 — 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 24x24px klikkflate (padding + innhold).
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
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 data-attributter

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

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>

Relatert