H10 - Flexbox
00 - Flexbox binnen je nav, footer en projectkaarten
Gebruik je bestaande vierlinksmenu, drie projectkaarten en footer. Die krijgen ieder een eigen flex-layout. De grote hoofdonderdelen staan voorlopig nog onder elkaar; grid plaatst ze in het volgende hoofdstuk.
01 - Layout is lastig: speel het spel
Layout is vaak het onderdeel dat je als eerste nodig hebt als je een website wilt maken: blokken naast elkaar, een menu netjes uitlijnen, kaarten in rijen zetten en ruimte verdelen. Toch behandelen we layout pas later in deze training, omdat het meestal ook het lastigste onderdeel van webdesign is.
Flexbox is een moderne CSS-techniek om onderdelen netjes naast elkaar of onder elkaar te zetten. Je gebruikt flexbox vooral voor layouts in één richting: een rij of een kolom.
Een goede manier om flexbox te oefenen is het spel Flexbox Froggy. Speel het spel. Echt: speel het spel. Het maakt flexbox veel begrijpelijker.
Hoe speel je Flexbox Froggy?
- Open flexboxfroggy.com/#nl.
- Je ziet kikkers en waterlelies op het scherm.
- De kikker moet naar de juiste waterlelie.
- Links of onderin staat een CSS-editor.
- Je typt daar flexbox-regels, bijvoorbeeld
justify-content: center;. - Als de kikker goed staat, ga je door naar het volgende level.
- Lees per level goed welke property je oefent.
- Speel niet te snel door: probeer te begrijpen waarom de kikker beweegt.
Zie het spel als oefening voor je gevoel voor layout. Je hoeft niet alles meteen uit je hoofd te kennen. Het belangrijkste is dat je herkent welke eigenschap ongeveer welk probleem oplost.
Actie — Alleen oefenen
- Open Flexbox Froggy via de link hierboven en speel de eerste tien levels, rustig en met aandacht voor de uitleg.
- Noteer welke eigenschap je gebruikte om items te verdelen of uit te lijnen. Je hoeft hier nog geen flexbox in je eigen bestanden te bouwen.
- Het spel is een afzonderlijke oefening. Vanaf item 2 pas je de technieken toe op dezelfde portfoliosite.
02 - Flex container en flex items
Flexbox werkt met een container en items. De container is het element waarop je
display: flex zet. De directe kinderen van die container worden flex items.
<section>
<h2>Mijn projecten</h2>
<div class="kaarten">
<article class="kaart uitgelicht">
<h3>Mijn eerste website</h3>
<p>Mijn eigen portfolio met HTML en CSS.</p>
</article>
<article class="kaart">
<h3>Een schoolproject</h3>
<p>Een eigen idee uitgewerkt als ontwerp.</p>
</article>
<article class="kaart">
<h3>Een hobbyproject</h3>
<p>Iets dat ik met plezier heb gemaakt.</p>
</article>
</div>
</section>
.kaarten {
display: flex;
gap: 24px;
}
.kaartenis de flex container.- Alleen de drie
<article>-elementen zijn flex-items; de gezamenlijke h2 staat buiten de div. display: flexzet de items standaard naast elkaar.gapmaakt ruimte tussen de items.
Actie — Bouw verder
- Werk op portfolio.html met de bestaande div.kaarten uit H9 en de drie article.kaart-elementen. De gezamenlijke h2 en de tabel staan buiten deze div en worden geen flex-items.
- Voeg in style.css aan .kaarten
display: flex;engap: 24px;toe. De articles zijn de directe kinderen en dus de flex-items. - Controleer dat je bestaande projecten naast elkaar komen te staan. Behoud hun tekst, afbeeldingen, kleuren en kaartopmaak.
03 - Richting: row of column
Met flex-direction bepaal je de richting van de flex items.
Standaard staan flex items in een rij.
.kaarten {
display: flex;
flex-direction: row;
gap: 20px;
}
Wil je de items onder elkaar zetten, dan gebruik je column.
.kaarten {
display: flex;
flex-direction: column;
gap: 20px;
}
row: items staan naast elkaar.column: items staan onder elkaar.row-reverse: items staan naast elkaar, maar omgekeerd.column-reverse: items staan onder elkaar, maar omgekeerd.
Actie — Alleen oefenen
- Wissel bij dezelfde .kaarten-container tussen flex-direction:row en column en vergelijk beide richtingen.
- Je hoeft geen nieuwe drie blokjes te maken: gebruik je eigen projecten.
- Herstel na de vergelijking expliciet row. De volgende stappen gaan uit van een rij die later mag doorlopen.
04 - Horizontaal verdelen met justify-content
Met justify-content verdeel je items over de hoofdrichting.
Bij flex-direction: row is dat meestal horizontaal.
.site-nav ul {
display: flex;
justify-content: center;
gap: 20px;
}
flex-start: items beginnen aan het begin.center: items staan in het midden.flex-end: items staan aan het einde.space-between: eerste item links, laatste item rechts, ruimte ertussen.space-around: ruimte om elk item heen.space-evenly: gelijke ruimte tussen en naast alle items.
In Flexbox Froggy oefen je dit al vroeg. Let daar goed op: dit is een van de belangrijkste flexbox-properties.
Actie — Bouw verder
- Maak het bestaande menu flexibel met
.site-nav ul { display: flex; flex-wrap: wrap; gap: 16px; justify-content: center; }. - Zet op die ul ook list-style:none, padding:0 en margin:0 om de standaardlijstafwerking weg te halen.
- Test center en space-between in een breed venster en kies voorlopig center. Flex staat op de ul, omdat de li-elementen daarvan de directe kinderen zijn.
- Controleer hetzelfde vierlinksmenu op alle pagina's. Behoud de juiste huidige link en echte bestemmingen.
05 - Verticaal uitlijnen met align-items
Met align-items lijn je items uit op de kruisas. Bij een gewone rij is dat meestal
verticaal.
.banner {
display: flex;
align-items: center;
min-height: 200px;
}
stretch: items rekken standaard uit.flex-start: items staan aan het begin van de kruisas.center: items staan in het midden van de kruisas.flex-end: items staan aan het einde van de kruisas.
Een veelgebruikte combinatie is horizontaal en verticaal centreren:
.vlak {
display: flex;
justify-content: center;
align-items: center;
min-height: 300px;
}
Actie — Alleen oefenen
- Test align-items:center en stretch op dezelfde kaartencontainer. Gebruik projectbeschrijvingen van verschillende lengtes om het verschil te zien.
- Je hoeft de tijdelijke banner en het vlak uit de uitleg niet als nieuwe onderdelen toe te voegen.
- Herstel voor de portfoliokaarten align-items:stretch. De footer krijgt bij item 9 juist gecentreerde uitlijning.
06 - Ruimte tussen items met gap
Met gap maak je ruimte tussen flex items. Dit is vaak beter dan losse margins op
alle items.
.kaarten {
display: flex;
gap: 24px;
}
gaphoort op de flex container.- De ruimte komt tussen de flex items.
- Je hoeft dan niet elk item apart margin te geven.
- Dat maakt de CSS eenvoudiger en netter.
.kaarten {
display: flex;
row-gap: 24px;
column-gap: 32px;
}
Met row-gap en column-gap kun je verticale en horizontale ruimte apart instellen.
Actie — Bouw verder
- Verwijder de oude margin-bottom uit .kaart die alleen voor ruimte tussen de projecten bedoeld was. Behoud de kaartpadding en border.
- Laat .kaarten de tussenruimte verzorgen met gap:24px en vergelijk kort 16px en 32px.
- Behoud één rustige gap. Gebruik niet tegelijk extra buitenmarges om dezelfde ruimte tussen kaarten te maken.
07 - Items laten doorlopen met flex-wrap
Als flex items niet meer naast elkaar passen, kun je ze naar een nieuwe regel laten doorlopen.
Daarvoor gebruik je flex-wrap.
.kaarten {
display: flex;
flex-wrap: wrap;
gap: 20px;
}
.kaart {
width: 240px;
}
nowrapis standaard: items blijven op één regel.wraplaat items naar een nieuwe regel gaan.- Dit is handig bij kaarten, producten, tegels of kleine blokken.
- Flexbox kan zo beter reageren op verschillende schermbreedtes.
Actie — Bouw verder
- Voeg flex-wrap:wrap toe aan de bestaande .kaarten-container en houd flex-direction:row.
- Geef .kaart voorlopig width:240px en controleer bij een smaller venster dat kaarten naar een volgende rij gaan.
- Maak het venster weer breder en controleer dezelfde drie kaarten. Bij het volgende item vervangen we deze vaste testbreedte.
08 - Flex-items groter of kleiner maken
Je kunt flex items laten groeien of krimpen. De meest gebruikte korte schrijfwijze is
flex.
.kaart {
flex: 1 1 220px;
}
Bij flex: 1 1 220px zijn de drie waarden: groeifactor, krimpfactor en beginbreedte. Gelijke instellingen laten de kaarten vergelijkbaar meegroeien en krimpen. De beginbreedte helpt bij het doorlopen naar een volgende rij. De kortere vorm flex: 1 verdeelt de beschikbare ruimte vanuit een andere beginbasis.
.zijbalk {
flex: 1;
}
.inhoud {
flex: 3;
}
In dit voorbeeld krijgt de inhoud ongeveer drie keer zoveel ruimte als de zijbalk.
flex: 1is handig voor gelijke kolommen.- Grotere getallen krijgen meer ruimte.
- Gebruik dit rustig en test goed in de browser.
Actie — Bouw verder
- Verwijder de width:240px uit .kaart en gebruik
flex: 1 1 220px;. Dat staat hier voor meegroeien, meekrimpen en een beginbreedte van 220px. - Alleen oefenen: geef één kaart tijdelijk een grotere groeifactor en vergelijk. Herstel daarna dezelfde flex-instelling voor alle drie kaarten.
- Behoud wrap en gap op de container. Je projectkaarten verdelen de beschikbare ruimte en kunnen doorlopen.
09 - Praktisch voorbeeld: kaarten en footer
Dit voorbeeld maakt een rij met kaarten. Op kleinere schermen mogen de kaarten doorlopen naar de volgende regel.
<section>
<h2>Mijn projecten</h2>
<div class="kaarten">
<article class="kaart uitgelicht">
<h3>Mijn eerste website</h3>
<p>Mijn eigen portfolio met HTML en CSS.</p>
</article>
<article class="kaart">
<h3>Een schoolproject</h3>
<p>Een eigen idee uitgewerkt als ontwerp.</p>
</article>
<article class="kaart">
<h3>Een hobbyproject</h3>
<p>Iets dat ik met plezier heb gemaakt.</p>
</article>
</div>
</section>
.kaarten {
display: flex;
flex-wrap: wrap;
gap: 24px;
}
.kaart {
flex: 1 1 220px;
padding: 20px 24px;
border: 1px solid var(--kleur-rand);
}
display: flexzet de kaarten in een flex layout.flex-wrap: wraplaat kaarten doorlopen als er te weinig ruimte is.gapmaakt ruimte tussen de kaarten.flex: 1 1 220pxlaat kaarten groeien en krimpen vanaf een beginbreedte.- Met dezelfde drie kaartinstellingen blijven projecten samenhangend opgemaakt.
De footer uit H3 bevat twee alinea’s en een contactlink. Je hoeft die inhoud niet opnieuw te maken. Flexbox verdeelt deze directe kinderen, terwijl grid in H11 de hele footer onderaan plaatst.
.site-footer {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-items: center;
gap: 16px;
}
.site-footer p {
margin: 0;
}
Actie — Bouw verder
- Controleer de bestaande drie kaarten met flex:1 1 220px, wrap, gap en stretch; behoud de kleurvariabelen en kaartopmaak.
- Geef de bestaande .site-footer display:flex, flex-wrap:wrap, justify-content:space-between, align-items:center en gap:16px.
- De twee p-elementen en de contactlink uit H3 zijn de directe footer-items. Zet hun standaardmarges op 0 met .site-footer p.
- Controleer de footer op alle vier de pagina's, ook in een smaller venster. Het hoofdmenu en de footer bevatten nu allebei een flex-layout.
10 - Best practices
- Gebruik flexbox voor layout in één richting: rij of kolom.
- Zet
display: flexop de container, niet op elk item. - Gebruik
gapvoor ruimte tussen items. - Gebruik
justify-contentvoor verdeling in de hoofdrichting. - Gebruik
align-itemsvoor uitlijning op de kruisas. - Gebruik
flex-wrap: wrapals items mogen doorlopen. - Gebruik flexbox niet voor alles. Voor echte raster-layouts leer je hierna CSS Grid.
- Speel Flexbox Froggy als je vastloopt. Het spel is hier echt nuttig.
Actie — Controleer en rond af
- Controleer dat display:flex op .kaarten, .site-nav ul en .site-footer staat en niet alleen op losse kaartjes of links.
- Controleer de aparte taken: gap voor tussenruimte, justify-content voor verdeling en align-items voor uitlijning.
- Verwijder tijdelijke richtingen, testgroeifactoren en dubbele margins. Behoud drie eigen kaarten en alle menu- en footerinhoud.
11 - Afronding van je bestaande site
Actie — Controleer en rond af
- Controleer je bestaande vier pagina's: het menu gebruikt flexbox binnen nav, de footer gebruikt flexbox en de projectkaarten kunnen doorlopen.
- Test een breed en een smal venster en klik alle vier de bestemmingen na.
- Maak geen nieuw bestand. Bewaar dezelfde site; in H11 plaatsen we de hoofdonderdelen met grid en blijft deze flexbox binnen de onderdelen werken.
Quiz
-
Vraag 1. Op welk element zet je meestal
display: flex?
Goed. De container wordt de flex container.Niet goed.display: flexhoort op de container. -
Vraag 2. Wat zijn flex items?
Goed. Directe kinderen worden flex items.Niet goed. Flex items zijn de directe kinderen van de flex container. -
Vraag 3. Welke property bepaalt rij of kolom?
Goed. Metflex-directionkies je de richting.Niet goed. Rij of kolom regel je metflex-direction. -
Vraag 4. Welke waarde centreert items met
justify-content?
Goed.centercentreert in de hoofdrichting.Niet goed. De juiste waarde iscenter. -
Vraag 5. Waarvoor gebruik je
align-itemsmeestal?
Goed. Bij een rij is dat vaak verticaal.Niet goed.align-itemswerkt op de kruisas. -
Vraag 6. Welke property maakt ruimte tussen flex items?
Goed.gapmaakt ruimte tussen items.Niet goed. Gebruikgapvoor ruimte tussen flex items. -
Vraag 7. Welke property laat items naar een nieuwe regel gaan?
Goed. Metflex-wrap: wrapmogen items doorlopen.Niet goed. Hiervoor gebruik jeflex-wrap. -
Vraag 8. Wat doet
flex: 1vaak?
Goed.flex: 1wordt vaak gebruikt voor gelijke flex-items.Niet goed.flex: 1gaat over ruimteverdeling van flex items. -
Vraag 9. Waarvoor is flexbox vooral geschikt?
Goed. Flexbox is sterk in één richting.Niet goed. Flexbox is vooral handig voor rijen of kolommen. -
Vraag 10. Wat is een goede manier om flexbox te oefenen?
Goed. Speel het spel. Het helpt echt.Niet goed. Flexbox Froggy is een goede oefening.