11/11/2025
- Bulma Navigation Bar uden JavaScript: En CSS-drevet Løsning
- Udfordringen: JavaScript-fri Burger Menu
- Den Oprindelige CSS-Løsning: En Tjekboks-tilgang
- Forbedringen: CSS-transformation af Burger Ikonet
- Forklaring af CSS-selektorerne
- Fordele ved denne CSS-tilgang
- Begrænsninger og Overvejelser
- Bulma Menu: En Hurtig Oversigt
- CSS Styling af Knapper i Bulma
- Konklusion
- Ofte Stillede Spørgsmål (FAQ)
I en verden hvor design og funktionalitet går hånd i hånd, er en responsiv navigationsbar essentiel for enhver moderne hjemmeside. Bulma, et populært CSS-framework, tilbyder en elegant og fleksibel løsning til at skabe brugerdefinerede brugergrænseflader. En af de mest eftertragtede funktioner er muligheden for at vise en "burger menu" på mindre skærme, som automatisk skjuler og viser navigationslinksene ved et klik. Normalt kræver denne funktionalitet JavaScript, men hvad nu hvis du ønsker at opretholde en ren CSS-tilgang? Denne artikel guider dig trin for trin gennem processen med at implementere en Bulma navigationsbar med en burger menu, udelukkende ved hjælp af CSS.

Mange udviklere, inklusive mig selv, værdsætter princippet om at minimere eller helt undgå JavaScript for at opnå en lettere og mere vedligeholdelsesvenlig kodebase. Da jeg observerede det flotte design af navigationsbaren på Linux.com, blev jeg inspireret til at genskabe lignende funktionalitet på min egen blog. Bulmas standardimplementering for burger menuen involverer typisk JavaScript til at håndtere åbning og lukning af menuen samt til at ændre burgerikonet til et "X". Min udfordring var at opnå dette uden en eneste linje JavaScript, hvilket førte til en kreativ CSS-baseret løsning.
Den Oprindelige CSS-Løsning: En Tjekboks-tilgang
Min første tilgang var at udnytte den skjulte funktionalitet af HTML-input-elementer, specifikt en tjekboks. Ideen var at placere en skjult tjekboks i HTML-strukturen og bruge dens :checked pseudo-klasse til at styre synligheden af navigationsmenuen. Her er de grundlæggende ændringer i HTML og CSS:
HTML-struktur
Først blev en <input type="checkbox" id="menu-switch"> indsat i navigationsbaren, lige før .navbar-menu. I .navbar-brand blev den originale burger menu-<a>-tag erstattet med et <label>-tag, der er knyttet til tjekboksen via for="menu-switch". Dette <label>-tag fungerer som selve burgerknappen.
<nav class="navbar" role="navigation" aria-label="main navigation"> <div class="navbar-brand"> <a class="navbar-item" href="/">Site name</a> <label for="menu-switch" class="navbar-burger" role="button" aria-expanded="false"> <span aria-hidden="true"></span> <span aria-hidden="true"></span> <span aria-hidden="true"></span> </label> </div> <input id="menu-switch" name="menu-switch" type="checkbox" /> <div class="navbar-menu"> <div class="navbar-end"> <a href="/" class="navbar-item">Link1</a> <a href="/" class="navbar-item">Link2</a> <a href="/" class="navbar-item">Link3</a> </div> </div> </nav>CSS-regler
CSS'en blev derefter brugt til at skjule selve tjekboksen og til at vise .navbar-menu, når tjekboksen var markeret. Ved at bruge adjacency sibling combinatoren (+) kunne vi målrette .navbar-menu, der umiddelbart fulgte efter den tjekkede input.
#menu-switch { display: none; } #menu-switch:checked + .navbar-menu { display: block; } Denne løsning var et godt skridt, da den effektivt åbnede og lukkede menuen ved at klikke på burgerknappen (som nu var et <label>). Dog manglede den en vigtig detalje: transformationen af burgerikonet til et "X"-tegn, som normalt opnås med JavaScript og tilføjelse af en .is-active klasse.
Forbedringen: CSS-transformation af Burger Ikonet
Efter at have delt min oprindelige løsning med Jeremy Thomas, skaberen af Bulma, modtog jeg værdifuld feedback, der adresserede netop denne mangel. Ændringerne involverede en justering af HTML-strukturen og en mere avanceret brug af CSS-selektorer.
Opdateret HTML-struktur
Det første skridt var at flytte <input id="menu-switch">før.navbar-brand-div'en. Dette tillod os at bruge en mere pålidelig CSS-selektor til at målrette både burgerknappen og menupunkterne.

<nav class="navbar" role="navigation" aria-label="main navigation"> <input id="menu-switch" name="menu-switch" type="checkbox" /> <div class="navbar-brand"> <a class="navbar-item" href="/">Site name</a> <label for="menu-switch" class="navbar-burger" role="button" aria-expanded="false"> <span aria-hidden="true"></span> <span aria-hidden="true"></span> <span aria-hidden="true"></span> </label> </div> <div class="navbar-menu"> <div class="navbar-end"> <a href="/" class="navbar-item">Link1</a> <a href="/" class="navbar-item">Link2</a> <a href="/" class="navbar-item">Link3</a> </div> </div> </nav>Avanceret CSS med Transformationer
Med den nye HTML-struktur kunne vi nu bruge den generelle sibling combinator (~) til at vælge .navbar-menu, der fulgte efter den tjekkede input. Endnu vigtigere var det at kunne målrette de individuelle <span>-elementer inden i burgerknappen ved hjælp af :nth-child pseudo-klassen. Dette tillod os at anvende CSS-transformationer (rotation og translation) samt opacity-ændringer for at skabe "X"-effekten.
#menu-switch { display: none; } #menu-switch:checked + .navbar-brand .navbar-burger span:nth-child(1) { transform: translateY(5px) rotate(45deg); } #menu-switch:checked + .navbar-brand .navbar-burger span:nth-child(2) { opacity: 0; } #menu-switch:checked + .navbar-brand .navbar-burger span:nth-child(3) { transform: translateY(-5px) rotate(-45deg); } #menu-switch:checked ~ .navbar-menu { display: block; } Disse CSS-regler sikrer, at når tjekboksen er markeret (dvs. når brugeren klikker på burgerknappen), vil de tre linjer i burgerikonet transformere sig til et "X", og menupunkterne vil blive vist. Dette giver en komplet og visuelt tilfredsstillende oplevelse, der matcher den traditionelle JavaScript-baserede løsning, men helt uden JavaScript.
Forklaring af CSS-selektorerne
For at forstå denne løsning fuldt ud, lad os dykke ned i de anvendte CSS-selektorer:
#menu-switch: Vælger den specifikke tjekboks-input baseret på dens ID. Vi sætterdisplay: none;for at skjule den fra brugerens synsfelt.#menu-switch:checked: Vælger tjekboksen, når den er aktiv (markeret).+ .navbar-brand: Adjacency Sibling Combinator. Vælger det element med klassen.navbar-brand, der umiddelbart kommer efter den tjekkede#menu-switch. Dette er afgørende for at kunne målrette burgerknappen indeni.~ .navbar-menu: General Sibling Combinator. Vælger alle.navbar-menu-elementer, der kommer efter#menu-switch(uanset om de er umiddelbart efter eller ej). Dette bruges til at vise menuen..navbar-burger span:nth-child(n): Vælger det n'te<span>-element inden i elementet med klassen.navbar-burger. Vi bruger dette til at transformere de individuelle linjer i burgerikonet.
Fordele ved denne CSS-tilgang
- Ingen JavaScript: Den primære fordel er fuldstændig uafhængighed af JavaScript. Dette reducerer sidens indlæsningstid, forbedrer ydeevnen og sikrer kompatibilitet på tværs af browsere og enheder, der måske har begrænset JavaScript-understøttelse.
- Simpel Struktur: Selvom det kan virke kontraintuitivt, er den grundlæggende HTML-struktur forbliver relativt enkel. Tjekboksen og labelen fungerer som de interaktive elementer.
- Tilgængelighed: Ved at bruge semantisk HTML som
<label>og ARIA-attributter somaria-expanded, opretholder vi en god grad af tilgængelighed. - Performance: Uden JavaScript-kørselsomkostninger er denne løsning potentielt hurtigere og mere ressourcebesparende.
Begrænsninger og Overvejelser
Selvom denne løsning er elegant, er der et par begrænsninger at være opmærksom på:
- Browserkompatibilitet: Selvom de anvendte CSS-funktioner er bredt understøttet, er det altid en god idé at teste på tværs af forskellige browsere, især ældre versioner.
- Kompleksitet af CSS: For mere komplekse interaktioner kan ren CSS blive uoverskuelig. Denne løsning er specifik for burger menu-funktionaliteten.
- Tilpasning: Hvis du har brug for mere avancerede animationer eller interaktioner end blot at vise/skjule og transformere ikonet, kan JavaScript være uundgåeligt.
Bulma tilbyder forskellige komponenter til navigation. En Bulma menu er typisk en vertikal navigationsliste, der bruges i sidebars eller dropdowns. Den er designet til at være stilren og nem at implementere. Selvom denne artikel fokuserer på den horisontale navigationsbar, er principperne for styling med CSS generelle.
CSS Styling af Knapper i Bulma
CSS (Cascading Style Sheets) er sproget, der styrer præsentationen af HTML-dokumenter. Det giver udviklere mulighed for at definere farver, skrifttyper, layout og meget mere. I Bulma er knapper (og mange andre elementer) allerede stylet med et moderne og responsivt design. Du kan tilpasse disse stilarter ved at overskrive Bulmas standard CSS eller ved at tilføje dine egne klasser. CSS fungerer ved at anvende regelsæt, som består af en selektor (der peger på et HTML-element) og en erklæringblok (der indeholder stylingegenskaber og værdier).
CSS Selektorer er afgørende for at kunne anvende styles præcist. Udover dem, vi har brugt her (ID, klasse, sibling combinators, pseudo-klasser), findes der mange andre typer, herunder attributselektorer, pseudo-elementer og mere komplekse kombinationer, der giver finmasket kontrol over styling.
Konklusion
At implementere en fuldt funktionel Bulma burger menu uden JavaScript er absolut muligt ved at udnytte kraften i HTML-tjekbokse og avancerede CSS-selektorer som :checked, ~ og nth-child. Denne metode resulterer i en hurtigere, lettere og potentielt mere robust løsning, der bevarer den æstetiske appel og brugeroplevelse, som Bulma er kendt for. Ved at følge denne guide kan du opnå en elegant og responsiv navigationsbar, der fungerer fejlfrit på alle enheder, alt imens du holder din kodebase ren og fri for unødvendig JavaScript.

Ofte Stillede Spørgsmål (FAQ)
Hvad er en Bulma menu?
En Bulma menu er en komponent i Bulma CSS-frameworket, der bruges til at skabe vertikale navigationslister, ofte set i sidebars eller dropdown-menuer. Den er designet til at være simpel og stilfuld.
Kan jeg bruge denne løsning til andre Bulma komponenter?
Principperne bag denne løsning – især brugen af skjulte tjekbokse og :checked pseudo-klassen – kan potentielt anvendes til at skabe andre CSS-baserede interaktioner, såsom at vise/skjule indhold eller skifte mellem forskellige visninger, uden brug af JavaScript.
Hvordan ændrer jeg burgerikonet til et "X" med CSS?
Ved at bruge :checked på en forudgående input-tjekboks og derefter målrette de individuelle <span>-elementer i burgeren med :nth-child, kan du anvende CSS-transformationer (rotation, translation) og ændringer i opacity for at skabe "X"-effekten.
Hvad er fordelen ved at undgå JavaScript?
Fordelene inkluderer forbedret ydeevne, hurtigere indlæsningstider, reduceret filstørrelse, bedre kompatibilitet på tværs af ældre browsere eller enheder med begrænset JavaScript-understøttelse, og en generelt simplere og mere vedligeholdelsesvenlig kodebase.
Er denne løsning fuldt ud responsiv?
Ja, Bulma er i sig selv et responsivt framework, og denne CSS-baserede løsning fungerer ved at reagere på skærmstørrelser og interaktioner, hvilket sikrer en problemfri oplevelse på både desktop og mobile enheder.
Hvis du vil læse andre artikler, der ligner Bulma Navigation Bar uden JavaScript, kan du besøge kategorien Teknologi.
