How to create a mobile-friendly navigation menu without JavaScript?

Skab en Mobilvenlig Navigation Uden JavaScript

24/07/2023

Rating: 4.22 (13750 votes)

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.

How to hide a hamburger menu in CSS?
All we need to do is make the toggle button work so the menu shows only when the visitors click on the hamburger menu. To do that the menu needs to be hidden by default. We can achieve that by setting the display property to none to the existing main-menu class selector in our CSS file. After adding that property it will look like the following.
Indholdsfortegnelse

Hvad er en Hamburger-menu?

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.

HTML-strukturen: Fundamentet for din menu

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.

CSS Styling: Fra ikon til fuld menu

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); } 

Styling af Menulisten

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 transitionleft-egenskaben vil sørge for en flydende animation, når menuen glider ind.

How do I hide a hamburger menu in JavaScript?
While JavaScript offers more control, you can create a pure CSS toggle using the checkbox hack: hide an input[type="checkbox"], style a label as your hamburger icon, then use :checked pseudo-class to reveal your hidden menu CSS when activated. How can I make my hamburger menu accessible?

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 (~).

Fordele ved HTML/CSS-only Hamburger-menu

  • 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)

Hvordan skjuler man hamburger-menuen i CSS?

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.

Hvad hvis jeg vil have flere niveauer i min menu?

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.

Hvordan sikrer jeg, at menuen fungerer på alle browsere?

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.

Go up