How to create a Mobile Menu in CSS?

Byg Responsiv Mobilmenu med CSS

05/03/2026

Rating: 4.37 (11667 votes)

I dagens digitale verden er det altafgørende at have et responsivt website. Brugere tilgår internettet fra et væld af enheder – fra store desktop-skærme til små smartphones – og forventer en problemfri oplevelse uanset skærmstørrelsen. En af de mest kritiske komponenter i et responsivt design er navigationen, især mobilmenuen. En veludført mobilmenu sikrer, at dine brugere nemt kan finde rundt på dit site, selv på en lille skærm. Glem alt om gamle, besværlige metoder som floats; moderne CSS tilbyder langt mere elegante og kraftfulde løsninger i form af Flexbox og Grid. Denne artikel vil guide dig trin for trin gennem processen med at skabe en robust og adaptiv mobilmenu ved hjælp af disse avancerede CSS-egenskaber. Vi vil udforske, hvordan du strukturerer din HTML, anvender de rette CSS-regler for både desktop- og mobilvisninger, og sikrer, at din menu ser professionel og brugervenlig ud på tværs af alle enheder.

How to create a Mobile Menu in CSS?
Basically, this will be your mobile header with the logo on the left and the button on the right. The menu will be placed below. Create a global CSS rule and tell the button you never want to display it: display: none; Now for the mobile menu, you should change the appearance of the container and all its child element that you want to change.
Indholdsfortegnelse

Hvorfor Flexbox og Grid er Fremtiden for Responsivt Design

Før vi dykker ned i koden, lad os forstå, hvorfor Flexbox og Grid er de foretrukne værktøjer til responsivt webdesign i dag. Tidligere var udviklere nødt til at ty til "floats" og positionering for at placere elementer på en side, hvilket ofte resulterede i komplekse og skrøbelige layouts. Flexbox (CSS Flexible Box Layout Module) og CSS Grid (CSS Grid Layout Module) er designet specifikt til at løse layoutudfordringer på en meget mere intuitiv og robust måde.

Flexbox er et én-dimensionelt layoutsytem, hvilket betyder, at det kan arrangere elementer i enten en række eller en kolonne. Det er perfekt til at justere, fordele plads og bestille elementer inden for en enkelt linje eller blok. Tænk på det som et værktøj til at styre fordelingen af plads mellem elementer og deres justering.

CSS Grid er et to-dimensionelt layoutsytem, der giver dig mulighed for at arrangere elementer i rækker og kolonner samtidigt. Det er ideelt til mere komplekse side-layouts, hvor du har brug for at opbygge et gitter af indhold. Sammen udgør de et utroligt kraftfuldt par, der kan håndtere stort set ethvert layout, du kan forestille dig, med minimal kode og maksimal fleksibilitet.

Sammenligning: Gamle Metoder vs. Flexbox/Grid

For at understrege fordelene ved Flexbox og Grid, lad os se på en hurtig sammenligning:

EgenskabGamle Metoder (f.eks. Floats)Flexbox / Grid
Layout-dimensionOfte uforudsigelig, kræver "clearfixes"Flexbox: 1D (række eller kolonne), Grid: 2D (række OG kolonne)
JusteringskontrolBesværligt, kræver marginer/paddingIndbyggede egenskaber som justify-content, align-items, gap
ResponsivitetSvært at vedligeholde, ofte med faste bredderDesignet til flydende layouts, nem at tilpasse med media queries
KodekompleksitetHøj, mere kode for simple layoutsLav, mere læsbar og vedligeholdelsesvenlig kode
YdeevneKan være langsommere på grund af omlægningerOptimeret til browserens rendering

Som tabellen viser, tilbyder Flexbox og Grid en mere strømlinet, effektiv og robust tilgang til layout, hvilket gør dem uundværlige i moderne webudvikling.

Grundlæggende Struktur: Headeren og Navigationsmenuen

Vi starter med den grundlæggende HTML-struktur for vores header og navigationsmenu. Dette layout vil danne grundlaget for både desktop- og mobilvisninger.

Din header vil typisk indeholde et logo og din primære navigation. Vi vil ombryde disse elementer i en semantisk <header>-tag. Indeni vil logoet (ofte et <img>) og navigationsmenuen (en <nav>-tag indeholdende en uordnet liste <ul>) blive placeret.

HTML-struktur

Her er et eksempel på den grundlæggende HTML, vi vil arbejde med:

<header class="header"> <img src="images/GameStar-Blanc.png" alt="logo" class="logo"> <nav class="menu"> <ul class="list"> <li class="listItem"><a href="#">A LA UNE</a></li> <li><a href="#">L'ACTUALITE</a></li> <li><a href="#">GUIDES ET ASTUCES</a></li> <li><a href="#">PROCHAINEMENT</a></li> </ul> </nav> </header>

CSS for Headeren (Desktop-først)

For at arrangere logoet og navigationsmenuen pænt på desktop, vil vi bruge Flexbox på vores .header-klasse. Flexbox gør det utroligt nemt at placere elementer side om side og fordele plads imellem dem.

.header { display: flex; /* Aktiver Flexbox for containeren */ width: 100%; /* Sørg for, at headeren fylder hele bredden */ justify-content: space-between; /* Fordel plads: logo til venstre, nav til højre */ align-items: center; /* Centrer elementerne vertikalt */ padding: 20px 60px; /* Tilføj lidt polstring */ background: #583760; /* Eksempel baggrundsfarve */ } .logo { color: white; /* Eksempel farve for logo tekst, hvis det var tekst */ }

Med justify-content: space-between fortæller du containeren, at elementerne indeni (.logo og nav) skal have plads fordelt imellem sig: det første (logoet) til venstre og det andet (nav'en) til højre. Der er ingen grund til at bruge float her. Denne egenskab virker kun, hvis du har sat display: flex. Med align-items: center fortæller du flex-containeren, hvordan du vil justere dine elementer vertikalt, hvilket i dette tilfælde centrerer dem i midten af headeren.

Styling af Navigationslisten med CSS Grid

Nu hvor headeren er på plads, skal vi style selve navigationslisten, så menupunkterne vises pænt side om side på desktop. Her kommer CSS Grid ind i billedet.

CSS for Navigationslisten

Vi tildeler en klasse til vores <ul> og styler den som følger:

.list { display: grid; /* Aktiver Grid for listen */ grid-auto-flow: column; /* Arranger listeelementer i kolonner */ list-style-type: none; /* Fjern standard punkttegn */ column-gap: 40px; /* Afstand mellem kolonner/listeelementer */ padding: 0; /* Nulstil standard polstring */ } .listItem { width: min-content; /* Sæt bredden baseret på indholdets minimumsbredde */ white-space: nowrap; /* Forhindr tekstombrydning */ } nav a { color: white; /* Tekstfarve for links */ font-weight: bold; /* Fed skrift */ text-decoration: none; /* Fjern understregning */ text-transform: uppercase; /* Store bogstaver */ } nav a:hover { color: black; /* Skift farve ved hover */ }

Her fortæller du <ul>-elementet, at alle <li>-elementerne indeni skal udgøre et gitter af 'n' kolonner, så mange som der er <li>-elementer, og at du ønsker 40px mellemrum mellem hver af dem. Egenskaben column-gap virker kun, hvis du har sat display: grid. padding skal altid være 0, ellers tilføjer browseren noget standard polstring, som du typisk ikke ønsker.

For .listItem, width: min-content fortæller listeelementerne, at deres bredde skal være automatisk, baseret på ordlængden. Med white-space: nowrap forhindrer du, at teksten starter på en ny linje efter et mellemrum. For eksempel vil "GUIDES ET ASTUCES" altid blive placeret på en enkelt linje. Samtidig indstiller du også bredden for hver kolonne i det tidligere oprettede gitter.

Forberedelse til Mobil: Mobilheaderen og Hamburgerknappen

På mobile enheder ønsker vi typisk at skjule den fulde navigationsmenu og i stedet vise et logo og en "hamburger"-knap, der kan åbne menuen. Dette kræver en lille ændring i vores HTML-struktur.

HTML for Mobilheaderen

Vi opretter en ny <div>, der ombryder logoet og vores nye hamburgerknap. Denne <div> vil fungere som vores mobilheader.

<header class="header"> <div class="mobileHeader"> <img src="images/GameStar-Blanc.png" alt="logo" class="logo"> <button onclick="openMenu()" class="hamburger">Menu</button> </div> <nav class="menu"> <ul class="list"> <li class="listItem"><a href="#">A LA UNE</a></li> <li><a href="#">L'ACTUALITE</a></li> <li><a href="#">GUIDES ET ASTUCES</a></li> <li><a href="#">PROCHAINEMENT</a></li> </ul> </nav> </header>

Dybest set vil dette være din mobilheader med logoet til venstre og knappen til højre. Menuen vil blive placeret nedenunder.

CSS for Hamburgerknappen (Standard Skjult)

Som standard skal hamburgerknappen være skjult på desktop-visninger. Vi opretter en global CSS-regel, der fortæller knappen, at du aldrig vil vise den:

.hamburger { display: none; /* Skjul knappen som standard */ }

Responsivitet med Media Queries

Nu kommer den afgørende del: at få menuen til at opføre sig forskelligt på forskellige skærmstørrelser. Dette gøres med CSS Media Queries. Media Queries giver dig mulighed for at anvende specifikke CSS-regler baseret på enhedens egenskaber, såsom skærmbredde.

Vi vil definere vores mobile stilarter inden for en media query, der aktiveres, når skærmbredden er 800px eller mindre. Placer altid dine media queries nederst i din CSS-fil eller i det mindste under de regler, der er defineret før, for at sikre, at de tilsidesætter de globale regler korrekt.

@media screen and (max-width: 800px) { /* CSS-kode for skærme op til 800px bredde */ }

Mobil-specifikke Justeringer (Inden i Media Query)

Visning af Hamburgerknappen

Inden for vores media query for mobile enheder, skal vi nu gøre hamburgerknappen synlig:

@media screen and (max-width: 800px) { .hamburger { display: block; /* Vis knappen på mobile enheder */ } }

Kort sagt har du lige sagt: "Menuknappen skal altid være skjult, men når en enhed har en bredde fra 0 til 800px, vil jeg vise den."

Mobilheaderens Layout

Vi vil også justere layoutet af .mobileHeader, så logoet og knappen er korrekt placeret på mobile skærme:

@media screen and (max-width: 800px) { .mobileHeader { width: 100%; /* Sørg for at den fylder bredden */ display: flex; /* Aktiver Flexbox */ justify-content: space-between; /* Fordel logo og knap */ } }

Dybest set vil du, at en bestemt bredde, headeren er noget lignende: Logo til venstre, hamburgerknap til højre.

Headerens Stacking på Mobil

På mobil ønsker vi, at vores .mobileHeader (der indeholder logo og hamburgerknap) og vores <nav> (den faktiske menu) vises oven på hinanden, snarere end side om side. Dette gøres ved at ændre flex-direction for vores .header:

@media screen and (max-width: 800px) { .header { flex-direction: column; /* Arranger elementer i en kolonne */ padding: 20px; /* Juster polstring */ } }

Dette er dybest set ligesom grid-auto-flow: row for grids – det stabler elementerne vertikalt.

Mobilmenuens Layout: Vertikal Liste

Når menuen åbnes på mobil, ønsker vi, at menupunkterne vises under hinanden i en enkelt kolonne. Vi justerer .list's Grid-egenskaber for at opnå dette:

@media screen and (max-width: 800px) { .list { grid-auto-flow: row; /* Arranger listeelementer i rækker (vertikalt) */ list-style-type: none; /* Fjern punkttegn */ row-gap: 40px; /* Afstand mellem rækker */ column-gap: 0; /* Ingen afstand mellem kolonner (da der kun er én) */ justify-items: center; /* Centrer listeelementerne horisontalt */ } }

Med justify-items: center instruerer du listen om at centrere listeelementerne. Det virker kun med display: grid. Da du satte display: grid i en global regel, behøver du ikke at skrive det igen, så længe du ikke behøver at ændre det.

Skjule Navigationsmenuen som Standard på Mobil

På mobil skal den fulde navigationsmenu være skjult som standard, indtil hamburgerknappen aktiveres. Vi tilføjer en regel til vores <nav>-element (med klassen .menu) for at skjule den:

@media screen and (max-width: 800px) { .menu { display: none; /* Skjul menuen som standard på mobil */ } }

Da din menu skal være skjult, når en bruger besøger websitet på mobil, skal den være sat til display: none som standard inden for denne media query.

Desktop-specifikke Justeringer (Tilsidesættelse)

For at sikre, at menuen altid er synlig på større skærme (desktop), selv hvis der skulle være en JavaScript-fejl eller lignende, definerer vi en regel, der specifikt tilsidesætter mobilens display: none for desktop-størrelser. Dette er en vigtig bedste praksis for tilgængelighed og robusthed.

@media screen and (min-width: 801px) { .menu { display: block !important; /* Sørg for, at menuen altid vises på desktop */ } }

Uanset hvad, vil du altid have menuen vist for enheder, der har en opløsning bredere end 800px. Brugen af !important her sikrer, at denne regel har højeste prioritet og tilsidesætter eventuelle andre display-regler, der måtte være defineret. Brug dog !important sparsomt, da det kan gøre din CSS sværere at debugge og vedligeholde i større projekter. I dette specifikke tilfælde er det dog en god forsikring for en kernefunktionalitet som navigation.

Interaktion: Når CSS Møder JavaScript

Med den CSS, vi har defineret, vil din mobilmenu forsvinde, når du skrumper vinduet til en mobil størrelse. For at åbne og lukke menuen har du brug for en smule JavaScript. Selvom denne artikel udelukkende handler om CSS, og vi ikke vil gå i detaljer med JavaScript-implementeringen for at undgå at forvirre dig, er det vigtigt at forstå, at CSS primært styrer udseendet, mens JavaScript styrer interaktionen. Typisk vil JavaScript tilføje eller fjerne en klasse (f.eks. .is-open) til menuen eller body-elementet, og dine CSS-regler vil derefter reagere på tilstedeværelsen af denne klasse for at vise eller skjule menuen. Du kan finde mange ressourcer online, der viser, hvordan man implementerer den JavaScript-del, herunder den Codepen, der blev nævnt i den oprindelige information.

Opsummering og Bedste Praksis

At skabe en responsivt design mobilmenu med Flexbox og Grid er en yderst effektiv og moderne tilgang til webdesign. Ved at udnytte disse kraftfulde CSS-layoutmoduler kan du skabe fleksible og robuste navigationsløsninger, der tilpasser sig ethvert skærmformat. Husk altid at starte med en solid HTML-struktur, anvend Flexbox til én-dimensionelle layouts (som din header) og Grid til to-dimensionelle layouts (som din listestruktur), og brug Media Queries til at definere specifikke stilarter for forskellige skærmstørrelser. Ved at følge disse principper kan du sikre en optimal brugeroplevelse og et fremtidssikret design for dine websider.

Her er et par yderligere tips:

  • Desktop-først eller Mobil-først? Vi har her brugt en desktop-først tilgang (globale regler for desktop, media queries for mobil). Du kan også vælge en mobil-først tilgang, hvor du definerer mobile stilarter som standard og derefter bruger min-width media queries for større skærme. Begge er gyldige; vælg den, der passer bedst til dit workflow.
  • Semantisk HTML: Brug altid de korrekte HTML5-elementer (<header>, <nav>, <ul>, <li>, <button>) for bedre tilgængelighed og SEO.
  • Test på tværs af enheder: Test altid dit responsive design på rigtige enheder eller brug browserens udviklerværktøjer til at simulere forskellige skærmstørrelser.

Ofte Stillede Spørgsmål (FAQ)

Hvad er Flexbox, og hvornår skal jeg bruge det?

Flexbox (Flexible Box Layout) er en CSS3-layoutmodel, der gør det nemmere at designe fleksible og responsive layoutstrukturer. Den er ideel til at arrangere elementer i en enkelt række eller kolonne og kontrollere deres justering og fordeling af plads. Brug Flexbox, når du har brug for at justere indhold lineært, f.eks. navigationselementer i en header, kort i en række, eller formularfelter.

Hvad er CSS Grid, og hvornår skal jeg bruge det?

CSS Grid Layout er en to-dimensionel layoutmodel, der giver dig mulighed for at designe komplekse gitterbaserede layouts med rækker og kolonner. Den er perfekt til overordnede sidelayouts eller komponenter, der kræver en præcis placering i både vandret og lodret retning. Brug Grid til hovedlayoutet af din side, til gallerier, eller når du har brug for at overlejre elementer.

Hvorfor er Media Queries så vigtige for responsivt design?

Media Queries er afgørende, fordi de giver dig mulighed for at anvende specifikke CSS-regler baseret på enhedens egenskaber, såsom skærmbredde, højde, orientering eller opløsning. Dette gør det muligt at tilpasse dit website, så det ser optimalt ud og fungerer korrekt på et væld af forskellige enheder, hvilket sikrer en god brugeroplevelse uanset enheden.

Skal jeg altid skjule mobilmenuen som standard på mobile enheder?

Ja, det er standardpraksis at skjule den fulde navigationsmenu på mobile enheder og i stedet vise en hamburgerknap. Dette sparer skærmplads og forbedrer brugeroplevelsen på små skærme. Når brugeren trykker på knappen, afsløres menuen, typisk som et overlay eller en udskydelig sidepanel.

Hvad er !important, og hvornår skal det bruges?

!important er en CSS-nøgleord, der, når den tilføjes en deklaration, giver den højeste specificitet og tilsidesætter alle andre CSS-regler for den pågældende egenskab, uanset deres rækkefølge eller specificitet. Det bør bruges sparsomt, da det kan gøre din CSS vanskelig at debugge og vedligeholde. I tilfælde som at garantere, at en kernekomponent (som en navigation) altid er synlig på desktop, kan det være en acceptabel løsning, men stræb efter at skrive CSS med tilstrækkelig specificitet uden at ty til !important.

Er Flexbox og Grid kun til menuer?

Absolut ikke! Selvom vi har fokuseret på menuer i denne artikel, er Flexbox og Grid alsidige layoutmoduler, der kan bruges til at designe stort set enhver del af et website. De er fundamentale værktøjer for moderne webudvikling og kan anvendes til at opbygge alt fra små komponenter til hele sidelayouts, herunder billedgallerier, formularer, kortlayouts, footers og meget mere.

Hvis du vil læse andre artikler, der ligner Byg Responsiv Mobilmenu med CSS, kan du besøge kategorien Teknologi.

Go up