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?

  1. Open flexboxfroggy.com/#nl.
  2. Je ziet kikkers en waterlelies op het scherm.
  3. De kikker moet naar de juiste waterlelie.
  4. Links of onderin staat een CSS-editor.
  5. Je typt daar flexbox-regels, bijvoorbeeld justify-content: center;.
  6. Als de kikker goed staat, ga je door naar het volgende level.
  7. Lees per level goed welke property je oefent.
  8. 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

  1. Open Flexbox Froggy via de link hierboven en speel de eerste tien levels, rustig en met aandacht voor de uitleg.
  2. 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.
  3. 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;
}
  • .kaarten is de flex container.
  • Alleen de drie <article>-elementen zijn flex-items; de gezamenlijke h2 staat buiten de div.
  • display: flex zet de items standaard naast elkaar.
  • gap maakt ruimte tussen de items.

Actie — Bouw verder

  1. 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.
  2. Voeg in style.css aan .kaarten display: flex; en gap: 24px; toe. De articles zijn de directe kinderen en dus de flex-items.
  3. 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

  1. Wissel bij dezelfde .kaarten-container tussen flex-direction:row en column en vergelijk beide richtingen.
  2. Je hoeft geen nieuwe drie blokjes te maken: gebruik je eigen projecten.
  3. 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

  1. Maak het bestaande menu flexibel met .site-nav ul { display: flex; flex-wrap: wrap; gap: 16px; justify-content: center; }.
  2. Zet op die ul ook list-style:none, padding:0 en margin:0 om de standaardlijstafwerking weg te halen.
  3. 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.
  4. 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

  1. Test align-items:center en stretch op dezelfde kaartencontainer. Gebruik projectbeschrijvingen van verschillende lengtes om het verschil te zien.
  2. Je hoeft de tijdelijke banner en het vlak uit de uitleg niet als nieuwe onderdelen toe te voegen.
  3. 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;
}
  • gap hoort 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

  1. Verwijder de oude margin-bottom uit .kaart die alleen voor ruimte tussen de projecten bedoeld was. Behoud de kaartpadding en border.
  2. Laat .kaarten de tussenruimte verzorgen met gap:24px en vergelijk kort 16px en 32px.
  3. 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;
}
  • nowrap is standaard: items blijven op één regel.
  • wrap laat 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

  1. Voeg flex-wrap:wrap toe aan de bestaande .kaarten-container en houd flex-direction:row.
  2. Geef .kaart voorlopig width:240px en controleer bij een smaller venster dat kaarten naar een volgende rij gaan.
  3. 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: 1 is handig voor gelijke kolommen.
  • Grotere getallen krijgen meer ruimte.
  • Gebruik dit rustig en test goed in de browser.

Actie — Bouw verder

  1. Verwijder de width:240px uit .kaart en gebruik flex: 1 1 220px;. Dat staat hier voor meegroeien, meekrimpen en een beginbreedte van 220px.
  2. Alleen oefenen: geef één kaart tijdelijk een grotere groeifactor en vergelijk. Herstel daarna dezelfde flex-instelling voor alle drie kaarten.
  3. 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: flex zet de kaarten in een flex layout.
  • flex-wrap: wrap laat kaarten doorlopen als er te weinig ruimte is.
  • gap maakt ruimte tussen de kaarten.
  • flex: 1 1 220px laat 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

  1. Controleer de bestaande drie kaarten met flex:1 1 220px, wrap, gap en stretch; behoud de kleurvariabelen en kaartopmaak.
  2. Geef de bestaande .site-footer display:flex, flex-wrap:wrap, justify-content:space-between, align-items:center en gap:16px.
  3. De twee p-elementen en de contactlink uit H3 zijn de directe footer-items. Zet hun standaardmarges op 0 met .site-footer p.
  4. 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: flex op de container, niet op elk item.
  • Gebruik gap voor ruimte tussen items.
  • Gebruik justify-content voor verdeling in de hoofdrichting.
  • Gebruik align-items voor uitlijning op de kruisas.
  • Gebruik flex-wrap: wrap als 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

  1. Controleer dat display:flex op .kaarten, .site-nav ul en .site-footer staat en niet alleen op losse kaartjes of links.
  2. Controleer de aparte taken: gap voor tussenruimte, justify-content voor verdeling en align-items voor uitlijning.
  3. 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

  1. Controleer je bestaande vier pagina's: het menu gebruikt flexbox binnen nav, de footer gebruikt flexbox en de projectkaarten kunnen doorlopen.
  2. Test een breed en een smal venster en klik alle vier de bestemmingen na.
  3. Maak geen nieuw bestand. Bewaar dezelfde site; in H11 plaatsen we de hoofdonderdelen met grid en blijft deze flexbox binnen de onderdelen werken.
Quiz
  1. Vraag 1. Op welk element zet je meestal display: flex?



    Goed. De container wordt de flex container.
    Niet goed. display: flex hoort op de container.
  2. Vraag 2. Wat zijn flex items?



    Goed. Directe kinderen worden flex items.
    Niet goed. Flex items zijn de directe kinderen van de flex container.
  3. Vraag 3. Welke property bepaalt rij of kolom?



    Goed. Met flex-direction kies je de richting.
    Niet goed. Rij of kolom regel je met flex-direction.
  4. Vraag 4. Welke waarde centreert items met justify-content?



    Goed. center centreert in de hoofdrichting.
    Niet goed. De juiste waarde is center.
  5. Vraag 5. Waarvoor gebruik je align-items meestal?



    Goed. Bij een rij is dat vaak verticaal.
    Niet goed. align-items werkt op de kruisas.
  6. Vraag 6. Welke property maakt ruimte tussen flex items?



    Goed. gap maakt ruimte tussen items.
    Niet goed. Gebruik gap voor ruimte tussen flex items.
  7. Vraag 7. Welke property laat items naar een nieuwe regel gaan?



    Goed. Met flex-wrap: wrap mogen items doorlopen.
    Niet goed. Hiervoor gebruik je flex-wrap.
  8. Vraag 8. Wat doet flex: 1 vaak?



    Goed. flex: 1 wordt vaak gebruikt voor gelijke flex-items.
    Niet goed. flex: 1 gaat over ruimteverdeling van flex items.
  9. Vraag 9. Waarvoor is flexbox vooral geschikt?



    Goed. Flexbox is sterk in één richting.
    Niet goed. Flexbox is vooral handig voor rijen of kolommen.
  10. 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.