In de vorige leerjaren heb je geleerd hoe je met media queries (@media) een website responsief maakt. Je stelde harde breekpunten in: op mobiel kreeg een titel een grootte van 24px, op tablet 32px en op desktop 48px.
Hoewel dat uitstekend werkt, heeft het één groot nadeel: de tekst of de tussenruimte 'springt' plotseling van de ene maat naar de andere op het moment dat je het breekpunt passeert.
Moderne CSS biedt hiervoor een revolutionair alternatief: wiskundige CSS-functies. Met min(), max() en clamp() creëer je vloeibare (fluid) typografie en lay-outs die traploos meeschalen met het scherm van de bezoeker — zonder dat je een enkele media query hoeft te schrijven!
Denk aan de manier waarop een vectorillustratie schaalt in Illustrator: alles groeit of krimpt vloeiend mee met het formaat van je werkblad.
Met moderne CSS-functies bereik je hetzelfde effect op het web:
min() functieDe functie min() selecteert altijd de kleinste waarde uit een reeks opgegeven waarden.
Dat klinkt op het eerste gezicht tegenstrijdig, maar in de praktijk gebruik je min() om een maximale grens in te stellen!
.container {
width: min(100%, 1200px);
}
De browser kijkt naar de twee waarden:
1200px.1200px. De container wordt dus 1200px breed.Tip:width: min(100%, 1200px);vervangt in één klap de bekende combinatie vanwidth: 100%; max-width: 1200px;!
max() functieDe functie max() doet het tegenovergestelde: hij kiest altijd de grootste waarde uit een reeks opgegeven waarden.
Je gebruikt max() voornamelijk om een minimale grens (veiligheidsmarge) te garanderen.
.card {
padding: max(20px, 4vw);
}
4vw betekent $4\%$ van de schermbreedte (dynamisch).20px is een vaste minimale padding.20px groter is, kiest de browser 20px. Zo wordt de padding op kleine schermen nooit pijnlijk krap!20px, kiest de browser 60px.clamp() FunctieDe absolute koning van vloeibare typografie en schaling is clamp(). Met clamp() zet je een gewenste flexibele waarde klem tussen een strikte minimale en maximale grens.
selector {
property: clamp(MIN, PREFERRED, MAX);
}
MIN (Minimale waarde): De absolute ondergrens. Het element wordt nooit kleiner dan dit.PREFERRED (Voorkeurswaarde): Een dynamische/relatieve eenheid (zoals vw of %), eventueel gecombineerd met rem.MAX (Maximale waarde): De absolute bovengrens. Het element wordt nooit groter dan dit. Onder de MIN Tussen MIN en MAX Boven de MAX
┌───────────────────────┬───────────────────────────────────────┬───────────────────────┐
│ Blijft op MIN-waarde │ Schaalt vloeiend mee met PREFERRED │ Blijft op MAX-waarde │
└───────────────────────┴───────────────────────────────────────┴───────────────────────┘
h1 {
/* Minimale grootte: 2rem (32px) */
/* Voorkeurswaarde: 5vw + 1rem (schaalt mee met het scherm) */
/* Maximale grootte: 4.5rem (72px) */
font-size: clamp(2rem, 5vw + 1rem, 4.5rem);
}
Waarom combineren wevwmetrembij typografie?
Als je enkelvwgebruikt (bijv.5vw), negeert de browser de toegankelijkheidsinstellingen als een bezoeker zijn tekst wil vergroten. Door5vw + 1remte gebruiken via eencalc()-combinatie, blijft de tekst schaalbaar voor mensen met een visuele beperking!
| Functie | Wat kiest het? | Waarvoor gebruik je het? | Praktijkvoorbeeld |
|---|---|---|---|
min(A, B) | De kleinste waarde | Een maximale grens instellen | width: min(100%, 1000px); |
max(A, B) | De grootste waarde | Een minimale grens/veiligheidsmarge garanderen | margin-top: max(16px, 3vh); |
clamp(MIN, PREF, MAX) | De waarde klem zetten tussen grenzen | Vloeibare typografie & flexibele paddings | font-size: clamp(1rem, 2.5vw, 2.5rem); |
In het onderstaande voorbeeld zie je hoe een complete Hero-sectie en kaarten-grid reageren op de schermbreedte zonder één enkele @media query.
index.html)<header class="hero">
<div class="hero-container">
<h1>Grafische Technieken & Webdesign</h1>
<p>Ontdek de kracht van moderne CSS-functies voor vloeiend schalende interfaces.</p>
<a href="#" class="btn">Bekijk de Opleiding</a>
</div>
</header>
<main class="content-container">
<section class="card-grid">
<article class="card">
<h2>Vloeibare Typografie</h2>
<p>Tekst die perfect mee-ademt met de schermbreedte van elk apparaat.</p>
</article>
<article class="card">
<h2>Slimme Marges</h2>
<p>Geen overbodige witruimte meer op mobiel, wel ademruimte op desktop.</p>
</article>
<article class="card">
<h2>Schone Code</h2>
<p>Minder media queries betekent snellere laadtijden en onderhoudbare stylesheets.</p>
</article>
</section>
</main>
style.css)/* Reset */
*, *::before, *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
font-family: 'Inter', system-ui, sans-serif;
line-height: 1.6;
background-color: #f8fafc;
color: #1e293b;
}
/* 1. VLOEIBARE HERO SECTIE */
.hero {
background: linear-gradient(135deg, #0f172a 0%, #1e3a8a 100%);
color: #ffffff;
/* Vloeibare padding: minimaal 40px op mobiel, maximaal 120px op desktop */
padding-block: clamp(2.5rem, 8vw, 7.5rem);
padding-inline: 1rem;
text-align: center;
}
.hero-container {
/* Slimme maximale breedte met min() */
width: min(100%, 800px);
margin: 0 auto;
}
.hero h1 {
/* Vloeibare titel: tussen 2rem (32px) en 3.5rem (56px) */
font-size: clamp(2rem, 4vw + 1rem, 3.5rem);
line-height: 1.15;
margin-bottom: 1rem;
}
.hero p {
/* Vloeibare subtekst: tussen 1rem (16px) en 1.25rem (20px) */
font-size: clamp(1rem, 1.5vw, 1.25rem);
color: #cbd5e1;
margin-bottom: 2rem;
}
.btn {
display: inline-block;
background-color: #2563eb;
color: #ffffff;
text-decoration: none;
font-weight: bold;
/* Vloeibare knop-padding */
padding: clamp(0.75rem, 2vw, 1rem) clamp(1.5rem, 3vw, 2.5rem);
border-radius: 8px;
transition: background-color 0.2s;
}
.btn:hover {
background-color: #1d4ed8;
}
/* 2. LAY-OUT CONTAINER & GRID */
.content-container {
/* Container breedte nooit groter dan 1100px */
width: min(90%, 1100px);
/* Vloeibare marge boven en onder de content */
margin-block: clamp(2rem, 6vw, 5rem);
margin-inline: auto;
}
.card-grid {
display: grid;
/* Automatisch kolommen maken met een minimale kaartbreedte van 250px */
grid-template-columns: repeat(auto-fit, minmax(min(100%, 250px), 1fr));
/* Vloeibare tussenruimte tussen de kaarten */
gap: clamp(1rem, 3vw, 2rem);
}
.card {
background-color: #ffffff;
/* Vloeibare binnenruimte in de kaart */
padding: clamp(1.25rem, 3vw, 2rem);
border-radius: 12px;
border: 1px solid #e2e8f0;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05);
}
.card h2 {
font-size: clamp(1.25rem, 2vw, 1.5rem);
color: #0f172a;
margin-bottom: 0.5rem;
}
min(): Kiest de kleinste van de opgegeven waarden. Te gebruiken voor maximale afmetingen (bijv. width: min(100%, 1200px)).max(): Kiest de grootste van de opgegeven waarden. Te gebruiken voor minimale veiligheidsmarges (bijv. padding: max(16px, 2vw)).clamp(MIN, PREFERRED, MAX): Zet een waarde klem tussen een onder- en bovengrens. De ideale oplossing voor vloeibare typografie en ruimtes.clamp() altijd vw met rem (bijv. 2vw + 1rem) zodat visueel beperkten de tekst nog kunnen vergroten in hun browser.@media queries in je CSS aanzienlijk.