10/12/2021
I webudvikling støder man ofte på situationer, hvor indholdet i et flex-element bliver større end den tilgængelige plads i dets container. Dette kan føre til et uønsket visuelt resultat, hvor indholdet enten overlapper andet indhold eller simpelthen bliver afskåret. Heldigvis tilbyder CSS Flexbox en elegant løsning på dette problem: muligheden for at gøre flex-elementer scrollbare. Dette er især nyttigt, når du ønsker at præsentere en liste af elementer, der kan variere i størrelse, uden at det går ud over layoutets integritet. Lad os dykke ned i, hvordan du opnår dette og sikrer en god brugeroplevelse.

Hvorfor skal flex-elementer rulle?
Grunden til at flex-elementer kan have behov for at rulle, bunder i selve definitionen af flexbox. Flexbox er designet til at give en fleksibel måde at arrangere elementer på, og det inkluderer evnen til at håndtere situationer, hvor den samlede størrelse af flex-elementerne overstiger den tilgængelige plads i flex-containeren. Hvis du ønsker, at en bestemt sektion af din webside skal indeholde et variabelt antal elementer, og du vil sikre, at alle disse elementer er synlige og tilgængelige uden at bryde sidens layout, er scrolling den mest effektive metode. Uden scrolling ville elementerne enten blive afskåret eller forsøge at tvinge containeren til at udvide sig, hvilket kan ødelægge det overordnede design.
Løsningen i et nøddeskal
Kernen i at få flex-elementer til at rulle ligger i at sikre, at flex-containeren har en fastsat størrelse, der er mindre end den samlede størrelse af de elementer, den indeholder. Når containeren er mindre, og elementerne er konfigureret til at blive vist i en enkelt række eller kolonne, vil de resterende elementer blive skjult uden for synsfeltet. Ved at anvende den korrekte CSS-egenskab på containeren, kan du derefter aktivere scrolling, så brugerne kan tilgå det skjulte indhold.
1. Dimensionering af flex-containeren
Det første og mest afgørende skridt er at sikre, at flex-containeren har en størrelse, der ikke automatisk tilpasser sig dens indhold. Hvis containerens størrelse er dynamisk og baseret på størrelsen af dens flex-elementer, vil der aldrig opstå et behov for scrolling, da containeren simpelthen vil udvide sig for at rumme alle elementer.
Lad os tage et eksempel. Forestil dig en flex-container med `flex-direction: column;`. Dette betyder, at hovedretningen for layoutet er lodret, fra top til bund. Flex-elementerne vil derfor blive stablet oven på hinanden.
Som standard har `body` og `html`-elementerne `display: block;`. Hvis din flex-container også er et `main`-element, vil browseren ligeledes give det `display: block;`. Dette placerer flex-containeren i Flow layout, som er standardlayoutet i CSS. I denne tilstand vil containeren som standard være lige så bred som dens forælder (f.eks. `body`) og lige så høj som dens indhold, fordi både `inline-size` (bredde) og `block-size` (højde) har værdien `auto`.
| Element | Standard Display |
|---|---|
| html | block |
| body | block |
| main.flex-container | block |
Fordi flex-containeren i dette tilfælde vil forsøge at matche højden af dens indhold, vil flex-elementerne ikke overlappe, og der vil ikke være behov for scrolling. For at opnå scrolling, skal containeren have en fastsat højde (eller bredde, afhængigt af `flex-direction`), der er mindre end den samlede højde af dens indhold. For eksempel kan du sætte `block-size: 200px;` (eller `height: 200px;`).
Visuel illustration:
html
body
main.flex-container (block-size: 200px;)
div.flex-item (Højde: 100px)
div.flex-item (Højde: 100px)
div.flex-item (Højde: 100px)
I dette scenarie vil de tre flex-elementer, der tilsammen kræver 300px i højden, blive indeholdt i en container, der kun er 200px høj. Dette skaber det nødvendige overflow, som vi kan håndtere med scrolling.
Uanset hvilken layouttype der anvendes på flex-containeren, er det altså essentielt at sikre, at dens størrelse ikke er direkte afhængig af størrelsen på dens flex-elementer.
2. Stop flex-elementer fra at krympe for meget
Som standard har flex-elementer en tendens til at krympe for at passe ind i containerens indholdsboks. Dette skyldes, at `flex-shrink`-egenskaben som standard har værdien `1`. En værdi større end `0` indikerer, at elementet skal krympe, hvis der ikke er nok plads.
| CSS Egenskab | Standard Værdi | Betydning |
|---|---|---|
| flex-shrink | 1 | Elementet vil krympe, hvis der ikke er plads. |
| flex-basis | auto | Elementets startstørrelse før krympning/strækning. |
| min-width / min-height | auto | Minimumsstørrelse som elementet kan krympe til. |
For at opnå scrolling er det vigtigt, at flex-elementerne ikke krymper for meget. De skal bevare en tilstrækkelig størrelse til at overskride containerens dimensioner. Flex-elementer vil stoppe med at krympe, når de når deres automatiske minimumsstørrelse, som beregnes ud fra deres indhold. Du kan dog også definere din egen minimumsstørrelse ved hjælp af `min-inline-size` (for bredden, hvis `flex-direction` er `row`) eller `min-block-size` (for højden, hvis `flex-direction` er `column`).
Eksempel med `min-block-size`:
.flex-container { display: flex; flex-direction: column; height: 200px; overflow: auto; } .flex-item { flex-shrink: 1; min-block-size: 70px; /* Minimumshøjde for hvert element */ }Alternativt kan du angive en bestemt startstørrelse med `flex-basis` og derefter forhindre al krympning ved at sætte `flex-shrink: 0;`.
.flex-container { display: flex; flex-direction: column; height: 200px; overflow: auto; } .flex-item { flex-shrink: 0; /* Elementet må IKKE krympe */ flex-basis: 90px; /* Ønsket startstørrelse */ }Ved at sætte `flex-shrink: 0` sikrer du, at elementerne beholder den specificerede `flex-basis` (eller deres naturlige størrelse, hvis `flex-basis` ikke er sat), selvom det medfører overflow.
3. Aktiver scrolling på flex-containeren
Som standard vil en flex-container blot vise alt indhold, selvom det overlapper containerens grænser. Dette skyldes, at `overflow`-egenskaben som standard har værdien `visible`. For at aktivere scrolling skal du ændre denne egenskab.
Du kan indstille `overflow` til enten `scroll` eller `auto` for at opnå denne funktionalitet.
| CSS Værdi | Beskrivelse |
|---|---|
| visible (standard) | Overløbende indhold vises uden for containeren. |
| hidden | Overløbende indhold afskæres og er utilgængeligt. |
| scroll | Overløbende indhold afskæres, og scrollbars vises altid, selvom der ikke er noget overflow. |
| auto | Overløbende indhold afskæres, og scrollbars vises kun, når det er nødvendigt. |
Hvis du sætter `overflow: scroll;`, vil containeren altid opføre sig som en scroll-container, selv hvis flex-elementerne ikke rent faktisk overlapper. Dette kan resultere i synlige scrollbars, som måske ikke er nødvendige. Når du sætter `overflow: auto;`, vil containeren kun agere som en scroll-container, hvis flex-elementerne rent faktisk overlapper containerens dimensioner. Dette er generelt den foretrukne løsning, da den kun viser scrollbars, når det er nødvendigt.
.flex-container { display: flex; flex-direction: column; height: 200px; /* Eller en anden fastsat størrelse */ overflow: auto; /* Eller overflow-y: auto; hvis kun lodret scrolling er ønsket */ } .flex-item { /* Konfiguration der sikrer overflow, f.eks. ved at definere min-height eller flex-basis og flex-shrink: 0 */ min-block-size: 70px; }4. Hold flex-elementerne på en enkelt linje
En vigtig forudsætning for at opnå scrolling er, at flex-elementerne forbliver på en enkelt linje (enten en række eller en kolonne). Hvis flex-containeren tillader elementerne at bryde til næste linje ved hjælp af `flex-wrap: wrap;`, vil de simpelthen flytte sig ned på en ny linje i stedet for at overlappe.
| CSS Egenskab | Standard Værdi | Betydning i denne kontekst |
|---|---|---|
| flex-wrap | nowrap | Som standard forbliver elementerne på én linje. |
| flex-wrap | wrap | Elementerne bryder til næste linje, hvis de ikke passer. Derved undgås overflow og scrolling. |
For at sikre, at der opstår overflow og dermed behov for scrolling, skal du sørge for, at `flex-wrap` er sat til `nowrap` (hvilket er standardværdien) eller eksplicit angivet.
.flex-container { display: flex; flex-direction: row; /* Eller column */ flex-wrap: nowrap; /* Vigtigt for at tvinge overflow */ width: 300px; /* Eller height, afhængigt af flex-direction */ overflow: auto; } .flex-item { flex-basis: 100px; /* Giver hvert element en basisbredde */ flex-shrink: 0; /* Forhindrer krympning */ }I dette eksempel, hvis containeren er 300px bred og hvert af de tre flex-elementer har en `flex-basis` på 100px og `flex-shrink: 0`, vil de alle blive vist på én linje. Hvis der var fire elementer, ville det fjerde element overlappe, og scrolling ville blive aktiveret (hvis `overflow` er sat til `auto` eller `scroll`).
Opsummering og bedste praksis
For at opnå scrollbare flex-elementer skal du huske disse centrale punkter:
- Fast størrelse på container: Sørg for, at flex-containeren har en defineret størrelse (`height`, `width`, `max-height`, `max-width`) der er mindre end den potentielle samlede størrelse af dens indhold.
- Forhindr uønsket krympning: Brug `flex-shrink: 0;` eller definer `min-block-size`/`min-inline-size` for at sikre, at elementerne ikke krymper for meget og dermed undgår overflow.
- Tillad overflow: Sæt `overflow: auto;` (eller `overflow-y: auto;` / `overflow-x: auto;`) på flex-containeren for at aktivere scrolling, når det er nødvendigt.
- Undgå wrap: Sørg for, at `flex-wrap: nowrap;` er aktiv, så elementerne tvinges til at blive på én linje og dermed skabe overflow.
Typiske scenarier og løsninger
Scenario 1: En liste af kort, der skal scrolles lodret.
- Brug `display: flex;` og `flex-direction: column;` på containeren.
- Sæt en fast `height` eller `max-height` på containeren.
- Sæt `overflow-y: auto;` på containeren.
- Angiv en `min-height` eller `flex-basis` for hvert kort, hvis nødvendigt.
Scenario 2: En navigation eller et sæt af knapper, der skal scrolles vandret.
- Brug `display: flex;` og `flex-direction: row;` på containeren.
- Sæt en fast `width` eller `max-width` på containeren.
- Sæt `overflow-x: auto;` på containeren.
- Sørg for, at `flex-wrap: nowrap;` er gældende.
- Angiv en `min-width` eller `flex-basis` for hvert element, hvis nødvendigt, og overvej `flex-shrink: 0;`.
Ofte stillede spørgsmål
Hvad sker der, hvis jeg bruger `overflow: scroll;` i stedet for `auto;`?
Med `overflow: scroll;` vil scrollbars altid være synlige på containeren, uanset om der er noget indhold at rulle igennem eller ej. `overflow: auto;` er mere dynamisk og viser kun scrollbars, når der faktisk er overflow.
Kan jeg kombinere `flex-wrap: wrap;` med scrolling?
Ja, det er muligt, men det resulterer i en anden brugeroplevelse. Hvis du har `flex-wrap: wrap;` og en fastsat højde på containeren, vil elementer, der ikke passer på den første linje, bryde til den næste. Hvis den samlede højde af alle disse linjer overstiger containerens højde, kan du stadig aktivere scrolling. Dette kaldes ofte for en "multi-line scroll container". Dog, for den mest almindelige use case, hvor man ønsker et simpelt scrollbart område med elementer, der forbliver på én linje, er `flex-wrap: nowrap;` at foretrække.
Hvordan sikrer jeg, at mine flex-elementer ikke bliver for små?
Brug `min-width` eller `min-height` (afhængigt af `flex-direction`) til at sætte en absolut minimumsstørrelse for dine flex-elementer. Alternativt kan du bruge `flex-basis` til at definere en startstørrelse og `flex-shrink: 0` for at forhindre dem i at krympe under denne størrelse.
Ved at mestre disse teknikker kan du effektivt styre layoutet af dine flex-elementer og skabe intuitivt scrollbare områder, der forbedrer brugeroplevelsen på dine websteder.
Hvis du vil læse andre artikler, der ligner Få dine flex-elementer til at rulle, kan du besøge kategorien Teknologi.
