24/07/2023
Skab en Mobilvenlig Navigation Uden JavaScript: Hamburger Menuen med HTML og CSS
I en verden hvor størstedelen af internettrafik kommer fra mobile enheder, er en mobilvenlig navigation ikke bare en fordel – det er en nødvendighed. En af de mest effektive og populære måder at opnå dette på er ved at implementere en "hamburger-menu". Denne menu, der typisk gemmes bag et ikon med tre vandrette streger, åbner sig op for at vise navigationslinks, når den aktiveres. Mange udviklere tyr til JavaScript for at opnå denne funktionalitet, men hvad nu hvis du kunne skabe en fuldt funktionel og visuelt tiltalende hamburger-menu udelukkende ved hjælp af HTML og CSS? Denne artikel guider dig trin for trin gennem processen med at bygge netop det.

En hamburger-menu er et navigationselement, der er designet til at spare plads på skærme med begrænset bredde, især smartphones og tablets. Ikonet, der ligner tre horisontale streger stablet oven på hinanden (deraf navnet "hamburger"), fungerer som en knap. Når brugeren klikker på dette ikon, udvides menuen og afslører en liste over links eller indhold. Fordelen ved denne tilgang er en renere og mere minimalistisk brugergrænseflade på mobile enheder, hvilket fører til en bedre brugeroplevelse.
Før vi dykker ned i stylingen, skal vi etablere den grundlæggende HTML-struktur for vores hamburger-menu. Vi starter med en container-div, der vil indeholde hele menu-komponenten. Inden i denne div placerer vi et input-felt af typen checkbox. Dette checkbox er kernen i vores løsning, da vi vil bruge dets checked-tilstand til at styre menuens synlighed – alt dette uden brug af JavaScript. Ud over checkboxen tilføjer vi tre span-elementer. Disse span-elementer vil blive transformeret til de visuelle elementer, der udgør selve hamburger-ikonet.
Her er den grundlæggende HTML-kode:
<div id="menuToggle"> <input type="checkbox" /> <span></span> <span></span> <span></span> <ul id="menu"> <a href="#"><li>Hjem</li></a> <a href="#"><li>Shop</li></a> <a href="#"><li>Byt</li></a> <a href="#"><li>Kontakt</li></a> <a href="#"><li>Om Os</li></a> <a href="#"><li>Log Ind / Opret Konto</li></a> <a href="#"><li>Se Kurv</li></a> </ul> </div>I denne struktur bruges input type="checkbox" til at skifte synligheden, mens span-elementerne skaber selve ikonet. ul-elementet indeholder navigationslinksene, som vil blive vist, når menuen er åben.
Nu hvor vi har HTML-strukturen på plads, er det tid til at bringe den til live med CSS. Vi vil fokusere på at style både hamburger-ikonet og selve menulisten.
Styling af Hamburger-ikonet
Først definerer vi positionen og z-indekset for vores #menuToggle container. Derefter skjuler vi selve checkbox-inputtet ved at sætte dets opacity til 0, men bevarer dets funktionalitet ved at give det et højt z-index. Dette sikrer, at vi kan interagere med det usynlige checkbox, som ligger oven på vores synlige ikonelementer.
-webkit-touch-callout: none; tilføjes for at forhindre uønskede pop-up-meddelelser på visse mobile browsere, når der trykkes og holdes på ikonet.
Derefter styler vi span-elementerne, der udgør hamburger-ikonet. Vi giver dem display: block for at sikre, at de hver især optager deres egen linje, sætter deres dimensioner, tilføjer lidt margin-bottom for at skabe afstand mellem stregerne, og giver dem en baggrundsfarve. position: relative er vigtig for senere animationer.
#menuToggle { position: relative; z-index: 1; } #menuToggle input { position: absolute; width: 40px; height: 32px; cursor: pointer; opacity: 0; z-index: 2; /* Placerer checkboxen oven på hamburger-ikonet */ -webkit-touch-callout: none; } #menuToggle span { display: block; width: 33px; height: 4px; margin-bottom: 5px; position: relative; background: #cdcdcd; border-radius: 3px; z-index: 1; } /* Animation og overgange for ikonet */ #menuToggle span { transition: transform 0.5s cubic-bezier(0.77, 0.2, 0.05, 1), background 0.5s cubic-bezier(0.77, 0.2, 0.05, 1), opacity 0.55s ease; transform-origin: 4px 0px; } /* Styling for den første span */ #menuToggle span:first-child { transform-origin: 0% 0%; } /* Styling for den næstsidste span */ #menuToggle span:nth-last-child(2) { transform-origin: 0% 100%; } /* Når checkboxen er checked, transformer spans til et kryds */ #menuToggle input:checked ~ span { opacity: 1; transform: rotate(45deg) translate(-2px, -1px); background: #232323; } #menuToggle input:checked ~ span:nth-last-child(2) { transform: rotate(-45deg) translate(0, -1px); } /* Skjul den midterste span, når menuen er åben */ #menuToggle input:checked ~ span:nth-last-child(3) { opacity: 0; transform: rotate(0deg) scale(0.2, 0.2); } Nu til selve menulisten. Vi vil positionere den absolut og skjule den uden for skærmen som standard ved at give den en negativ left-værdi. En transition på left-egenskaben vil sørge for en flydende animation, når menuen glider ind.

padding-top og negative margin bruges til at centrere listen og give plads til ikonet. list-style-type: none; fjerner standard punkttegn, og -webkit-font-smoothing: antialiased; sikrer en pænere font-rendering i Webkit-browsere.
#menu { position: absolute; left: -300px; /* Skjuler menuen uden for viewport */ top: 80px; width: 200px; margin: -100px 0 0 -50px; padding: 50px; padding-top: 125px; background: #ededed; list-style-type: none; -webkit-font-smoothing: antialiased; transition: left 0.5s; } #menu li { padding: 10px 0; font-size: 22px; } /* Vis menuen, når checkboxen er checked */ #menuToggle input:checked ~ ul { left: 40px; } Sammenfatning af Kode
Ved at kombinere disse HTML- og CSS-stykker skaber vi en fuldt funktionel hamburger-menu. Når checkbox'en er checked (dvs. når brugeren klikker på ikonet), ændres span-elementerne til et kryds, og ul-elementet glider ind fra venstre og bliver synligt. Dette opnås udelukkende via CSS' selectors, især :checked pseudo-klassen og sibling-selectors (~).
- Ydeevne: Ingen JavaScript betyder hurtigere indlæsningstider og reduceret CPU-brug.
- Tilgængelighed: Kan gøres tilgængelig med ren semantisk HTML.
- Vedligeholdelse: Nemmere at vedligeholde og forstå uden et ekstra sprog.
- Browserkompatibilitet: Fungerer på tværs af moderne browsere uden behov for polyfills.
Hyppige Spørgsmål (FAQ)
Menuen skjules som standard ved at give den en left-værdi, der placerer den uden for skærmen (f.eks. left: -300px;). Når den ønskede tilstand (f.eks. :checked) aktiveres, ændres left-værdien til en positiv værdi, der bringer menuen ind på skærmen.
Kan man ændre hamburger-ikonet til et kryds?
Ja, det kan man. Ved at bruge CSS' transform-egenskaber på span-elementerne, specifikt når input:checked er aktiv, kan man rotere og placere dem, så de danner et kryds. Det kræver, at man animerer de enkelte span-elementer præcist.
For mere komplekse, indlejrede menuer, kan det blive nødvendigt at ty til JavaScript for at håndtere visning og skjul af under-menuer på en brugervenlig måde. Den rene CSS-tilgang er bedst egnet til simple, flade menuer.
De anvendte CSS-egenskaber som position, transform, transition og z-index er bredt understøttet af moderne browsere. Det er dog altid en god idé at teste din implementering på forskellige browsere og enheder for at sikre optimal funktionalitet og udseende.
Konklusion
At skabe en hamburger-menu uden JavaScript er en elegant løsning, der demonstrerer kraften i moderne CSS. Ved at udnytte checkbox-hacket og CSS' pseudo-klasser kan du opnå en dynamisk og responsiv navigation, der forbedrer brugeroplevelsen på mobile enheder uden at kompromittere ydeevnen. Denne metode er ikke kun effektiv, men også en fremragende måde at udvide dine færdigheder inden for front-end udvikling.
Hvis du vil læse andre artikler, der ligner Skab en Mobilvenlig Navigation Uden JavaScript, kan du besøge kategorien Teknologi.
