How to create a mobile navigation animated menu using JavaScript?

Byg Tilgængelige Menuer for Alle Brugere

19/06/2025

Rating: 4.71 (10804 votes)

I den digitale verden er navigation kernen i enhver brugeroplevelse. En velstruktureret og intuitiv menu er afgørende for, at brugere kan finde det, de søger. Men hvad sker der, når dele af din menu bliver utilgængelige for nogle brugere? Nylige tilgængelighedstests har afsløret et udbredt problem: undermenuer, der er vanskelige at navigere med tastatur eller skærmlæser. Dette er et kritisk problem, da det udelukker en betydelig del af brugerne fra en fuldendt oplevelse på dit website. Denne artikel dykker ned i de vigtigste principper for at opbygge menuer, der er tilgængelige for alle, og hvordan du kan rette eventuelle fejl, du måtte have lavet. Vi vil udforske vigtigheden af semantisk HTML, ARIA-attributter, korrekt kodestruktur og endda et populært NPM-bibliotek, der kan hjælpe dig på vej. Er du klar til at dykke ned i en verden af bedre web-tilgængelighed?

Semantisk HTML og ARIA: Grundstenene for Tilgængelighed

At optimere din kode for læsbarhed og tilgængelighed handler i høj grad om at vælge de rigtige HTML-tags. Forestil dig denne transformation:

<nav> <ul> <li><a href="#">list item 1</a></li> <li><a href="#">list item 2</a></li> <li><a href="#">list item 3</a></li> </ul> </nav>

Dette er langt mere læseligt og meningsfuldt sammenlignet med:

<div> <div> <a href="#">list item 1</a> <a href="#">list item 2</a> <a href="#">list item 3</a> </div> </div>

Det første eksempel er ikke kun mere læseligt for mennesker; det sikrer også, at en skærmlæser fortæller brugeren, at de i øjeblikket befinder sig på navigationen. Semantisk HTML giver browsere og assisterende teknologier kontekst om indholdets formål, hvilket er afgørende for tilgængelighed. En <nav>-tag signalerer tydeligt, at indholdet er navigationslinks, og en <ul> (unordered list) sammen med <li> (list item) og <a> (anchor) skaber en logisk struktur for menupunkter.

How to add accessible menu in NPM?
1. Install and import the accessible-menu with NPM. 2. Or include the UMD versions on the page as follows: 3. The HTML structure for the accessible dropdown menu.

Men nogle gange er det at bruge det rigtige semantiske element ikke nok til at forklare vores elements rolle ordentligt. Det er her, brugen af ARIA (Accessible Rich Internet Applications) og roller kommer til sin ret. I det første eksempel har vi en <ul>, som i øjeblikket er en liste. Vi ønsker ikke, at browseren skal se den udelukkende som en liste; <ul>'en skal fungere som en menubar. Vi kan forbedre koden ved at tilføje role="menubar". En menubar kan have menuitem, menuradio eller menuitemcheckbox. I vores tilfælde har vi kun brug for menuitem.

<nav> <ul role="menubar"> <li role="none"><a href="#" role="menuitem">list item 1</a></li> <li role="none"><a href="#" role="menuitem">list item 2</a></li> <li role="none"><a href="#" role="menuitem">list item 3</a></li> </ul> </nav>

I den opdaterede kode tilføjede jeg role="none" til <li>-taggen. Dette skyldes, at <li>'en vil fungere som en container i dette eksempel, og det element, der er eksplicit udpeget som et menuitem, er linket (<a>). Udover role-attributten er andre ARIA-attributter også afgørende for menutilgængelighed. For eksempel: aria-expanded angiver, om et undermenu er åbent eller lukket, aria-haspopup fortæller, at et element har en popup-menu, og aria-controls forbinder et styreelement med det indhold, det kontrollerer. Korrekt brug af disse attributter giver skærmlæsere den nødvendige information til at formidle menuens tilstand og funktionalitet til brugeren.

Vær opmærksom på, at der er noget, der hedder at bruge den forkerte ARIA. Hvis du ikke bruger ARIA korrekt, kan det ødelægge din tilgængelighed. En tommelfingerregel er: "Ingen ARIA er bedre end dårlig ARIA". Misbrug af ARIA kan skabe mere forvirring for skærmlæserbrugere end slet ingen ARIA. For eksempel, at tilføje role="button" til et statisk <div>-element uden at tilføje JavaScript til at håndtere klikhændelser, vil vildlede skærmlæserbrugere til at tro, at elementet er interaktivt, når det ikke er. Forstå ARIA-specifikationerne grundigt, før du implementerer dem.

Kodestruktur for Fokusorden: En Logisk Rejse

Mens du altid kan flytte ting med CSS, skal du, når du bygger en tilgængelig platform, sikre, at dine elementer er struktureret, som de vises. En korrekt struktureret kode hjælper med at styre fokusorden. Når brugere trykker på Tab-tasten for at bevæge sig gennem interaktive elementer, skal fokus følge en logisk rækkefølge. Uden korrekt struktur kan fokus hoppe uforudsigeligt, hvilket gør navigation vanskelig. Dette er også vigtigt, når du arbejder med en undermenu. For eksempel: hvis en bruger skal tabbe gennem alle menupunkterne, før de kan komme til en undermenu, er navigationen ikke brugervenlig. I stedet for at have en kode som denne:

<nav> <ul role="menubar" id="mainmenu"> <li role="none"><a href="#" role="menuitem">list item 1</a></li> <li role="none"><a href="#" role="menuitem">list item 2</a></li> <li role="none"><a href="#" role="menuitem">list item 3</a></li> </ul> <ul id="submenuList1"> <li role="none"><a href="#" role="menuitem">sub list item 1</a></li> <li role="none"><a href="#" role="menuitem">sub list item 2</a></li> </ul> </nav>

Kan vi gøre dette:

<nav> <ul role="menubar"> <li role="menuitem">List item 1 <ul role="menu"> <li role="none"><a href="#" role="menuitem">sub list item 1</a></li> <li role="none"><a href="#" role="menuitem">sub list item 2</a></li> </ul> </li> <li role="none"><a href="#" role="menuitem">list item 2</a></li> <li role="none"><a href="#" role="menuitem">list item 3</a></li> </ul> </nav>

Husk, du kan altid flytte ting med CSS, men hvis din HTML ikke er struktureret korrekt, vil oplevelsen være markant anderledes for tastaturbrugere og skærmlæsere. Den indlejrede struktur (hvor undermenuen er direkte indeni dens forældre-listeelement) sikrer, at når en bruger fokuserer på et menupunkt, der har en undermenu, kan de umiddelbart få adgang til undermenuen via tastaturkommandoer (f.eks. piletaster), i stedet for at skulle tabbe gennem hele hovedmenuen først. Dette skaber en langt mere intuitiv og effektiv navigationsoplevelse.

Implementering af Tilgængelige Menuer med NPM: En Praktisk Løsning

At bygge en fuldt tilgængelig menu fra bunden kan være en kompleks opgave, der kræver dybdegående kendskab til ARIA og interaktionsmønstre. Heldigvis findes der veludviklede biblioteker, der kan forenkle processen. Et sådant bibliotek er accessible-menu, tilgængeligt via NPM. Dette bibliotek er designet til at være WCAG-kompatibelt, fuldt responsivt, flerniveau- og mobilvenligt, skrevet i ren JavaScript.

Installation og Import

Du kan installere accessible-menu ved hjælp af NPM:

# NPM $ npm install accessible-menu --save

Derefter kan du importere de nødvendige komponenter i dit JavaScript:

// All-in-one import AccessibleMenu from 'accessible-menu'; // Disclosure Menu import { DisclosureMenu }nimport { Menubar } from "accessible-menu"; // Vertical Tree Menu import { Treeview } from "accessible-menu";

Alternativt kan du inkludere UMD-versionerne direkte på din side:

<!-- All-in-one --> <script src="/path/to/dist/accessible-menu.min.js"></script> <!-- Disclosure Menu --> <script src="/path/to/dist/disclosure-menu.min.js"></script> <!-- Horizontal Menu Bar --> <script src="/path/to/dist/menubar.min.js"></script> <!-- Vertical Tree Menu --> <script src="/path/to/dist/treeview.min.js"></script>

HTML-struktur

Biblioteket forventer en specifik, men standard, HTML-struktur for din menu:

<nav id="main-nav" aria-label="Main"> <!-- Toggle Button (Available For Menubar or DisclosureMenu) --> <button id="main-menu-toggle" aria-label="Toggle main menu">☰</button> <!-- Main Menu (Available For Menubar or DisclosureMenu) --> <ul id="main-menu"> <li> <a href="#">Home</a> </li> <li class="dropdown"> <a href="#">Category ▼</a> <ul> <li> <a href="#">JavaScript</a> </li> <li> <a href="#">CSS</a> </li> </ul> </li> <li> <a href="#">Contact</a> </li> <li> <a href="#">About</a> </li> </ul> </nav>

Bemærk brugen af aria-label="Main"<nav>-elementet, hvilket giver en beskrivende etiket til skærmlæsere. Dropdown-elementer er markeret med klassen dropdown, og der er en toggle-knap til mobilvisning.

Initialisering af Menuen

Biblioteket tilbyder forskellige menutyper, hver optimeret til specifikke interaktionsmønstre:

Disclosure Menu: Bruges ofte til navigation, hvor undermenuer afsløres ved klik eller tastaturinteraktion. Dette er ideelt til typiske dropdown-menuer.

const menu = new DisclosureMenu({ menuElement: document.querySelector("#main-menu"), submenuItemSelector: ".dropdown", controllerElement: document.querySelector("#main-menu-toggle"), containerElement: document.querySelector("#main-nav"), openClass: "open", });

Menubar: Velegnet til vandrette menuer, der ofte findes øverst på en side, hvor navigation primært sker via piletaster (venstre/højre) og Enter/mellemrum for at åbne undermenuer.

const menu = new Menubar({ menuElement: document.querySelector("#main-menu"), submenuItemSelector: ".dropdown", controllerElement: document.querySelector("#main-menu-toggle"), containerElement: document.querySelector("#main-nav"), openClass: "open", });

Vertical Tree Menu (Treeview): Perfekt til hierarkiske, vertikale menuer, hvor brugere kan udvide og skjule sektioner, ligesom en filbrowser.

What if some users can't access the submenu?
If some users cannot access it then your platform is not complete. You need to ensure that the experience is easy for everyone by ensuring that: A user can open and close the submenu without the mouse. for example: when a user clicks on the enter/return or the space key it should toggle the submenu.
const menu = new Treeview({ menuElement: document.querySelector("#main-menu"), submenuItemSelector: ".dropdown", });

Efter initialisering skal du anvende dine egne CSS-stilarter for at få menuen til at se ud, som du ønsker. Biblioteket håndterer den komplekse JavaScript-logik og ARIA-attributter, der er nødvendige for tilgængelighed, men styling er helt op til dig. Parametre som menuElement, submenuItemSelector, controllerElement, containerElement og openClass giver dig finmasket kontrol over, hvordan biblioteket interagerer med din HTML og dine CSS-klasser.

Bibliotekets løbende opdateringer og bugfixes, som det fremgår af changelog'en (f.eks. v4.2.2 den 27. maj 2025 med bugfixes), vidner om et aktivt vedligeholdt projekt, der stræber efter at opretholde høj standard for tilgængelighed og funktionalitet. Dette giver dig ro i sindet, når du implementerer det i dine projekter.

Test af Tilgængelighed: Sørg for at Alle Kan Bruge Din Menu

At bygge en tilgængelig menu er kun halvdelen af arbejdet; den anden halvdel er at teste den grundigt. De vigtigste testmetoder inkluderer:

  • Tastaturnavigation: Kan du navigere hele menuen (inklusive undermenuer) udelukkende med tastaturet (Tab, Shift+Tab, Enter, mellemrum, piletaster)? Kan du åbne og lukke undermenuer uden en mus?
  • Skærmlæser-test: Brug en skærmlæser (f.eks. NVDA, JAWS, VoiceOver) til at navigere menuen. Læser skærmlæseren korrekt menupunkter, undermenuer og deres tilstande (f.eks. "udvidet" eller "skjult")? Får brugeren de informationer, de har brug for, for at forstå menuens struktur og funktionalitet?

Det er vores pligt som udviklere at sikre, at internetoplevelsen er fantastisk for alle. Hvis nogle brugere ikke kan få adgang til eller navigere din menu, er din platform ikke komplet. En menu er ofte det første, brugere interagerer med, og den sætter tonen for resten af deres oplevelse på dit website. Prioritering af tilgængelighed fra starten sparer tid og ressourcer i det lange løb og sikrer, at dit indhold er tilgængeligt for et bredest muligt publikum.

Ofte Stillede Spørgsmål om Tilgængelige Menuer

Hvad er semantisk HTML, og hvorfor er det vigtigt for menuer?
Semantisk HTML handler om at bruge HTML-tags, der beskriver indholdets betydning og formål. For menuer betyder det brug af tags som <nav>, <ul>, <li> og <a>. Dette er vigtigt, fordi det giver browsere og assisterende teknologier (som skærmlæsere) en klar forståelse af menuens struktur og funktion, hvilket gør den lettere at navigere for alle brugere.

Hvornår skal jeg bruge ARIA-attributter i mine menuer?
ARIA-attributter skal bruges, når semantisk HTML alene ikke er tilstrækkeligt til at formidle et elements rolle, tilstand eller egenskaber til assisterende teknologier. For menuer kan det være role="menubar", role="menuitem", aria-expanded (for at vise om en undermenu er åben/lukket) og aria-haspopup (for at indikere en undermenu). De supplerer HTML for at forbedre tilgængeligheden af dynamisk indhold og avancerede brugergrænsefladekomponenter.

Hvad betyder "Ingen ARIA er bedre end dårlig ARIA"?
Dette princip understreger, at forkert brug af ARIA-attributter kan gøre et website mindre tilgængeligt, end hvis der slet ingen ARIA var. Hvis ARIA-attributter bruges forkert, kan de give misledende information til skærmlæsere, hvilket forvirrer brugeren og gør navigationen vanskeligere. Det er afgørende at forstå ARIA-specifikationerne fuldt ud, før man implementerer dem.

Hvordan hjælper korrekt kodestruktur med menu-tilgængelighed?
Korrekt kodestruktur, især for indlejrede elementer som undermenuer, sikrer en logisk fokusorden for tastaturnavigation. Når undermenuer er direkte indlejret i deres forældre-menupunkt i HTML'en, kan tastaturbrugere nemt tabbe fra forældrepunktet direkte ind i undermenuen. Dette forhindrer, at fokus hopper ulogisk rundt på siden, hvilket forbedrer den samlede brugeroplevelse for tastatur- og skærmlæserbrugere.

Kan jeg bruge et eksisterende bibliotek til at bygge tilgængelige menuer?
Ja, absolut! Biblioteker som accessible-menu (tilgængeligt via NPM) er designet til at håndtere kompleksiteten ved at bygge WCAG-kompatible menuer. De tager sig af ARIA-roller, tastaturinteraktion og fokusstyring, så du kan fokusere på design og indhold. Det er en god måde at sikre en høj grad af tilgængelighed uden at skulle genopfinde den dybe tallerken.

Hvis du vil læse andre artikler, der ligner Byg Tilgængelige Menuer for Alle Brugere, kan du besøge kategorien Teknologi.

Go up