Met CSS-animaties maak je een website levendiger en aantrekkelijker. Denk aan een knop die subtiel beweegt, een afbeelding die draait of een vakje dat geleidelijk verschijnt. In dit hoofdstuk leer je hoe je met alleen CSS de volgende technieken gebruikt:
Met transform verander je alleen de visuele weergave van een element. Het element blijft op
dezelfde plek in de pagina-indeling; alleen hoe het eruitziet verschuift, draait of schaalt.
translate)translateX(waarde)translateX(20px) → schuift 20px naar rechtstranslateX(-20px) → schuift 20px naar links
translateY(waarde)translateY(15px) → schuift 15px naar benedentranslateY(-10px) → schuift 10px omhoog
rotate)rotate(hoek)rotate(45deg) → draait 45° met de klok meerotate(-30deg) → draait 30° tegen de klok in
scale)scale(factor)scale(1.2) → vergroot het element tot 120%scale(0.8) → verkleint het element tot 80%
Meerdere bewerkingen kun je achter elkaar zetten, zonder komma’s:
/* Schuift 10px omlaag, draait 30° en vergroot 10% */
transform: translateY(10px) rotate(30deg) scale(1.1);
Waaromtransformgebruiken?
Je kunt een element bewegen of draaien zonder dat andere elementen in je layout beïnvloed worden. Vooral handig voor knoppen, afbeeldingen of icoontjes die je subtiel wilt animeren.
Zónder transition veranderen eigenschappen direct. Met transition geef je aan dat een
verandering in een opgegeven eigenschap geleidelijk moet verlopen over een bepaalde tijd en met een
gekozen snelheidscurve.
selector {
transition: [eigenschap] [duur] [timing-function] [vertraging];
}
/* Bijvoorbeeld:
transition: transform 0.5s ease, opacity 0.5s ease;
*/
transform, opacity, background-color0.5s, 1s, 300mslinear (constante snelheid)ease (langzaam→snel→langzaam)ease-in (langzaam→snel)ease-out (snel→langzaam)ease-in-out (langzaam→snel→langzaam)
0.2s om even pauze te hebben voor de start).box {
/* Begin: 20px lager en onzichtbaar */
transform: translateY(20px);
opacity: 0;
/* Vloeiende overgang voor transform en opacity in 0.5s met ease */
transition: transform 0.5s ease, opacity 0.5s ease;
}
/* Bij hover schuift box omhoog en wordt zichtbaar in 0.5s */
.container:hover .box {
transform: translateY(0); /* terug naar normale positie */
opacity: 1; /* volledig zichtbaar */
}
Tip: Zondertransition-duration(bv.0.5s) zou de verandering direct (hard) gebeuren.
Maak twee aparte bestanden: index.html en style.css.
index.html)<!DOCTYPE html>
<html lang="nl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Animatie bij hover</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<section class="voorbeeld-hover">
<h2>Vakje verschijnt bij hover</h2>
<div class="container">
<!-- Vakje dat in eerste instantie verborgen is -->
<div class="box"></div>
<p>Beweeg je muis over deze kader om de box omhoog te laten komen.</p>
</div>
</section>
</body>
</html>
style.css)/* Container met stippellijn om duidelijk te maken waar je moet hoveren */
.container {
border: 2px dashed #888;
padding: 16px;
display: inline-block;
margin-bottom: 16px;
}
/* Blauwe box die in eerste instantie onzichtbaar en 20px lager staat */
.box {
width: 100px;
height: 100px;
background-color: blue;
/* Beginstatus */
transform: translateY(20px);
opacity: 0;
transition: transform 0.5s ease, opacity 0.5s ease;
}
/* Bij hover op .container: box in 0.5s omhoog schuiven en zichtbaar maken */
.container:hover .box {
transform: translateY(0);
opacity: 1;
}
Uitleg:
1. .box begint 20px lager (translateY(20px)) en is onzichtbaar (opacity: 0).
2. Als je met je muis over .container gaat, krijgt .box translateY(0) en opacity: 1.
3. Dankzij transition: transform 0.5s ease, opacity 0.5s ease verloopt dat in 0,5s vloeiend.
Met de checkbox-hack gebruik je een verborgen <input type="checkbox"> en een <label> om heel eenvoudig een klik‐functionaliteit in CSS te maken.
<section class="voorbeeld-checkbox">
<h2>Klik om vakje te tonen/verbergen</h2>
<!-- Label werkt als knop (via for="toggle") -->
<label for="toggle" class="btn-toggle">Toon/Verberg vakje</label>
<!-- Onzichtbare checkbox -->
<input type="checkbox" id="toggle">
<!-- Het vakje dat we willen tonen of verbergen -->
<div class="box2"></div>
<p>Klik op de knop hierboven om zonder JavaScript de blauwe box te laten verschijnen of verdwijnen.</p>
</section>
/* Verberg de checkbox zelf, we zien alleen de label */
#toggle {
display: none;
}
/* Beginstatus: box2 staat 20px lager en is onzichtbaar */
.box2 {
width: 100px;
height: 100px;
background-color: blue;
transform: translateY(20px);
opacity: 0;
transition: transform 0.5s ease, opacity 0.5s ease;
}
/* Als de checkbox is aangevinkt: box2 naar normale positie en zichtbaar */
#toggle:checked + .box2 {
transform: translateY(0);
opacity: 1;
}
/* Label als knop */
.btn-toggle {
display: inline-block;
padding: 8px 12px;
background-color: #2c3e50;
color: #fff;
border-radius: 4px;
cursor: pointer;
user-select: none;
margin-bottom: 8px;
text-align: center;
}
.btn-toggle:hover {
background-color: #34495e;
}
Uitleg:
1. De <input id="toggle"> is onzichtbaar (display: none).
2. .box2 begint 20px lager (translateY(20px)) en onzichtbaar (opacity: 0).
3. De selector #toggle:checked + .box2 pakt de box die direct ná de checkbox staat. Bij “checked” verandert de box naar translateY(0) en opacity: 1.
4. De <label for="toggle"> werkt als klikbare knop; elke klik schakelt de checkbox om.
@keyframes-animatie?
Met @keyframes kun je een animatie in meerdere stappen definiëren, waarna je die met
animation automatisch laat afspelen. Handig voor animaties die niet afhangen van hover of click,
maar direct bij het laden van de pagina starten, of die voortdurend herhaald moeten worden.
@keyframes slideRotateFadeIn {
/* Begin: 20px lager, 45° tegen de klok in, onzichtbaar */
0% {
transform: translateY(20px) rotate(-45deg);
opacity: 0;
}
/* Halverwege: 10px lager, 20° draai, halfdoorzichtig */
50% {
transform: translateY(10px) rotate(-20deg);
opacity: 0.5;
}
/* Eind: normale positie, rechtop, volledig zichtbaar */
100% {
transform: translateY(0) rotate(0deg);
opacity: 1;
}
}
.box3 {
width: 100px;
height: 100px;
background-color: blue;
/* 1s animatie, ease-timing, behoud eindtoestand */
animation: slideRotateFadeIn 1s ease forwards;
/* Extra schaduw voor diepte */
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
}
Extra opties
• vertraging: voeg0.3stoe naeaseom pas na 0,3s te starten:
animation: slideRotateFadeIn 1s ease 0.3s forwards;
• herhaling: vervangforwardsdoorinfiniteom eeuwig te herhalen:
animation: slideRotateFadeIn 1s ease infinite;
• Je kunt meerdere animaties achter elkaar zetten, gescheiden door komma’s.
@keyframesMaak twee bestanden: index.html en style.css.
<!DOCTYPE html>
<html lang="nl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Automatische animatie</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<section class="voorbeeld-animatie">
<h2>Automatische animatie met keyframes</h2>
<div class="box3"></div>
<p>Deze box schuift omhoog, draait en wordt zichtbaar zodra de pagina opent.</p>
</section>
</body>
</html>
/* 1. Definieer keyframes met drie stappen */
@keyframes slideRotateFadeIn {
0% {
transform: translateY(20px) rotate(-45deg);
opacity: 0;
}
50% {
transform: translateY(10px) rotate(-20deg);
opacity: 0.5;
}
100% {
transform: translateY(0) rotate(0deg);
opacity: 1;
}
}
/* 2. Pas animatie toe op .box3 */
.box3 {
width: 100px;
height: 100px;
background-color: blue;
animation: slideRotateFadeIn 1s ease forwards;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
}
Uitleg:
• Bij 0% start de box 20px lager en 45° tegen de klok in geroteerd, met opacity: 0.
• Bij 50% is hij half omhoog en halfdoorzichtig, draai 20°.
• Bij 100% staat hij rechtop op de oorspronkelijke plek en is volledig zichtbaar.
• De animation-regel zorgt ervoor dat deze stappen in 1s automatisch worden uitgevoerd.
transition met :hover.transform en transition.:checked) in combinatie met transform en transition.@keyframes met animation.infinite), of element dat bij laden van de pagina in beeld schuift.
@keyframes voor complexe sequenties (0%, 25%, 50%, 75%, 100%).| Techniek | Wat doet het? | Gebruik voor… |
|---|---|---|
transform |
Verschuift, roteert of schaalt een element | Visuele effecten waarbij animatie-element beweegt/draait zonder layout te breken |
transition |
Laat verandering in CSS-eigenschappen geleidelijk verlopen | Hover- en click-effecten waarbij kleur, positie of doorzichtigheid geanimeerd wordt |
@keyframes |
Definieert meerdere tussenstappen voor een animatie | Automatische of herhaalde animaties met meerdere fases (bijv. draaien + verschuiven) |
translateX, translateY), draai (rotate) en schaal (scale) een element visueel.animation-eigenschap.Met deze drie CSS-technieken kun je van simpele hover-effecten tot complexe, automatische animaties bouwen—alles zonder JavaScript. In de oefeningen van dit hoofdstuk ga je hands-on aan de slag met hover, checkbox-tricks, transities, transform-bewegingen en keyframe-animaties. Succes!