Skip to main content

DropdownMenu

DropdownMenu er en nedtrekksmeny for handlinger eller navigasjon. Menyen vises når brukeren interagerer med en trigger-knapp og lukkes automatisk ved valg, klikk utenfor eller Escape.

Egnet til

  • Handlinger knyttet til et objekt (rediger, dupliser, slett)
  • Sekundære valg som ikke trenger synlige knapper
  • Kontekstmenyer med flere relaterte handlinger
  • Hierarkisk organisering av valg via submenyer

Uegnet til

  • Primærhandlinger som bør være umiddelbart synlige (bruk Button)
  • Valg i skjemaer (bruk Select eller RadioGroup)
  • Navigasjon mellom seksjoner (bruk Tabs eller vanlige lenker)
  • Svært lange lister (vurder Combobox med søk)

Bruk

En DropdownMenu bygges opp av en trigger-knapp og et menypanel med elementer. Klikk eller tastaturnavigasjon (Enter/Space/piler) åpner menyen og aktiverer valg. Menyen lukkes ved valg, klikk utenfor eller Escape.

React-komponenten er bygget opp som compound components: DropdownMenu.Trigger, DropdownMenu.Content, DropdownMenu.Item, DropdownMenu.Divider og sub-komponenter for nøstede menyer.

Laster...

Eksempler

Med ikoner

Ikoner kan legges til foran teksten for å gjøre handlinger lettere å skanne.

Laster...

Med destruktive handlinger

Bruk data-danger (HTML) eller danger-prop (React) for destruktive handlinger. Elementet får rød tekstfarge som visuell indikasjon.

Laster...

Med gruppering

Bruk dividers for å visuelt skille grupper av relaterte handlinger.

Laster...

Med submeny

For hierarkiske valg kan du nøste en submeny. Submenyen åpnes med ArrowRight og lukkes med ArrowLeft. Begrens til ett nivå med nøsting for god brukervennlighet.

Laster...

Med deaktiverte elementer

Bruk disabled for elementer som ikke kan velges i nåværende tilstand. Deaktiverte elementer hoppes over ved tastaturnavigasjon.

Laster...

Retningslinjer

Start hvert punkt med et verb

«Rediger», «Slett», «Eksporter som PDF». Punktet skal si hva som skjer når brukeren velger det. «Mer» og «Handlinger» hører på knappen som åpner menyen, ikke inni den.

Grupper relaterte handlinger

Skill grupper som hører sammen med en divider, så kan menyen skannes i bolker istedenfor linje for linje. Destruktive handlinger som slett og fjern hører nederst, bak sin egen divider, der de ikke treffes ved et uhell.

Begrens antall valg

Over 7–10 punkter blir menyen en liste å lete i. Da er det bedre å gruppere, flytte noe til en submeny, eller ta et steg tilbake og se på flyten.

Unngå dyp nøsting

Ett nivå submeny er nok. Dypere må brukeren huske hvor hen er samtidig som hen navigerer, og med tastatur er det tungt: hvert nivå må åpnes og lukkes med piltaster.

Universell utforming

Hva du selv må sørge for

  • Bruk en tydelig trigger-knapp. Teksten eller aria-label skal fortelle hva menyen inneholder. Komponenten setter aria-haspopup og aria-expanded automatisk.
  • Skriv korte og beskrivende meny-etiketter. Hvert element bør ha presis tekst som beskriver handlingen. Unngå vage etiketter.
  • Oversett all tekst: trigger-tekst og meny-etiketter kommer fra deg og må være på brukerens språk.
  • Begrens nesting. Dyp nøsting gjør navigasjon vanskelig. Hold deg til maksimalt ett nivå med submenyer.
  • Unngå for mange valg. En lang meny er vanskelig å navigere. Grupper med dividers eller redesign flyten.

Hva komponenten gjør automatisk

  • ARIA-attributter: aria-haspopup="menu" og aria-expanded settes på trigger. role="menu" på menyen, role="menuitem" på elementer, role="separator" på dividers.
  • Tastaturnavigasjon: Enter/Space åpner, piltaster navigerer, Escape lukker. Home/End hopper til første/siste. ArrowRight åpner submeny, ArrowLeft lukker den.
  • Fokushåndtering: fokus flyttes til første element ved åpning og tilbake til trigger ved lukking. Roving tabindex gjør at kun ett element har tabindex="0".
  • Typeahead: skriv bokstaver for å hoppe til matchende element.
  • Posisjonering: menyen plasseres med viewport-clamp og flipper ved plassmangel.
  • Touch-mål: alle elementer har minimum 32px høyde.
  • Fokusindikator: tydelig :focus-visible på alle interaktive elementer.

Tastaturnavigasjon

TastHandling
Enter / SpaceApner menyen nar trigger har fokus. Aktiverer valgt menyelement nar menyen er apen
ArrowDownApner menyen fra trigger. I apen meny: flytter fokus til neste element (hopper over disabled)
ArrowUpApner menyen fra trigger. I apen meny: flytter fokus til forrige element (hopper over disabled)
ArrowRightApner submeny nar fokus er pa submenu-trigger
ArrowLeftLukker submeny og returnerer fokus til forelder-trigger
HomeFlytter fokus til første menyelement
EndFlytter fokus til siste menyelement
EscapeLukker menyen og returnerer fokus til trigger
TabLukker menyen og flytter fokus til neste fokuserbare element pa siden
Bokstaver (a-z)Typeahead: hopper til første element som starter med tastetrykket

Skjermleser

  • Ved fokus pa trigger: "[tekst], menyknapp, sammenslatt" eller "[tekst], menyknapp, utvidet" (avhengig av tilstand)
  • Ved apning annonseres menyen med rolle, f.eks. "meny"
  • Ved navigasjon: "[elementtekst], menyelement, [posisjon] av [total]"
  • Ved disabled element: "[elementtekst], menyelement, deaktivert"
  • Ved submenu-trigger: "[tekst], menyelement, undermeny"
  • Ved lukking returneres fokus til trigger og den annonseres pa nytt

WCAG-kriterier

Sist gjennomgått: 2026-07-28 — alle 56 WCAG 2.2-kriterier vurdert

WCAG-kriterier8 ditt ansvar · 16 håndtert · 34 ikke relevant · 0 ikke på plass
Ditt ansvar (8)
KriteriumNivåHva du må gjøre
4.1.2 Navn, rolle, verdiABruk en tydelig trigger-knapp. Triggerknappen skal ha meningsfull tekst eller et tilgjengelig navn (aria-label) som forteller hva menyen inneholder. Brukeren skal forstå hva de kan forvente i menyen basert på triggeren. Komponenten setter automatisk aria-haspopup="menu" og aria-expanded på triggeren.
2.4.6 Overskrifter og ledeteksterAABruk en tydelig trigger-knapp. Triggerknappen skal ha meningsfull tekst eller et tilgjengelig navn (aria-label) som forteller hva menyen inneholder. Brukeren skal forstå hva de kan forvente i menyen basert på triggeren. Komponenten setter automatisk aria-haspopup="menu" og aria-expanded på triggeren.
2.4.6 Overskrifter og ledeteksterAASkriv korte og beskrivende meny-etiketter. Hvert meny-element bør ha en kort og presis tekst som beskriver handlingen eller valget. Unngå vage etiketter som "Klikk her" eller "Mer". For destruktive handlinger, bruk danger-prop og tydelig tekst som "Slett" eller "Fjern".
3.3.2 Ledetekster eller instruksjonerASkriv korte og beskrivende meny-etiketter. Hvert meny-element bør ha en kort og presis tekst som beskriver handlingen eller valget. Unngå vage etiketter som "Klikk her" eller "Mer". For destruktive handlinger, bruk danger-prop og tydelig tekst som "Slett" eller "Fjern".
3.1.2 Språk på deler av innholdAAOversett all tekst i menyen. All tekst i trigger-knappen og meny-elementene kommer fra deg og skal være på brukerens språk (bokmål, nynorsk, engelsk). Komponenten har ingen hardkodet fallback-tekst.
2.4.3 FokusrekkefølgeABegrens nesting til ett niva. Submenyer kan brukes for a organisere valg hierarkisk, men dyp nesting (submeny i submeny i submeny) gjor navigasjon vanskelig, saerlig med tastatur og skjermleser. Begrens til maksimalt ett niva med submenyer der det er praktisk mulig.
2.4.8 2.4.8?Begrens nesting til ett niva. Submenyer kan brukes for a organisere valg hierarkisk, men dyp nesting (submeny i submeny i submeny) gjor navigasjon vanskelig, saerlig med tastatur og skjermleser. Begrens til maksimalt ett niva med submenyer der det er praktisk mulig.
3.2.3 Konsistent navigasjonAAUnnga for mange valg. En lang meny med mange valg er vanskelig a navigere. Vurder a gruppere med dividers, bruke submenyer for relaterte valg, eller redesigne flyten dersom menyen blir for lang (mer enn 7-10 elementer).
Håndtert av komponenten (16)
KriteriumNivåHva komponenten gjør
1.3.1 Informasjon og relasjonerAMenyen har role="menu", hvert element har role="menuitem", og separatorer har role="separator". aria-haspopup="menu" og aria-expanded settes automatisk pa triggeren. Submenyer har aria-haspopup pa sin trigger.
1.3.2 Meningsfull rekkefølgeAMenyelementene vises i DOM-rekkefølge, og tastaturnavigasjon folger samme rekkefølge. Submenyer apnes til hoyre (eller venstre ved plassmangel) i leserekkefølge.
1.4.3 Kontrast (minimum)AATekst bruker --ix-color-foreground-main-default pa --ix-color-surface-main-default. Danger-variant bruker --ix-color-foreground-danger-default som oppfyller kontrastkravet.
1.4.4 Endre tekststørrelseAARelative enheter (font-size-tokens) — tekst skalerer korrekt ved 200% zoom. Menyen har max-height og scroller ved behov.
1.4.10 OmflytAAMobile-first uten faste bredder — menyen posisjoneres med viewport-clamp og flipper til andre siden ved plassmangel. Fungerer pa 320px viewport uten horisontal scroll.
1.4.11 Kontrast for ikke-tekstlig innholdAAFokusindikator pa menyelementer oppfyller 3:1 kontrastkrav via data-active. Hover-tilstand har subtil bakgrunnsendring som ikke er informasjonsbaerende.
1.4.13 Innhold ved hover eller fokusAAMenyen forblir synlig til brukeren aktivt lukker den (klikk, Escape, Tab ut, eller valg). Ingen innhold forsvinner utilsiktet.
2.1.1 TastaturAFullt tastaturopererbar: Enter/Space apner menyen, piltaster navigerer, Enter/Space velger, Escape lukker. Ingen museavhengige interaksjoner.
2.1.2 Ingen tastaturfelleAIngen tastaturfelle. Fokus holdes i menyen mens den er apen, men Escape lukker og Tab flytter fokus ut av menyen. ArrowLeft lukker submenyer og returnerer fokus til forelder-trigger.
2.4.3 FokusrekkefølgeAFokus flyttes til første menyelement ved apning. Ved lukking returneres fokus til triggeren. Tab-rekkefølge folger DOM inne i menyen. Roving tabindex gjor at kun ett element har tabindex="0" om gangen.
2.4.7 Synlig fokusAATydelig fokusindikator pa alle menyelementer via data-active. Fokus er visuelt distinkt fra hover-tilstand.
2.4.11 Fokus ikke skjult (minimum)AAMenyen har z-index-overlay og posisjoneres med getBoundingClientRect slik at den aldri dekkes av annet innhold. Fokuserte elementer i menyen er alltid synlige.
2.5.8 Målstørrelse (minimum)AAAlle menyelementer har minimum 32px høyde for touch-mal (WCAG 2.5.8 AA). Full bredde gjor hele elementet klikkbart.
3.2.1 Ved fokusAIngen kontekstendring ved fokus. A navigere mellom menyelementer trigger ingen handling — kun aktivering (Enter/Space/klikk) gjor det.
3.2.2 Ved inndataAIngen uventet kontekstendring ved input. Menyen lukkes og handlingen utføres ved eksplisitt aktivering, ikke ved navigasjon.
4.1.2 Navn, rolle, verdiATrigger har aria-haspopup="menu", aria-expanded og aria-controls. Menu har role="menu". Items har role="menuitem" med disabled-state via aria-disabled. Submenytriggere har aria-haspopup="menu" og aria-expanded.
Ikke relevant (34)
KriteriumNivåHvorfor ikke relevant
1.1.1 Ikke-tekstlig innholdAIkoner i menyelementer er dekorative (aria-hidden) og supplementerer teksten. Chevron pa submenu-trigger er rent visuelt (teksten indikerer at det er en submeny).
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 egenskaperAFormidler ikke instruksjoner basert pa sensoriske egenskaper.
1.3.4 VisningsretningAAMenyen laser ikke visningsretning.
1.3.5 Identifiser formål med inndataAAKomponenten er ikke et inndatafelt.
1.4.1 Bruk av fargeAFormidler ikke informasjon med farge alene. Danger-elementer har ogsa tydelig tekstinnhold.
1.4.2 Styring av lydAIngen lydelementer.
1.4.5 Bilder av tekstAAIngen bilder av tekst.
1.4.12 TekstavstandAA
2.1.4 TastatursnarveierAIngen enkelttegn-snarveier. Typeahead bruker flere tegn.
2.2.1 Justerbar hastighetAIngen tidsbegrensning pa menyen.
2.2.2 Pause, stopp, skjulAIngen automatisk oppdaterende eller blinkende innhold.
2.3.1 Terskelverdi på tre glimtAIngen animasjoner som blinker.
2.4.1 Hoppe over blokkerABypass blocks gjelder gjentakende sideblokker, ikke en enkelt meny.
2.4.2 SidetitlerADokumenttittel er sidens ansvar, ikke komponentens.
2.4.4 Formål med lenke (i kontekst)A
2.4.5 Flere måterAASidekrav — gjelder ikke enkeltkomponenter.
2.5.1 PekerbevegelserAIngen gestbaserte interaksjoner — enkelt klikk/tap.
2.5.2 Avbryt pekerANative knapper — nettleseren handterer pekerinteraksjon.
2.5.4 BevegelsesaktiveringAIngen bevegelsesaktivering.
2.5.7 DrabevegelserAIngen dra-baserte interaksjoner.
3.1.1 Språk på sidenASidens sprak er sidens ansvar.
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 hjelpAIngen konsekvent hjelp-mekanisme i komponenten.
3.3.1 Identifikasjon av feilAKomponenten har ingen validering.
3.3.2 Ledetekster eller instruksjonerAKomponenten er ikke et skjemafelt.
3.3.3 Forslag ved feilAA
3.3.7 Redundant oppføringAIngen gjentatt inntasting.
3.3.8 Tilgjengelig autentisering (minimum)AAIngen autentisering.

Props / API

PropTypeStandardBeskrivelse
openbooleanKontrollert åpen-tilstand. Utelat for ukontrollert bruk
defaultOpenbooleanfalseStartverdi i ukontrollert modus
onOpenChange(open: boolean) => voidKalles når menyen åpnes eller lukkes
placement'bottom-start' | 'bottom-end' | 'top-start' | 'top-end''bottom-start'Posisjon relativt til trigger
childrenReactNodeTypisk DropdownMenu.Trigger og DropdownMenu.Content
classNamestringEkstra CSS-klasser på <ix-dropdown>
PropTypeStandardBeskrivelse
onSelect() => voidKalles når elementet velges
dangerbooleanfalseDestruktiv handling (rød tekst)
disabledbooleanfalseDeaktiverer elementet
iconReactNodeIkon foran teksten
childrenReactNodeTekst/innhold i elementet

Ingen props. Rendrer en visuell separator med role="separator".

Disse komponentene bygger opp nøstede submenyer. Sub wrapper SubTrigger og SubContent. SubTrigger viser chevron-ikonet automatisk.

Tilpasning med CSS

Trenger du ix-dropdown-stylingen på HTML du setter sammen selv kan du bruke klassene direkte. Web componenten <ix-dropdown> håndterer ARIA og tastaturnavigasjon.

Tilgjengelige klasser og selektorer

ElementSelektor
Host/wrapperix-dropdown eller .ix-dropdown
Meny-panel.ix-dropdown__menu
Meny-element.ix-dropdown__item
Separator.ix-dropdown__divider
Submeny-trigger.ix-dropdown__submenu-trigger
Chevron-ikon.ix-dropdown__chevron
Danger-variant[data-danger].ix-dropdown__item
Disabled[disabled] eller [aria-disabled="true"].ix-dropdown__item

Eksempel: ren HTML

<ix-dropdown>
<button class="ix-button" data-variant="secondary">Handlinger</button>
<div class="ix-dropdown__menu" role="menu">
<button class="ix-dropdown__item" role="menuitem">Rediger</button>
<button class="ix-dropdown__item" role="menuitem">Dupliser</button>
<hr class="ix-dropdown__divider" role="separator" />
<button class="ix-dropdown__item" role="menuitem" data-danger>Slett</button>
</div>
</ix-dropdown>