CSS Grid is voor twee-dimensionale lay-out: rijen én kolommen tegelijk. Waar Flexbox één as regelt, regelt Grid beide assen. Hiermee bouw je complete paginalay-outs, fotogalerijen en dashboard-interfaces — zonder hacks.
Grid aanzetten en kolommen definiëren
.container {
display: grid;
/* Kolommen definiëren */
grid-template-columns: 200px 200px 200px; /* 3 vaste kolommen */
grid-template-columns: 1fr 1fr 1fr; /* 3 gelijke kolommen */
grid-template-columns: repeat(3, 1fr); /* zelfde als hierboven ⭐ */
grid-template-columns: 250px 1fr; /* vaste sidebar + flexibele content */
grid-template-columns: repeat(3, minmax(200px, 1fr)); /* min 200px, daarna gelijk */
/* Rijen definiëren (vaak niet nodig – grid maakt ze automatisch) */
grid-template-rows: auto 1fr auto; /* header – content – footer */
/* Ruimte tussen cellen */
gap: 16px; /* rij-gap + kolom-gap gelijk */
gap: 8px 16px; /* rij-gap kolom-gap */
row-gap: 8px;
column-gap: 16px;
}
Voorbeeld: repeat(3, 1fr) met gap: 12px
fr-eenheden, repeat() en minmax()
fr — fractional unit
fr is een breukdeel van de beschikbare ruimte, na aftrek van vaste breedtes en gap. Handig: 1fr 2fr = 33% en 67%.
repeat()
/* Handmatig */
grid-template-columns: 1fr 1fr 1fr 1fr;
/* Met repeat */
grid-template-columns: repeat(4, 1fr);
/* Auto-fill: zoveel kolommen als passen */
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
minmax() ⭐
minmax(min, max) geeft een kolom een minimum- en maximumbreedte. In combinatie met auto-fill het responsieve grid-patroon bij uitstek — geen media queries nodig!
.galerij {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 16px;
}
/* Kolommen zijn minimaal 200px breed.
Bij meer ruimte groeien ze mee.
Bij minder ruimte vallen er minder naast elkaar. */
Items over meerdere kolommen/rijen spannen
Met grid-column en grid-row laat je een item meerdere cellen innemen.
.item {
/* Lijn-nummers: 1 = eerste lijn, -1 = laatste lijn */
grid-column: 1 / 3; /* van lijn 1 tot lijn 3 = 2 kolommen breed */
grid-column: 1 / -1; /* van eerste tot laatste lijn = volle breedte */
grid-column: span 2; /* span 2 kolommen vanaf huidige positie ⭐ */
grid-row: 1 / 3; /* span 2 rijen */
grid-row: span 2;
}
grid-template-areas — naamgeving
.pagina {
display: grid;
grid-template-columns: 240px 1fr;
grid-template-rows: 60px 1fr 60px;
grid-template-areas:
"header header"
"sidebar content"
"footer footer";
}
header { grid-area: header; }
.sidebar { grid-area: sidebar; }
main { grid-area: content; }
footer { grid-area: footer; }
Uitlijning in Grid
Grid heeft dezelfde uitlijn-properties als Flexbox, maar dan voor beide assen tegelijk.
| Property | Op | Wat doet het |
|---|---|---|
| justify-items | container | Items horizontaal binnen hun cel |
| align-items | container | Items verticaal binnen hun cel |
| justify-content | container | Verdeel grid-tracks horizontaal |
| align-content | container | Verdeel grid-tracks verticaal |
| justify-self | item | Dit item horizontaal in zijn cel |
| align-self | item | Dit item verticaal in zijn cel |
| place-items | container | align-items + justify-items in één ⭐ |
/* Perfect centreren in een cel (of viewport) */
.centrer {
display: grid;
place-items: center;
height: 100vh;
}
Grid vs Flexbox: wanneer gebruik je wat?
🔲 Flexbox
- Één richting (rij of kolom)
- Items bepalen grootte
- Navigatiebalk, toolbar
- Knoppen naast elkaar
- Items die wrappen
- Centreren van één item
⬛ Grid
- Twee dimensies tegelijk
- Lay-out bepaalt grootte
- Volledige paginalay-out
- Fotogalerij / kaartengrid
- Dashboard
- Items over cellen spannen
Oefening 1 – Fotogalerij
Maak een responsieve fotogalerij met auto-fill:
• body: margin 0, padding 24px, background #0f172a, font-family sans-serif
• .galerij: display grid, grid-template-columns repeat(auto-fill, minmax(120px, 1fr)), gap 12px
• .foto: background #1e293b, border-radius 8px, aspect-ratio 1, display flex, align-items center, justify-content center, color #94a3b8, font-size 24px
HTML
<div class="galerij">
<div class="foto">🌅</div>
<div class="foto">🌊</div>
<div class="foto">🏔️</div>
<div class="foto">🌲</div>
<div class="foto">🌸</div>
<div class="foto">🦋</div>
</div>
Live voorbeeld
Oefening 2 – Paginalay-out met grid-areas
Bouw een klassieke header/sidebar/content/footer-lay-out:
• body: margin 0, font-family sans-serif, min-height 100vh, display grid, grid-template-columns 200px 1fr, grid-template-rows 50px 1fr 40px, grid-template-areas "header header" "sidebar content" "footer footer"
• header: grid-area header, background #0f172a, color #2dd4bf, display flex, align-items center, padding 0 16px, font-weight 700
• .sidebar: grid-area sidebar, background #1e293b, color #94a3b8, padding 16px, font-size 14px
• main: grid-area content, padding 16px, color #111827, background #f8fafc
• footer: grid-area footer, background #0f172a, color #475569, display flex, align-items center, padding 0 16px, font-size 12px
HTML
<header>⚡ MijnApp</header>
<div class="sidebar">
<p>Menu item 1</p>
<p>Menu item 2</p>
</div>
<main>
<h1>Dashboard</h1>
<p>Welkom terug!</p>
</main>
<footer>© 2026 MijnApp</footer>
Live voorbeeld
Quiz
Les 7 afgerond!
Grid beheerst! Je kunt nu volledige paginalay-outs bouwen. Volgende stap: responsive design.