Modal
Release dato: 26.11.2024
Sist oppdatert: 19.06.2025
Modal (også kalt dialog eller popup) er et midlertidig vindu som vises over annet innhold. Du bruker modal når du vil be brukeren ta stilling til noe viktig, vise informasjon eller gi mulighet for interaksjon, uten at de forlater den siden de er på.
Modaler bør brukes med måte. De kan oppleves forstyrrende, og må derfor ha en tydelig hensikt og være enkle å lukke.
Live demo
Relaterte komponenter
Når du skal vise status, feil eller bekreftelser
Brukes for å vise informasjon eller beskjed på en roligere måte
Når du vil gi ekstra informasjon, men bare ved behov
Varianter
Varianter
Modal kommer i to ulike visuelle varianter. Du velger selv hvilken variant som passer best i din løsning.
Style | Beskrivelse |
---|---|
Simple | For enkle og nøytrale flater som admin-grensesnitt |
Symbol | Luftigere stil med lukknapp, passer for løsninger som matcher oslo.kommune.no |
Retningslinjer for bruk
Bruk modal når
- du trenger en bekreftelse på en kritisk handling (for eksempel ved sletting eller endringer som ikke kan angres)
- du vil vise ekstra informasjon uten å forlate siden
- du vil vise et skjema brukeren må fylle ut umiddelbart
Unngå modal når
- innholdet er langt eller komplekst, bruk heller en ny side
- det er flere steg i prosessen
- informasjonen ikke er kritisk, bruk heller accordion eller lignende
Bruk modaler med omhu
Modaler er ofte forstyrrende, og regnes sjelden som god brukeropplevelse. De bryter brukerens flyt, tar over skjermen og gir inntrykk av at noe haster, selv når det ikke gjør det.
En modal kan få brukeren til å miste tråden i oppgaven de jobber med. De vet kanskje ikke hvorfor den dukker opp, hvordan den lukkes eller om de må gjøre noe. Dette gjelder særlig for brukere med konsentrasjonsvansker, nedsatt syn eller skjermleser.
I følge Nielsen Norman Group kan modaler skape usikkerhet eller frustrasjon hvis de ikke er forventet eller blokkerer viktig innhold.
Er innholdet faktisk viktig nok til å avbryte brukeren? Og er det tydelig hva brukeren skal gjøre? Modal er en forstyrrelse. Bruk den bare når det er helt nødvendig, og gjør det tydelig hva brukeren skal gjøre.
Vi anbefaler at du tester modalen i bruk – helst med faktiske brukere – før du setter den i produksjon. Det er den beste måten å sikre at modalen hjelper, ikke hindrer.
Ikke åpne modal automatisk
En modal skal aldri vises uten at brukeren har gjort noe som tilsier det. Det må alltid være en tydelig trigger som gjør at brukeren forventer et avbrudd.
Gi brukeren en tydelig handling å utføre
En modal uten knapp eller neste steg skaper frustrasjon. Sørg for at det er tydelig hva brukeren skal gjøre, for eksempel lagre, sende inn, slette eller avbryte.
Gjør slik
Unngå
Ikke bruk modaler til lange skjemaer eller mye interaksjon
Hvis modalen inneholder mange felt eller seksjoner, velg heller en egen side. Det gir bedre oversikt og navigasjon, særlig på små skjermer.
Ikke bruk modal til ukritisk informasjon
Modal passer ikke for små oppdateringer eller informasjon som kan vises på en roligere måte. Bruk inline-elementer eller infoseksjoner (for eksempel messagebox) i stedet.
Gjør slik
Unngå
Når du viser feilmeldinger i modal
Bruk komponenten alert for å vise feil, advarsler eller suksessmeldinger inne i modalen. Ikke endre bakgrunn eller tekstfarge på modalen for å signalisere alvor.
Gjør slik
Unngå
Responsivitet
Når brukeren har mindre skjermplass, for eksempel på mobil, tar modaler ofte over hele visningen. Det kan føre til at brukeren mister oversikten, eller blir usikker på hva som skjer.
På mobil er det derfor ekstra viktig at modalen
- oppleves som naturlig del av brukerflyten
- har én tydelig handling og ikke flere valg som krever vurdering
- er enkel å lukke med tydelig lukknapp og støtte for å bruke “Esc”/tilbake
Unngå å vise modaler med mye innhold, flere valg eller lange skjemaer på mobil. Det kan være krevende å navigere, spesielt med skjermtastatur oppe, og gir ofte en dårlig opplevelse.
Test alltid modal på mobilskjerm, i både stående og liggende visning. Pass på at innholdet ikke kuttes, at brukeren enkelt forstår hva som skjer, og at det er lett å gå tilbake.
Modaler på mobil fungerer best når de er korte, enkle og har én klar beskjed. Alt annet bør vurderes løst på en annen måte.
Universell utforming
Modal må være tilgjengelig for alle
Modal er en dialogboks som vises over innholdet på siden. Den bruker HTML-elementet <dialog>
, som automatisk setter fokus på det første fokuserbare elementet når modalen åpnes. I Punkt sin løsning er dette ofte lukknappen, og den får derfor autofocus. Vi anbefaler alltid å vise lukknappen, det gir forutsigbarhet og kontroll for brukeren.
Fokus skal styres riktig
Når modalen åpnes, skal fokus flyttes inn i modalen automatisk, helst til første interaktive element. Fokus må holdes inne i modalen så lenge den er åpen. Brukeren skal ikke kunne tabbe seg «bak» eller ut av den. Når modalen lukkes, skal fokus returneres til det elementet som åpnet den.
Gi brukeren en tydelig vei ut
Alle modaler må kunne lukkes med både “Esc” og en synlig lukknapp. Det gjør det enkelt å forstå hvordan man kommer seg videre, og er spesielt viktig for brukere med motoriske utfordringer.
Merk: “Esc” fungerer bare dersom du åpner modalen med den innebygde funksjonen showModal()
. Dette vises i kodeeksemplene lenger ned.
Tastaturnavigasjon må fungere
Alle knapper og felt inne i modalen må kunne nås og brukes med tastatur. Hvis modalen inneholder et skjema, må submit-knappen være wrappet i <form method="dialog">
. Da lukkes modalen automatisk når skjemaet sendes inn, uten at du trenger ekstra logikk.
Tittelen må være tydelig
Modalen skal alltid ha en tittel i en <h1>
-tag. Dette hjelper skjermlesere med å tolke innholdet, og gir god kontekst for alle brukere.
Tilpass visning på små skjermer
På mobil og små skjermer skal modalen utvide seg og ta hele bredden. Modalen justerer seg automatisk når skjermen er smalere enn 576 px (36 rem). Vi anbefaler å teste dette i praksis, særlig hvis du har mye innhold i modalen.
Teknisk dokumentasjon og forklaring av dialog-elementet i HTML. Attributter, metoder og bruksmønstre.
Hvordan bygge en universelt utformet modal
Anatomi
Element | Beskrivelser |
---|---|
1. Tittel | Overskriften i modalen, gir brukeren kontekst |
2. Lukke-ikon | Knapp med ikon oppe til høyre, skal alltid være synlig |
3. Innhold | Tekst, skjemaelementer, instruksjoner eller annet innhold |
4. Valgfritt innhold (slot) | Område for egendefinert innhold |
5. Handlinger | En eller flere knapper nederst i modalen |
Implementasjon i kode
Hvordan ta komponenten i bruk?
import @oslokommune/punkt-elements/dist/pkt-modal.js;
import { PktModal } from '@oslokommune/punkt-react';
<script src="https://punkt-cdn.oslo.kommune.no/latest/elements/pkt-modal.js" type="module"></script>
Testing
Elements og React: 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-modal");
Dersom du bruker verktøyene i punkt-testing-utils så kan dette bli gjort automatisk for deg.
Props og tokens
Prop | Type | Beskrivelse |
---|---|---|
headingText | string | Heading tekst på modalen |
hideCloseButton | boolean | Gjemmer lukkeknappen. Dersom denne er satt til true, vil ikke lukkeknappen vises, og dermed er det viktig at man tilbyr en annen måte som f.eks. en knapp for å lukke modalen på. |
closeOnBackdropClick | boolean | Lukk modalen når bakgrunnen trykkes på |
closeButtonSkin | blue yellow-filled | Stil på lukkeknappen |
size | small medium large | Størrelsen på modalen |
variant | dialog drawer | Standard dialog eller skuff |
drawerPosition | left right | Posisjonen til skuffen |
transparentBackdrop | boolean | Bakgrunnen er gjennomsiktig |
Slot (children) | Beskrivelse |
---|---|
default | Innholdet i meldingen. Her tilbyr vi støtteklasser for å style 1-3 knapper i modalen. |
Event | Beskrivelse |
---|---|
background-click | Event som trigges når bakgrunnen trykkes på |
close | Event som trigges når meldingsboksen lukkes |
Farger
Element | CSS Variabel |
---|---|
Text | |
Background | |