Den ultimative guide til Flexbox - indlæring gennem eksempler

Hvad er den bedste måde at forstå Flexbox på ? Lær det grundlæggende, og bygg derefter masser af ting. Og det er præcis, hvad vi skal gøre i denne artikel.
Et par ting at bemærke
- Denne artikel blev skrevet med mellemliggende udviklere i tankerne og antager, at du allerede ved lidt om Flexbox. Men…
- Hvis du kender noget CSS, men slet ikke kender Flexbox, skrev jeg en omfattende guide her (gratis artikel, 46 minutters læsning).
- Og hvis du ikke kender CSS særlig godt, anbefaler jeg at tage min komplette (praktiske) introduktion til CSS (betalt kursus med 74 lektioner).
- Du behøver ikke at følge eksemplerne i denne artikel i den rækkefølge, der er angivet her.
- Flexbox er kun en layoutteknik. Projekter fra den virkelige verden kræver mere end layout.
- Når du ser en notation som
div.ohans
den henviser til en div med klassens navn påohans
Eksempel 1: Sådan oprettes et fotogalleri med Flexbox
At få fotos til at køre i rækker og kolonner med Flexbox er lettere end de fleste mennesker opfatter.
Overvej en simpel markering som sådan:
Vi har 10 billeder inden for en main.gallery
.
Antag, at den main.gallery
blev designet til at dække den tilgængelige skærm.
.gallery { min-height: 100vh}
En hurtig bemærkning om billeder
Som standard er billeder inline-block
elementer. De har en bredde og højde. De forbliver på en linje undtagen når de er begrænset af størrelsen, f.eks. At billederne er for store til at passe på en linje.
Udgangspunktet
At sætte alt sammen, resultatet af al markering og stil ovenfor er dette:

Få nu Flexbox på scenen:
.gallery { display: flex }
På dette tidspunkt er billedernes standardopførsel ændret. De går fra at være inline-block
elementer til at væreflex-items.
Som et resultat af den indledte Flexbox-kontekst .gallery
, bliver billederne nu presset til en enkelt linje. Plus, de ville strække sig langs lodret som sådan:

Dette er et resultat af Flexbox's standardadfærd:
- Squash alle børneelementer til en enkelt linje. Pak ikke elementerne ind.
Dette er dårligt for et galleri, så vi ændrer denne adfærd som sådan:
.gallery { flex-wrap: wrap}
Dette vil nu omslutte elementerne og bryde dem til flere linjer, når det er relevant.

2. Billederne ombrydes nu til næste linje. Men de strækker sig stadig langs lodret. Vi ønsker bestemt ikke den adfærd, da den forvrænger billederne.
Den stretch
adfærd skyldes den standard align-items
værdi på flex
containere.
align-items: stretch
Lad os ændre det:
.gallery { ... align-items: flex-start}
Dette forhindrer, at billederne strækkes. De antager deres standard width
og height
værdier.
De vil også justeres til starten af den lodrette akse som vist nedenfor:

Nu har vi vores Flexbox-drevne galleri.
Fordelen ved at bruge Flexbox
På dette tidspunkt er der ikke meget fordel ved at bruge Flexbox. Vi har det samme udseende, som vi havde, før vi startede Flexbox- modellen.
Bortset fra at få et responsivt galleri gratis, kommer de andre fordele ved at bruge Flexbox fra de justeringsmuligheder, det medfører.
Husk, at flexcontaineren .gallery
antager følgende egenskabsværdier. flex-direction: row
justify-content: flex-start
ogalign-items: flex-start.
Galleriets layout kan skiftes på et øjeblik ved at lege med standardværdierne som vist nedenfor:
.gallery { ... justify-content:center;}

Som det ses på billedet ovenfor, vil dette justere billederne til midten langs vandret:
.gallery { ... justify-content:center; align-items: center;}

Som det ses på billedet ovenfor, justerer dette billederne både vandret og lodret til midten af .gallery
Med Flexbox kommer mange justeringsmuligheder. Du er velkommen til at lege med nogle flere justeringsmuligheder, som du finder passende.
Du kan se det faktiske Flexbox-galleri i denne CodePen.
Eksempel 2: Hvordan man bygger kort med Flexbox
Kort er blevet populære på Internettet. Google, Twitter, Pinterest, og det ser ud til, at alle andre flytter til kort.
Et kort er et UI-designmønster, der grupperer relateret information i en beholder i fleksibel størrelse. Det ligner visuelt et spillekort.
Der er mange gode anvendelser til kort. En almindelig er det berygtede prisnet.

Lad os bygge en.
Markup
Hvert kort antager en markering som nedenfor:
Der vil være mindst 3 kort. Pak kortene i endiv.cards
Nu har vi et overordnet element.
I dette eksempel er det overordnede element indstillet til at udfylde hele visningsfeltet.
.cards { min-height: 100vh}
Opsæt Flexbox
Den følgende kodeblok starter en Flexbox-formateringskontekst inden for .cards
.cards { display: flex; flex-wrap: wrap}
Hvis du husker det sidste eksempel, flex-wrap
vil det give mulighed for flex-items
at bryde over på en anden linje.
Dette sker, når de underordnede elementer ikke kan passe ind i det overordnede element. Dette skyldes den større beregnede bredde på de kombinerede underordnede elementer.
Gå videre og giv den .card
indledende bredde.
Brug af Flexbox:
.card { flex: 0 0 250px}
Dette vil sætte flex-grow
og flex-shrink
værdier til 0
. Den flex-basis
værdi vil blive sat til250px
På dette tidspunkt vil kortene blive justeret til starten af siden. De strækker sig også langs lodret.

I nogle tilfælde kan dette være ideelt til din brugssag. Men i de fleste tilfælde vil det ikke.
Standardadfærd for flexcontainere
Resultatet ovenfor skyldes flex-containernes standardopførsel.
Kortene begynder ved starten af siden på top left
fordi justify-content
er indstillet til værdien flex-start
.
Kortene strækkes også for at udfylde hele højden af det overordnede element, fordi det align-items
er stretch
som standard indstillet.
Ændring af standardværdier
Vi kan opnå ret imponerende resultater ved at ændre standardværdierne, som Flexbox tilbyder.
Se nedenunder:



Se denne CodePen for at se det endelige projekt.
Eksempel 3: Hvordan man bygger gitre med Flexbox
Hele CSS-rammer er bygget på det koncept, der skal diskuteres i dette eksempel. Det er ret vigtige ting.
Hvad er et gitter?
Et gitter er en række krydsende lige lodrette og vandrette styrelinjer, der bruges til at strukturere indhold.

Hvis du er fortrolig med CSS-rammer som f.eks. Bootstrap, har du helt sikkert brugt gitre før nu.
Din kilometertal kan variere, men vi vil overveje at variere nettyper i dette eksempel.
Lad os starte med den første,grundlæggende gitre .
Grundlæggende gitre

Dette er net med følgende egenskaber:
- Gittercellerne skal være fordelt ens og udvide for at passe til hele rækken.
- Gittercellerne skal have samme højde.
Det er let at opnå dette med Flexbox. Overvej markeringen nedenfor:
1
Hver .row
vil være sin egen flexcontainer.
Hvert element inden .row
bliver derefter et flex-element. Alle flexgenstande fordeles jævnt over rækken.
Efter design skal det ikke have noget at vide om vi har 3 underordnede elementer
1/3 1/3 1/3
Eller 6 underordnede elementer
1/6 1/6 1/6 1/6 1/6 1/6
Eller 12 elementer
1/12 1/12 1/12 1/12 1/12 1/12 1/12 1/12 1/12 1/12 1/12 1/12
Løsningen
Der er kun to trin til at gøre dette.
- Start en Flexbox-formateringskontekst:
.row { display: flex;}
2. Lad hver flex-item
udvide sig, så den passer til hele rækken i lige store forhold:
.row_cell { flex: 1}
Og det er det.
Løsningen forklaret.
flex: 1
flex
er et stenografisk egenskabsnavn til indstilling af tre forskellige Flexbox-egenskaber, flex-grow
og flex-shrink
og flex-basis
egenskaber, i den angivne rækkefølge.
flex: 1
har kun værdien 1
indstillet. Denne værdi tilskrives flex-grow
ejendommen.
Egenskaberne flex-shrink
og flex-basis
indstilles til 1
og 0
.
flex: 1 === flex: 1 1 0
Gitterceller med specifikke størrelser
Nogle gange er det, du ønsker, ikke en gitterrække med lige celler.
Du vil måske have celler, der er dobbelt så mange som de andre celler, eller en hvilken som helst brøkdel for den sags skyld.

Løsningen er ret enkel.
Til disse specifikke gitterceller skal du tilføje en modifikationsklasse som sådan:
.row_cell--2 { flex: 2}
Lad klassen medtages i markeringen. Se det første barn div
i markeringen nedenfor:
2x 1/3 1/3
Cellen med klassen .row__cell--2
vil være 2 gange standardcellerne.
For en celle, der tager 3 gange den ledige plads:
.row_cell--3 {
flex: 3
}
Gitterceller med specifikke justeringer
Takket være Flexbox behøver hver celle ikke at være bundet til en bestemt justeringsværdi. Du kan specificere den specifikke justering for enhver celle.
For at gøre dette skal du bruge modifikationsklasser som denne:
.row_cell--top { align-self: flex-start}
Dette justerer den specifikke celle til toppen af row
.

Du skal også have føjet klassen til den specifikke celle i markeringen. Se det første barn div
i markeringen nedenfor:
Nedenfor er de andre tilgængelige justeringsmuligheder:
.row_cell--bottom { align-self: flex-end}

.row_cell--center { align-self: center}

Samlet justering inden for rækkerne
Da specifikke celler kan justeres, kan hele underordnede elementer også være i rækken.
For at gøre dette skal du bruge en modifikationsklasse som sådan:
.row--top { align-items: flex-start}

Det er vigtigt at bemærke, at ændringsklassen .row--top
skal føjes til row
forælderen ellerflex-container
De andre justeringsmuligheder kan ses nedenfor:
.row--center { align-items: center}

.row--bottom { align-items: flex-end}

Indlejrede gitre
Uden at gøre noget særligt kan disse rows
indlejres i sig selv.

Du kan se de endelige net, der oprettes her.
Endnu flere net
Mens du kan få smarte bygningsnet med Flexbox lodrette net og endnu mere komplekse konfigurationer, skal du bruge det bedste værktøj til jobbet. Lær, mestre og brug CSS Grid Layout. Det er den ultimative CSS-løsning til net.
Eksempel 4: Sådan oprettes websidelayouts med Flexbox
Samfundet rynker generelt med at bruge Flexbox til fuldblæst weblayouter.
Mens jeg er enig i dette, tror jeg også, at du i visse tilfælde kan komme væk med det.
Det vigtigste råd, jeg kan give her, ville være:
Brug Flexbox, hvor det giver meningJeg forklarer denne erklæring i det følgende eksempel.
The Holy Grail Layout
Hvilket bedre webstedslayout at bygge end den berygtede “ hellige gral ”?

Der er 2 måder at forsøge at opbygge dette layout med Flexbox på.
Den første er at have layoutet bygget med Flexbox. Placer header
, footer
, nav
, article
og aside
alt i ét flex-container
.
Lad os begynde med det.
Markup
Overvej den grundlæggende markering nedenfor:
Header Article Nav Aside Footer
Blandt andet er der en særlig regel, som den hellige gral overholder. Denne regel har inspireret markeringen ovenfor:
Den midterste kolonne article
skal vises først i markeringen, før de to sidepaneler nav
og aside
.

Start Flexbox-formateringskonteksten
body { display: flex}
Fordi de underordnede elementer skal stables fra top til bund, skal Flexbox's standardretning ændres.
body { ... flex-direction: column}
1 . header
og footer
skal have en fast bredde.
header,footer { width: 20vh /*you can use pixels e.g. 200px*/}
2.main
skal laves til at udfylde den tilgængelige resterende plads inden forflex-container
main { flex: 1}
Forudsat at du ikke glemte, flex: 1
svarer det til flex-grow: 1
, flex-shrink: 1
ogflex-basis: 0

På dette tidspunkt er vi nødt til at tage os af indholdet, inden for main
hvilket article
, nav
og aside
.
Opsat main
som flex-container
:
main { display: flex}
Få nav
og aside
tag faste bredder:
nav,aside { width: 20vw}
Sørg for, at der article
optager den resterende ledige plads:
article { flex: 1}

Der er bare en ting mere at gøre nu.
Ombestil flex-items
så nav
vises først:
nav { order: -1}

Den order
egenskab bruges til genbestille position flex-items
.
Alt flex-items
i en container vises i stigendeorder
værdier. De flex-item
med de laveste order
værdier vises først.
Alle flex-items
har en standardværdi order
på 0
.
The Holy Grail Layout (en anden løsning)
Den tidligere løsning brugte a flex-container
som den samlede beholder. Layoutet er stærkt afhængigt af Flexbox.
Lad os se en mere “fornuftig” tilgang. Se på det formodede endelige resultat igen:

header
og footer
kunne behandles som blokelementer. Uden nogen indblanding udfylder de bredden på deres indeholdende element og stabler fra top til bund.
Header Article Nav Aside Footer
Med denne tilgang ville det eneste flex-container
nødvendige være main
.
Den enestående udfordring med denne tilgang er, at du skal beregne højden af main
dig selv. main
skal udfylde den ledige plads udover den plads, der optages af header
ogfooter.
main { height: calc(100vh - 40vh);}
Overvej kodeblokken ovenfor. Det bruger CSS- calc
funktionen til at beregne højden påmain.
Uanset din kilometertal skal højden af main
være lig medcalc(100vh — height of header — height of footer ).
Som i den foregående løsning skal du have givet header
og footer
en fast højde. Gå derefter videre og behandl main
på samme måde som i den foregående løsning.
Du kan se de faktiske resultater her.
2 kolonnewebsite layout
To kolonnelayouter er ret almindelige. De opnås også let ved hjælp af Flexbox.

Overvej markeringen nedenfor:
sidebar main
Indled Flexbox-formateringskonteksten:
body { display: flex;}
Giv aside
en fast bredde:
aside { width: 20vw}
Endelig skal du sikre dig, at main
fylder den resterende ledige plads:
main { flex: 1}
Det er stort set alt, hvad der er til det.
Eksempel 5: Medieobjekter med Flexbox
Medieobjekter er overalt. Fra tweets til Facebook-indlæg ser de ud til at være det bedste valg for de fleste UI-design.

Overvej markeringen nedenfor:
Header
Som du har gættet, .media
etablerer du Flexbox-formateringskonteksten:
.media { display: flex}
Som standard strækkes den flex-items
af a container
langs lodret for at udfylde den tilgængelige højde inden for flex-container
.
Sørg for, at det .media-body
optager al den resterende ledige plads:
.media-body { flex: 1}

Lad os rette den strakte kasse.
.media { ... align-items: flex-start}

Og det er det.
Et vendt medieobjekt

Du har ikke ændret html
kildeordren for at oprette et spejlvendt medieobjekt.
Bare ombestil flex-item
s'erne sådan:
.media-object { order: 1}
Dette får billedet vist efter .media-body
ogmedia-heading
Et indlejret medieobjekt
Du kan endda fortsætte med at rede Media-objektet. Uden at ændre nogen af de CSS-stilarter, vi har skrevet.
Header
Header
Det virker!

Et Unicode-medieobjekt
Det ser ud til, at vi ikke er begrænset til kun billeder.
Uden at ændre nogen af de CSS-stilarter, der er skrevet, kan du få en unicode til at repræsentere billedet.
? Header
Jeg har lukket en emoji der.

Hvis du fjerner img
og erstatter den med en, der div
indeholder den ønskede unicode, får du output ovenfor. Du kan få fat i nogle flere emoji-unicodes her.
Et HTML-objektmedieobjekt
Du har muligvis også brugt html-enheder som vist nedenfor.
☎ Header
HTML-enheden, der bruges i dette eksempel, er, ☎
og du kan muligvis se resultatet nedenfor.

Du kan se resultatet af disse eksempler i denne CodePen.
Eksempel 6: Sådan oprettes formelementer med Flexbox
Det er vanskeligt at finde et websted, der ikke har en formular eller to i disse dage.

Overvej markeringen nedenfor:
… … … …
Dette eksempel viser kombinationen af at tilpasse indtastningsfelter med knapper eller tekstspænd. Løsningen igen er ret let med Flexbox.
Indled Flexbox-formateringskonteksten:
.form { display: flex}
Sørg for, at indtastningsfeltet optager den ledige plads:
.form__field { flex: 1}
Endelig kan du style de vedhæftede eller forudbyggede tekster og knapper, uanset hvilken måde du synes passer.
.form__item { ... }
Du kan se det komplette resultat af dette eksempel i denne CodePen.
Eksempel 7: Sådan oprettes et layout til en mobilapp med Flexbox
I dette eksempel vil jeg guide dig processen med mobilappens layout nedenfor:

Dette eksempel er dog anderledes.
Jeg vil forklare processen med at opbygge mobillayoutet i pseudokode, og du vil fortsætte med at opbygge det.
Dette vil være en form for praksis for at få dine hænder våde .
Trin 1
Fjern layoutet fra iPhone, og vi har dette:

Trin 2
Definer den indeholdende krop som en flex-container

Trin 3
Som standard er flex-direction
af a flex-container
indstillet til row
. I dette tilfælde skal du ændre det til column
.

Trin 4
Giv punkt 1 og 3 faste højder som f.eks height: 50px.
Trin 5
Punkt 2 skal have en højde, der fylder den ledige plads. Brug flex-grow
eller flex
stenografiflex: 1.
Trin 6
Til sidst skal du behandle hver enkelt indholdsblok som et medieobjekt som set i et tidligere eksempel.

Følg de seks trin ovenfor for at kunne oprette mobilappens layout med succes.
Vil du blive Pro?
Download mit gratis CSS Grid snydeark, og få også to interaktive Flexbox-kurser af høj kvalitet gratis!

Få dem nu