In de vroege dagen van webdesign was het horizontaal en verticaal uitlijnen van elementen een van de grootste uitdagingen. Ontwerpers moesten goochelen met float, vreemde marges en inline-block hacks om kolommen netjes naast elkaar te krijgen.
Met de komst van Flexible Box Layout (Flexbox) werd dit verleden tijd. Flexbox is een krachtig 1D-lay-outsysteem (één-dimensionaal: in een rij óf in een kolom) waarmee je elementen moeiteloos kunt verdelen, uitlijnen en schalen binnen een container — ongeacht de schermgrootte.
In deze les leer je hoe je met de belangrijkste Flexbox-eigenschappen een strakke, responsieve lay-out bouwt.
Om Flexbox te activeren, geef je het bovenliggende element (de parent container) de CSS-eigenschap display: flex;.
Zodra je dit doet, gebeurt er iets magisch:
<div class="flex-container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
.flex-container {
display: flex; /* Activeert Flexbox op de container */
background-color: #f1f5f9;
padding: 20px;
}
.item {
background-color: #2563eb;
color: white;
padding: 20px;
margin: 5px;
}
Om Flexbox goed te begrijpen, moet je denken in twee assen:
HOOFDAS (Main Axis) ──────────────►
┌────────────────────────────────────────┐
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ ┬
│ │ Item 1 │ │ Item 2 │ │ Item 3 │ │ │ DWARSAS
│ └─────────┘ └─────────┘ └─────────┘ │ ▼ (Cross Axis)
└────────────────────────────────────────┘
flex-direction)Met flex-direction bepaal je de richting van de hoofdas. Hiermee kies je of de items in een rij of in een kolom komen te staan.
.flex-container {
display: flex;
flex-direction: row; /* Standaard: van links naar rechts */
}
row (standaard): Items staan horizontaal naast elkaar (van links naar rechts).row-reverse: Items staan horizontaal, maar in omgekeerde volgorde (van rechts naar links).column: Items worden verticaal onder elkaar gestapeld (van boven naar beneden).column-reverse: Items worden verticaal gestapeld, maar in omgekeerde volgorde.Tip: Zet jeflex-directionopcolumn? Dan wordt de verticale richting je hoofdas en de horizontale richting je dwarsas!
justify-content)Met justify-content bepaal je hoe de overgebleven vrije ruimte op de hoofdas wordt verdeeld tussen en rondom de Flex Items.
.flex-container {
display: flex;
justify-content: space-between;
}
flex-start (standaard): Items plakken aan het begin van de hoofdas.flex-end: Items schuiven naar het einde van de hoofdas.center: Items worden netjes in het midden gecentreerd.space-between: Eerste item staat uiterst links, laatste uiterst rechts. De overige ruimte wordt gelijk verdeeld tussen de items.space-around: Elk item krijgt evenveel witruimte aan beide zijden (de ruimte tussen twee items is dus dubbel zo breed als aan de buitenkanten).space-evenly: Alle tussenruimtes en buitenruimtes zijn exact even groot.align-items)Met align-items bepaal je hoe de items worden uitgelijnd op de dwarsas (haaks op de hoofdas).
.flex-container {
display: flex;
height: 200px;
align-items: center; /* Centreert de items verticaal */
}
stretch (standaard): Items worden uitgerekt om de volledige hoogte/breedte van de container op te vullen.flex-start: Items worden aan het begin van de dwarsas geplaatst (bovenaan).flex-end: Items worden aan het einde van de dwarsas geplaatst (onderaan).center: Items worden perfect gecentreerd op de dwarsas.baseline: Items worden uitgelijnt op de onderkant van hun tekst (de typografische basislijn).flex-wrap & gap)flex-wrap)Standaard proberen Flex Items altijd op één enkele regel te blijven, zelfs als ze daarvoor in elkaar gedrukt moeten worden. Met flex-wrap sta je toe dat items naar een volgende regel springen als de ruimte opraakt.
.flex-container {
display: flex;
flex-wrap: wrap; /* Items springen naar een nieuwe regel indien nodig */
}
nowrap (standaard): Alles blijft op één regel staan.wrap: Items springen naar een nieuwe regel van boven naar beneden.gap)In plaats van ingewikkelde marges te geven aan individuele items, gebruik je de eigenschap gap op de container om een vaste tussenruimte in te stellen.
.flex-container {
display: flex;
flex-wrap: wrap;
gap: 20px; /* 20px ruimte tussen álle items (zowel horizontaal als verticaal) */
}
Tip: Je kunt ookrow-gapencolumn-gaplos van elkaar instellen als je een verschillende rij- en kolomatstand wilt!
flex-grow & flex-shrink)Waar de vorige eigenschappen op de flex container werden gezet, stel je flex-grow en flex-shrink direct in op de flex items zelf.
flex-grow)flex-grow geeft aan hoeveel verhoudingsgewijze ruimte een item mag innemen als er extra vrije ruimte in de container is.
.item-1 { flex-grow: 1; }
.item-2 { flex-grow: 2; } /* Wordt dubbel zo breed als item-1 */
flex-shrink)flex-shrink bepaalt hoe sterk een item moet krimpen ten opzichte van de andere items wanneer de container te smal wordt.
.item-belangrijk {
flex-shrink: 0; /* Dit item zal NOOIT kleiner krimpen dan zijn originele breedte */
}
| Eigenschap | Plaatsing | Doel |
|---|---|---|
display: flex | Container | Activeert het Flexbox-systeem. |
flex-direction | Container | Bepaalt de richting van de hoofdas (row / column). |
justify-content | Container | Lijnt items uit op de hoofdas (horizontaal bij row). |
align-items | Container | Lijnt items uit op de dwarsas (verticaal bij row). |
flex-wrap | Container | Bepaalt of items naar een nieuwe regel mogen springen. |
gap | Container | Stelt de vaste tussenruimte in tussen de flex-items. |
flex-grow | Item | Bepaalt de relatieve groeisnelheid van een item. |
flex-shrink | Item | Bepaalt of/hoeveel een item mag krimpen. |
In dit voorbeeld combineren we een flexibele header-navigatie en een responsief overzicht van kaarten.
index.html)<header class="navbar">
<div class="logo">Studio Viso</div>
<nav class="nav-links">
<a href="#">Home</a>
<a href="#">Projecten</a>
<a href="#">Over Ons</a>
<a href="#" class="btn-contact">Contact</a>
</nav>
</header>
<main class="card-grid">
<article class="card">
<h3>Branding</h3>
<p>Visuele identiteiten en logo-ontwerp voor moderne merken.</p>
</article>
<article class="card">
<h3>Webdesign</h3>
<p>Unieke, gebruiksvriendelijke interfaces ontworpen in Figma.</p>
</article>
<article class="card">
<h3>Development</h3>
<p>Schoon gecodeerde websites met HTML, CSS en Flexbox.</p>
</article>
</main>
style.css)/* Algemene reset */
*, *::before, *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
font-family: Arial, sans-serif;
background-color: #f8fafc;
padding: 20px;
}
/* 1. FLEXIBELE NAVBAR */
.navbar {
display: flex;
justify-content: space-between; /* Logo links, links rechts */
align-items: center; /* Verticaal perfect in het midden */
background-color: #0f172a;
padding: 16px 32px;
border-radius: 8px;
color: #ffffff;
}
.logo {
font-size: 1.25rem;
font-weight: bold;
}
.nav-links {
display: flex;
align-items: center;
gap: 20px; /* Ruimte tussen de navigatielinks */
}
.nav-links a {
color: #94a3b8;
text-decoration: none;
transition: color 0.2s;
}
.nav-links a:hover {
color: #ffffff;
}
.btn-contact {
background-color: #2563eb;
color: #ffffff !important;
padding: 8px 16px;
border-radius: 6px;
}
/* 2. RESPONSIEF CARD GRID */
.card-grid {
display: flex;
flex-wrap: wrap; /* Zorgt dat kaarten naar de volgende regel springen op kleine schermen */
gap: 24px;
margin-top: 40px;
}
.card {
display: flex;
flex-direction: column; /* Stapelt titel en tekst verticaal binnen de kaart */
justify-content: space-between;
flex-grow: 1; /* Laat de kaarten de beschikbare breedte opvullen */
width: 280px; /* Basisbreedte van elke kaart */
background-color: #ffffff;
padding: 24px;
border-radius: 12px;
border: 1px solid #e2e8f0;
}
.card h3 {
color: #0f172a;
margin-bottom: 12px;
}
.card p {
color: #475569;
line-height: 1.6;
}
display: flex; in te stellen op het bovenliggende element (parent).flex-direction) en de dwarsas.justify-content om ruimte te verdelen langs de hoofdas (center, space-between).align-items om elementen uit te lijnen langs de dwarsas (center, stretch).flex-wrap: wrap; en beheer de onderlinge afstand strak met gap.flex-grow en flex-shrink op individuele flex items om te bepalen hoe ze meeschalen in je lay-out.