Spinner
Spinner viser at noe lastes inn eller at en operasjon pågår. Den er ikke-interaktiv og kommuniserer utelukkende tilstand.
Egnet til
- Sideinnlasting eller data-henting som tar mer enn ~300 ms
- Bakgrunnsoperasjoner der brukeren bør vite at noe skjer
- Inline-lasting i deler av en side
Uegnet til
- Fremdrift der prosenten er kjent — bruk ProgressBar i stedet
- Svært korte operasjoner (under ~300 ms) der spinneren vil flimre
- Som eneste tilbakemelding på en brukerhandling uten etterfølgende bekreftelse
Kom i gang
Result
Loading...
Kode
Live Editor
<Spinner />
Eksempler
Med synlig tekst
label vises under hjulet og brukes som aria-label om ikke loadingLabel er satt.
Result
Loading...
Kode
Live Editor
<Spinner label="Laster inn data..." />
Størrelser
Result
Loading...
Kode
Live Editor
<> <Spinner size="sm" aria-label="Liten spinner" /> <Spinner size="md" aria-label="Middels spinner" /> <Spinner size="lg" aria-label="Stor spinner" /> </>
Universell utforming
Hva du selv må sørge for
- Gi alltid en meningsfull
loadingLabel— standard-labelen (Laster...) er et nødanker. Gi en kontekstuell tekst somloadingLabel="Henter kontooversikt..."der du kan. - Sørg for at spinneren er synlig i konteksten — farge-token (
--ix-color-border-info-default) kan ha dårlig kontrast mot noen bakgrunner. Sjekk kontrasten i den faktiske konteksten. - Gi etterfølgende tilbakemelding — skjermlesere hører status-meldingen, men bør også høre hva som skjedde etter lasting. Sørg for at resultatsiden eller innholdet er annonsert korrekt.
Hva komponenten gjør automatisk
role="status"setter en ARIA live region (politeness: polite) — skjermlesere annonsereraria-label-verdien uten å avbryte pågående tale.aria-labelsettes automatisk basert påloadingLabel→label→'Laster...'.prefers-reduced-motionstopper animasjonen helt for brukere som har slått av bevegelse i operativsystemet.
Skjermleser
- Når spinneren vises: skjermlesere annonserer aria-label-verdien via role="status" (polite live region)
- Standard: "Laster..."
- Med loadingLabel: den angitte teksten leses opp
- Med label (uten loadingLabel): label-teksten brukes som aria-label og leses opp
WCAG-kriterier
Sist gjennomgått: 2026-05-28 — alle 56 WCAG 2.2-kriterier vurdert
WCAG-kriterier4 ditt ansvar · 3 håndtert · 51 ikke relevant · 0 ikke på plass
Ditt ansvar (4)
| Kriterium | Nivå | Hva du må gjøre |
|---|---|---|
| 4.1.3 Statusmeldinger | AA | Gi en kontekstuell loadingLabel. Standard-labelen ('Laster...') gir ingen kontekst om hva som lastes. Bruk loadingLabel='Henter kontooversikt...' e.l. slik at skjermleser-brukere forstår hva operasjonen gjelder. |
| 2.4.6 Overskrifter og ledetekster | AA | Gi en kontekstuell loadingLabel. Standard-labelen ('Laster...') gir ingen kontekst om hva som lastes. Bruk loadingLabel='Henter kontooversikt...' e.l. slik at skjermleser-brukere forstår hva operasjonen gjelder. |
| 1.4.11 Kontrast for ikke-tekstlig innhold | AA | Sjekk kontrast i konteksten. Spinner-hjulet bruker --ix-color-foreground-main-default. Denne fargen er optimalisert for standard bakgrunn. Dersom spinneren vises over annen bakgrunn (farget panel, bilde) må konsumenten verifisere at kontrastforholdet oppfyller 3:1 (WCAG 1.4.11 for UI-komponenter). |
| 4.1.3 Statusmeldinger | AA | Gi etterfølgende tilbakemelding når lasting er ferdig. Spinner annonserer at noe lastes, men gir ingen tilbakemelding om resultatet. Sørg for at innholdet som vises etter lasting er korrekt annonsert — enten via en ny ARIA live region, fokus-flytt, eller naturlig DOM-rekkefølge. |
Håndtert av komponenten (3)
| Kriterium | Nivå | Hva komponenten gjør |
|---|---|---|
| 1.3.1 Informasjon og relasjoner | A | role="status" gir semantisk live region. Tilgjengelig navn settes via aria-label automatisk. |
| 2.2.2 Pause, stopp, skjul | A | prefers-reduced-motion: reduce stopper animasjonen helt — ingen bevegelse for brukere med nedsatt toleranse. |
| 4.1.3 Statusmeldinger | AA | role="status" (polite live region) annonserer aria-label for skjermlesere uten å avbryte pågående tale. |
Ikke relevant (51)
| Kriterium | Nivå | Hvorfor ikke relevant |
|---|---|---|
| 1.1.1 Ikke-tekstlig innhold | A | Spinner har ingen ikke-tekstlig innhold — animasjonen er CSS-generert og ikke en <img>. |
| 1.2.1 Bare lyd og bare video (forhåndsinnspilt) | A | Ingen medieelementer. |
| 1.2.2 Teksting (forhåndsinnspilt) | A | Ingen medieelementer. |
| 1.2.3 Synstolking eller mediealternativ (forhåndsinnspilt) | A | Ingen medieelementer. |
| 1.2.4 Teksting (direkte) | AA | Ingen medieelementer. |
| 1.2.5 Synstolking (forhåndsinnspilt) | AA | Ingen medieelementer. |
| 1.3.2 Meningsfull rekkefølge | A | Kun ett element — ingen rekkefølge-problematikk. |
| 1.3.3 Sensoriske egenskaper | A | Spinner gir ingen instruksjoner. |
| 1.3.4 Visningsretning | AA | Spinner har ingen orientasjons-avhengig funksjonalitet. |
| 1.3.5 Identifiser formål med inndata | AA | Ikke et skjemafelt. |
| 1.4.1 Bruk av farge | A | Spinner formidler ikke informasjon med farge alene — animasjonen + aria-label kommuniserer tilstand. |
| 1.4.2 Styring av lyd | A | Ingen lyd. |
| 1.4.3 Kontrast (minimum) | AA | Spinner har ingen tekst (label er valgfri og arver foreldres typografi). |
| 1.4.4 Endre tekststørrelse | AA | Ingen tekst i selve komponenten. |
| 1.4.5 Bilder av tekst | AA | Ingen bilde av tekst. |
| 1.4.10 Omflyt | AA | Spinner er inline og reflower naturlig. |
| 1.4.12 Tekstavstand | AA | Ingen typografi-egenskaper i selve komponenten. |
| 1.4.13 Innhold ved hover eller fokus | AA | Spinner er ikke hover/fokus-utløst innhold. |
| 2.1.1 Tastatur | A | Spinner er ikke-interaktiv — ingen tastaturbetjening er nødvendig. |
| 2.1.2 Ingen tastaturfelle | A | Spinner er ikke-interaktiv — ingen fokus-felle. |
| 2.1.4 Tastatursnarveier | A | Ingen hurtigtaster. |
| 2.2.1 Justerbar hastighet | A | Spinner har ingen tidsbegrensning. |
| 2.3.1 Terskelverdi på tre glimt | A | Animasjonen blinker ikke — jevn rotasjon under terskel for anfall. |
| 2.4.1 Hoppe over blokker | A | Sidekrav — gjelder ikke enkeltkomponenter. |
| 2.4.2 Sidetitler | A | Sidekrav — gjelder ikke enkeltkomponenter. |
| 2.4.3 Fokusrekkefølge | A | Spinner er ikke fokuserbar. |
| 2.4.4 Formål med lenke (i kontekst) | A | Spinner er ikke en lenke. |
| 2.4.5 Flere måter | AA | Sidekrav — gjelder ikke enkeltkomponenter. |
| 2.4.6 Overskrifter og ledetekster | AA | Spinner er ikke en overskrift eller label. |
| 2.4.7 Synlig fokus | AA | Spinner er ikke-interaktiv og mottar ikke fokus. |
| 2.4.11 Fokus ikke skjult (minimum) | AA | Spinner er ikke-interaktiv og mottar ikke fokus. |
| 2.5.1 Pekerbevegelser | A | Spinner er ikke-interaktiv. |
| 2.5.2 Avbryt peker | A | Spinner er ikke-interaktiv. |
| 2.5.4 Bevegelsesaktivering | A | Spinner er ikke-interaktiv. |
| 2.5.6 Samtidige inndatamekanismer | A | Spinner er ikke-interaktiv. |
| 2.5.7 Drabevegelser | A | Spinner er ikke-interaktiv. |
| 2.5.8 Målstørrelse (minimum) | AA | Spinner er ikke-interaktiv. |
| 3.1.1 Språk på siden | A | Ikke relevant for en enkeltkomponent. |
| 3.1.2 Språk på deler av innhold | AA | Spinner endrer ikke språk. |
| 3.2.1 Ved fokus | A | Spinner mottar ikke fokus. |
| 3.2.2 Ved inndata | A | Spinner har ingen skjemainput. |
| 3.2.3 Konsistent navigasjon | AA | Sidekrav — gjelder ikke enkeltkomponenter. |
| 3.2.4 Konsistent identifikasjon | AA | Systemkrav — gjelder konsistens på tvers av sider, ikke enkeltkomponenter. |
| 3.2.6 Konsistent hjelp | A | Sidekrav — gjelder plassering av hjelpefunksjon på tvers av sider. |
| 3.3.1 Identifikasjon av feil | A | Spinner er ikke et skjemafelt. |
| 3.3.2 Ledetekster eller instruksjoner | A | Spinner er ikke et skjemafelt. |
| 3.3.3 Forslag ved feil | AA | Spinner er ikke et skjemafelt. |
| 3.3.4 Forhindring av feil (juridisk, økonomisk, data) | AA | Spinner er ikke et skjemafelt. |
| 3.3.7 Redundant oppføring | A | Spinner er ikke et skjemafelt. |
| 3.3.8 Tilgjengelig autentisering (minimum) | AA | Spinner er ikke et skjemafelt. |
| 4.1.2 Navn, rolle, verdi | A | Spinner er ikke-interaktiv — ingen navn/rolle/verdi-krav utover status-rollen. |
Props / API
| Prop | Type | Standard | Beskrivelse |
|---|---|---|---|
size | 'sm' | 'md' | 'lg' | 'md' | Størrelse på hjulet |
label | string | Synlig tekst under hjulet. Brukes som aria-label om loadingLabel ikke er satt | |
loadingLabel | string | 'Laster...' | Tilgjengelig navn for skjermlesere. Overstyrer label |
className | string | Ekstra CSS-klasser |
I tillegg støttes alle standard HTML <div>-attributter (id, style, aria-* osv.).
Tilpasning med CSS
Tilgjengelige klasser og data-attributter
| Element/tilstand | Selektor / attributt |
|---|---|
| Spinner | .ix-spinner |
| Liten | data-size="sm" (24×24 px) |
| Middels | data-size="md" (40×40 px, standard) |
| Stor | data-size="lg" (64×64 px) |
Eksempel: ren HTML
<div class="ix-spinner" role="status" aria-label="Laster..." data-size="md"></div>
<div class="ix-spinner" role="status" aria-label="Laster inn konto..." data-size="lg">
Laster inn konto...
</div>
Relatert
- Button loading — spinner i knapp-kontekst