CSS Animatie Gids: Transities, Keyframes en Prestaties
CSS animaties brengen interfaces tot leven, bieden visuele feedback, leiden de aandacht van de gebruiker en creëren gedenkwaardige ervaringen. Goed uitgevoerd voelen animaties natuurlijk en intuïtief aan. Slecht uitgevoerd veroorzaken ze jank, leiden ze gebruikers af en kunnen ze zelfs fysiek ongemak veroorzaken. Deze gids behandelt alles, van de basisprincipes van transities en keyframes tot geavanceerde prestatie-optimalisatie en toegankelijkheid, en geeft u de kennis om animaties te maken die vloeiend, doelgericht en inclusief zijn.
CSS Transities vs Animaties
CSS biedt twee verschillende mechanismen voor het creëren van beweging: transities en animaties. Begrijpen wanneer u elk moet gebruiken is de basis van effectief CSS-animatiewerk.
CSS Transities
Transities animeren de overgang tussen twee toestanden van een CSS-eigenschap. U definieert welke eigenschappen u wilt animeren, hoe lang de animatie duurt en welke easing-curve u wilt gebruiken. De browser handelt de interpolatie tussen de begin- en eindwaarden automatisch af. Transities worden geactiveerd door toestandsveranderingen zoals hover, focus, het toevoegen van klassen of JavaScript-eigenschapswijzigingen.
.button {
background: #3b82f6;
transform: scale(1);
transition: background 0.3s ease, transform 0.2s ease;
}
.button:hover {
background: #2563eb;
transform: scale(1.05);
}Transities zijn ideaal voor eenvoudige animaties met twee toestanden. Ze vereisen minimale code, zijn gemakkelijk te begrijpen en werken betrouwbaar in verschillende browsers. De beperking is dat ze alleen animeren tussen twee waarden — u kunt geen tussenstappen definiëren.
CSS Animaties (Keyframes)
Animaties gebruiken @keyframes-regels om reeksen van stijlwijzigingen over een willekeurig aantal stappen te definiëren. In tegenstelling tot transities kunnen animaties onafhankelijk van toestandsveranderingen worden uitgevoerd, oneindig herhalen, in omgekeerde richting worden afgespeeld en midden in de animatie worden gepauzeerd. Ze geven u nauwkeurige controle over elk frame van de animatie.
@keyframes pulse {
0% {
transform: scale(1);
opacity: 1;
}
50% {
transform: scale(1.05);
opacity: 0.8;
}
100% {
transform: scale(1);
opacity: 1;
}
}
.pulse-element {
animation: pulse 2s ease-in-out infinite;
}Wanneer Elk te Gebruiken
| Scenario | Transitie gebruiken | Animatie gebruiken |
|---|---|---|
| Hover-effecten | Ja | Nee |
| Focus-toestanden | Ja | Nee |
| Zichtbaarheid wisselen | Ja | Mogelijk |
| Reeksen met meerdere stappen | Nee | Ja |
| Herhalende animaties | Nee | Ja |
| Onafhankelijk van toestand | Nee | Ja |
| Entree-animaties | Mogelijk | Ja |
Keyframe Syntax Diepgaand Bekeken
De @keyframes-regel is het hart van CSS animaties. De syntaxis volledig begrijpen ontsluit de kracht van animatiereeksen met meerdere stappen.
Percentagegebaseerde Keyframes
Keyframes worden gedefinieerd met behulp van procentuele waarden van 0% tot 100%, die de voortgang door de animatietijdlijn vertegenwoordigen. U kunt zoveel keyframes definiëren als nodig is, en de browser interpoleert tussen hen:
@keyframes bounce {
0%, 100% {
transform: translateY(0);
}
25% {
transform: translateY(-20px);
}
50% {
transform: translateY(0);
}
75% {
transform: translateY(-10px);
}
}Meerdere keyframes kunnen hetzelfde stijlblok delen door de procentuele waarden met komma's te scheiden, zoals weergegeven met 0%, 100% in het bovenstaande voorbeeld. Dit is nuttig voor animaties die terugkeren naar hun beginstatus.
De Animation Shorthand
De animation shorthand-eigenschap combineert acht subeigenschappen in één declaratie. De volgorde is: name, duration, timing-function, delay, iteration-count, direction, fill-mode en play-state.
.element {
animation: slideIn 0.5s ease-out 0.2s 1 forwards running;
}
/* Equivalent longhand */
.element {
animation-name: slideIn;
animation-duration: 0.5s;
animation-timing-function: ease-out;
animation-delay: 0.2s;
animation-iteration-count: 1;
animation-direction: normal;
animation-fill-mode: forwards;
animation-play-state: running;
}Animation Fill Mode
De eigenschap animation-fill-mode bepaalt welke stijlen van toepassing zijn voordat en nadat de animatie wordt uitgevoerd. Dit is een van de meest verkeerd begrepen animatie-eigenschappen:
- none (standaard): Het element keert terug naar zijn pre-animatie stijlen wanneer de animatie eindigt.
- forwards: Het element behoudt de stijlen van het laatste keyframe nadat de animatie eindigt. Essentieel voor entree-animaties waarbij u wilt dat het element op zijn eindpositie blijft.
- backwards: Het element past de stijlen van het eerste keyframe toe tijdens de vertragingsperiode van de animatie, voordat de animatie begint.
- both: Combineert forwards en backwards gedrag. Het element toont het eerste keyframe tijdens de vertraging en behoudt het laatste keyframe na voltooiing.
Easing Functies
Easing-functies (ook wel timing-functies genoemd) definiëren de versnellingscurve van een animatie. Ze bepalen of de animatie langzaam begint en versnelt, snel begint en vertraagt, of een meer complex patroon volgt. De juiste easing-functie maakt dat animaties natuurlijk aanvoelen; de verkeerde maakt ze robotachtig of schokkerig.
Ingebouwde Easing Functies
- linear: Constante snelheid door de hele animatie. Ziet zelden natuurlijk omdat objecten in de echte wereld niet met constante snelheid bewegen. Nuttig voor mechanische of roterende animaties.
- ease (standaard): Begint langzaam, versnelt in het midden en vertraagt aan het einde. Een goede algemene easing die werkt voor de meeste UI-transities.
- ease-in: Begint langzaam en versnelt. Creëert een "momentum opbouwend" gevoel. Goed voor elementen die het scherm verlaten of vallen.
- ease-out: Begint snel en vertraagt. Creëert een "op zijn plaats settend" gevoel. De meest gebruikte easing voor UI-elementen die het scherm betreden.
- ease-in-out: Langzame start en langzaam einde met sneller midden. Vergelijkbaar met ease maar met meer uitgesproken versnelling en vertraging. Goed voor grotere, dramatischere transities.
Kubische Bezier Curven
De functie cubic-bezier() laat u aangepaste easing-curven definiëren met nauwkeurige controle. Het neemt vier parameters die de controlepunten van een kubische Bezier-curve vertegenwoordigen: cubic-bezier(x1, y1, x2, y2) . De x-waarden vertegenwoordigen tijd (0 tot 1) en de y-waarden vertegenwoordigen voortgang (kan 0-1 overschrijden voor overshoot).
.element {
/* Smooth deceleration - great for entrances */
transition: transform 0.3s cubic-bezier(0.0, 0.0, 0.2, 1.0);
/* Smooth acceleration - great for exits */
transition: transform 0.2s cubic-bezier(0.4, 0.0, 1, 1);
/* Material Design standard easing */
transition: transform 0.3s cubic-bezier(0.4, 0.0, 0.2, 1);
}Stapfuncties
De functie steps() creëert discrete, frame-voor-frame animatie in plaats van vloeiende interpolatie. Dit is nuttig voor sprite sheet-animaties of voor het creëren van een "typing"-effect:
@keyframes typing {
from { width: 0; }
to { width: 100%; }
}
.typing-effect {
animation: typing 3s steps(40, end);
overflow: hidden;
white-space: nowrap;
}Prestatie-optimalisatie
Vloeiende animaties vereisen het behalen van 60 frames per seconde (fps), wat betekent dat elk frame in minder dan 16,67 milliseconden moet zijn voltooid. Het niet halen van dit budget veroorzaakt zichtbare jank — stotteren, gevallen frames en een verslechterde gebruikerservaring. Het begrijpen van de rendering-pipeline van de browser is essentieel voor het schrijven van prestatiegerichte animaties.
De Rendering Pipeline
Wanneer een CSS-eigenschap verandert, doorloopt de browser tot drie stadia om de weergave bij te werken:
- Style: Bepalen welke CSS-regels op welke elementen van toepassing zijn.
- Layout: De grootte en positie van elk element berekenen. Geactiveerd door wijzigingen in width, height, margin, padding, top, left, font-size en andere geometrische eigenschappen.
- Paint: De pixels voor elk element invullen. Geactiveerd door wijzigingen in color, background, box-shadow, border-radius en andere visuele eigenschappen.
- Composite: De geschilderde lagen in de juiste volgorde combineren. Alleen deze stap wordt op de GPU uitgevoerd. Geactiveerd door wijzigingen in transform en opacity.
Animaties die alleen de composite-stap activeren zijn het meest prestatiegericht omdat ze layout en paint volledig overslaan. Daarom zijn transform en opacity de gouden standaard voor prestatiegerichte CSS animaties.
Alleen-Compositor Eigenschappen
| Eigenschap | Activeert Layout? | Activeert Paint? | GPU-gecombineerd? |
|---|---|---|---|
| transform | Nee | Nee | Ja |
| opacity | Nee | Nee | Ja |
| filter | Nee | Ja | Soms |
| top / left | Ja | Ja | Nee |
| width / height | Ja | Ja | Nee |
| margin / padding | Ja | Ja | Nee |
| background-color | Nee | Ja | Nee |
| box-shadow | Nee | Ja | Nee |
will-change Gebruiken
De eigenschap will-change vertelt de browser welke eigenschappen naar verwachting zullen veranderen, waardoor deze vooraf kan optimaliseren door het element te promoveren naar een eigen compositor-laag. Het moet echter spaarzaam worden gebruikt:
/* Apply will-change just before the animation */
.element:hover {
will-change: transform;
}
/* Remove it after the animation completes */
.element {
transition: transform 0.3s ease;
}Veelvoorkomende fouten met will-change zijn onder andere het toepassen op te veel elementen (elke compositor-laag verbruikt GPU-geheugen) en het permanent aan laten staan (verspilt bronnen). Een goede praktijk is om will-change via JavaScript toe te voegen vlak voordat de animatie begint en het te verwijderen wanneer de animatie eindigt.
Transform in Plaats van Layout Eigenschappen
De meest impactvolle prestatie-optimalisatie is het vervangen van layout-activerende eigenschappen door transforms:
- Gebruik transform: translateX(100px) in plaats van left: 100px
- Gebruik transform: translateY(50px) in plaats van top: 50px
- Gebruik transform: scale(1.5) in plaats van width: 150%; height: 150%
- Gebruik transform: rotate(45deg) in plaats van roteren via layout
Veelvoorkomende Animatiepatronen
Bepaalde animatiepatronen verschijnen herhaaldelijk in webinterfaces. Het beheersen van deze patronen geeft u een gereedschapskist voor de meest voorkomende UI-animatiebehoeften.
1. Fade In
De eenvoudigste en meest universeel toepasbare entree-animatie. Elementen gaan van transparant naar ondoorzichtig:
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
.fade-in {
animation: fadeIn 0.4s ease-out forwards;
}2. Omhoog Schuiven en Fade
Een dynamischere entree die verticale beweging combineert met opacity. Dit creëert het gevoel dat het element van onder komt:
@keyframes slideUpFade {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.slide-up {
animation: slideUpFade 0.5s cubic-bezier(0.4, 0, 0.2, 1) forwards;
}3. Schalen bij Hover
Een subtiele schaalvergroting bij hover biedt bevredigende interactieve feedback:
.card {
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.card:hover {
transform: translateY(-4px) scale(1.02);
box-shadow: 0 12px 24px rgba(0, 0, 0, 0.15);
}4. Gespreide Lijstanimatie
Wanneer een lijst met items verschijnt, creëert het spreiden van de animatievertraging voor elk item een cascade-effect dat het oog leidt:
.list-item {
opacity: 0;
transform: translateY(10px);
animation: slideUpFade 0.3s ease-out forwards;
}
.list-item:nth-child(1) { animation-delay: 0.0s; }
.list-item:nth-child(2) { animation-delay: 0.05s; }
.list-item:nth-child(3) { animation-delay: 0.1s; }
.list-item:nth-child(4) { animation-delay: 0.15s; }
.list-item:nth-child(5) { animation-delay: 0.2s; }Voor dynamische lijsten gebruikt u JavaScript om de animation-delay in te stellen op basis van de index van elk item, of gebruikt u CSS custom properties: style="animation-delay: calc(var(--i) * 0.05s)" .
5. Loading Spinner
Een vloeiende, continue rotatie is de klassieke laadindicator:
@keyframes spin {
to { transform: rotate(360deg); }
}
.spinner {
width: 24px;
height: 24px;
border: 3px solid rgba(255, 255, 255, 0.2);
border-top-color: #3b82f6;
border-radius: 50%;
animation: spin 0.8s linear infinite;
}Animatie Toegankelijkheid: prefers-reduced-motion
Niet alle gebruikers profiteren van animaties. Voor mensen met evenwichtsstoornissen, bewegingsgevoeligheid of bepaalde cognitieve aandoeningen kunnen animaties duizeligheid, misselijkheid of toevallen veroorzaken. De media query prefers-reduced-motion stelt u in staat de systeemvoorkeur van de gebruiker voor verminderde beweging te respecteren.
Verminderde Beweging Implementeren
De aanbevolen benadering is om animaties optioneel te maken voor gebruikers die geen voorkeur voor verminderde beweging hebben ingesteld:
/* Default: no animation for users who prefer reduced motion */
.element {
opacity: 1;
transform: none;
}
/* Only animate for users who have no motion preference */
@media (prefers-reduced-motion: no-preference) {
.element {
animation: slideUpFade 0.5s ease-out forwards;
}
}Als alternatief kunt u specifieke animaties uitschakelen voor gebruikers die de voorkeur geven aan verminderde beweging:
.element {
animation: slideUpFade 0.5s ease-out forwards;
}
@media (prefers-reduced-motion: reduce) {
.element {
animation: none;
opacity: 1;
transform: none;
}
/* Keep functional transitions but shorten duration */
* {
animation-duration: 0.01ms !important;
transition-duration: 0.01ms !important;
}
}Wat te Behouden en Wat te Verwijderen
Niet alle beweging moet worden verwijderd wanneer de gebruiker de voorkeur geeft aan verminderde beweging. Functionele animaties die betekenis of toestand overbrengen moeten worden behouden, alleen vereenvoudigd:
- Verwijderen: Decoratieve animaties, parallax-scrollen, automatisch afspelende carrousels, pulserende effecten en herhalende achtergrondanimaties.
- Vereenvoudigen: Transitieduur moet worden verkort tot bijna onmiddellijk (0,01ms) in plaats van volledig te worden verwijderd, zodat toestandsveranderingen nog steeds waarneembaar zijn.
- Behouden: Functionele toestandstransities (hover, focus, active-toestanden), voortgangsindicatoren en elke animatie die essentiële informatie overbrengt.
Animatiebibliotheken
Terwijl CSS animaties de meeste UI-behoeften afhandelen, bieden JavaScript-animatiebibliotheken geavanceerde mogelijkheden zoals op fysica gebaseerde beweging, scroll-gekoppelde animaties en orkestratie van complexe reeksen.
CSS-First Bibliotheken
- Animate.css: Een verzameling kant-en-klare CSS-animatieklassen. Voeg eenvoudig een klassenaam toe aan een element om een animatie toe te passen. Goed voor snelle prototyping, maar kan leiden tot generiek aanvoelende beweging bij overmatig gebruik.
- Hamburgers: Een verzameling geanimeerde hamburger-menu-pictogramtransities, allemaal geïmplementeerd in pure CSS.
JavaScript Animatiebibliotheken
- Framer Motion: Een React-animatiebibliotheek die declaratieve animatie-API's biedt met veerfysica, layout-animaties en gebisondersteuning. De beste keuze voor React-applicaties.
- GSAP (GreenSock): De krachtigste JavaScript-animatiebibliotheek. Biedt nauwkeurige tijdlijncontrole, complexe easing, SVG-morphing en scroll-geactiveerde animaties. Gebruikt door grote merken voor marketingsites en interactieve ervaringen.
- Anime.js: Een lichtgewicht JavaScript-animatiebibliotheek met een schone API. Ondersteunt CSS-eigenschappen, SVG, DOM-attributen en JavaScript-objecten. Een goed middenweg tussen alleen-CSS en GSAP.
- Motion One: Een moderne, lichtgewicht animatiebibliotheek gebouwd op de Web Animations API. Biedt een minimale API met veerfysica en tijdlijnondersteuning.
Wanneer JavaScript vs CSS te Gebruiken
Gebruik CSS voor eenvoudige, declaratieve animaties die reageren op toestandsveranderingen. Gebruik JavaScript wanneer u het volgende nodig heeft: op fysica gebaseerde beweging (veren, momentum), scroll-gekoppelde animaties, complexe sequentiering met nauwkeurige timingcontrole, dynamische animatieparameters die tijdens runtime worden berekend, of animaties die programmatisch moeten worden gepauzeerd, omgekeerd of gescrubd.
Animaties Debuggen
Animatiebugs kunnen subtiel en moeilijk te diagnosticeren zijn. De juiste debugging-tools en -technieken maken het proces veel efficiënter.
Chrome DevTools Animatiepaneel
Chrome DevTools bevat een speciaal Animations-paneel dat krachtige debugging-mogelijkheden biedt:
- Tijdlijnweergave: Zie alle actieve animaties op de pagina met hun duur, vertragingen en keyframes.
- Afspeelbediening: Vertraag animaties tot 1/4 snelheid, pauzeer of scrub door de tijdlijn frame voor frame.
- Eigenschapsinspectie: Klik op een animatie in de tijdlijn om de exacte CSS-eigenschappen die worden geanimeerd en hun waarden bij elk keyframe te zien.
- Live bewerken: Pas animatieduur, vertraging en easing in realtime aan zonder de pagina te herladen.
Prestatieprofilering
Gebruik het Performance-paneel in Chrome DevTools om animatie-jank te identificeren:
- Neem een prestatietrace op terwijl de animatie wordt uitgevoerd
- Zoek naar frames die het budget van 16,67ms overschrijden (weergegeven als rode balken in het frame-overzicht)
- Controleer op "Layout"-bewerkingen tijdens animatieframes, die wijzen op layout-activerende eigenschappen
- Gebruik het tabblad "Rendering" om "Paint flashing" in te schakelen (toont opnieuw geschilderde gebieden in groen) en "Layer borders" (toont compositor-lagen)
Veelvoorkomende Debugging Scenario's
- Animatie wordt niet uitgevoerd: Controleer of animation-fill-mode correct is ingesteld. Zonder forwards of both keert het element terug naar zijn pre-animatie toestand. Controleer ook of het element de juiste afmetingen heeft — transform: scale(0) maakt het element onzichtbaar maar nog steeds aanwezig.
- Schokkerige animatie: Open het Performance-paneel en zoek naar lange frames. Controleer of u layout-activerende eigenschappen animeert. Schakel over op transform en opacity .
- Animatievertraging voelt verkeerd: Onthoud dat animation-delay een gat creëert voordat de animatie begint. Tijdens dit gat toont het element zijn pre-animatie toestand tenzij animation-fill-mode: backwards of both is ingesteld.
- Animatie werkt in Chrome maar niet in Safari: Safari heeft strengere parsing voor de animation shorthand. Zorg ervoor dat alle waarden in de juiste volgorde staan en dat u geen niet-ondersteunde functies gebruikt.
Werkt u met CSS? Probeer onze gratis CSS-tools om uw stylesheets te formatteren, te verkleinen en te optimaliseren voor productie.
CSS FormatterCSS MinifierVeelgestelde Vragen
Moet ik CSS transities of CSS animaties gebruiken?
Gebruik CSS transities voor eenvoudige toestandsveranderingen die van punt A naar punt B gaan, zoals hover-effecten, focus-toestanden en het wisselen van zichtbaarheid. Gebruik CSS animaties (keyframes) voor complexe reeksen met meerdere stappen, herhalende animaties of animaties die onafhankelijk van toestandsveranderingen moeten worden uitgevoerd. Transities zijn eenvoudiger te schrijven; animaties bieden meer controle.
Welke CSS-eigenschappen zijn veilig te animeren voor prestaties?
De meest prestatiegerichte eigenschappen om te animeren zijn transform en opacity, omdat ze volledig door de GPU-compositor kunnen worden afgehandeld zonder layout of paint te activeren. Andere eigenschappen zoals width, height, margin en top activeren herberekening van layout, wat kostbaar is. Geef altijd de voorkeur aan transform: translateX() boven left, en transform: scale() boven width/height-wijzigingen.
Hoe maak ik animaties toegankelijk voor gebruikers met bewegingsgevoeligheid?
Gebruik de media query prefers-reduced-motion om animaties uit te schakelen of te vereenvoudigen voor gebruikers die de instelling 'beweging verminderen' in hun besturingssysteem hebben ingeschakeld. Wikkel niet-essentiële animaties in @media (prefers-reduced-motion: no-preference) en bied onmiddellijke toestandsveranderingen als fallback voor gebruikers die de voorkeur geven aan verminderde beweging.
Wat is will-change en wanneer moet ik het gebruiken?
will-change is een CSS-eigenschap die de browser hint over welke eigenschappen in de toekomst zullen veranderen, waardoor deze vooraf kan optimaliseren. Gebruik het spaarzaam en alleen wanneer u prestatieproblemen waarneemt. Pas het toe vlak voordat de animatie begint en verwijder het nadat de animatie eindigt. Overmatig gebruik van will-change verspilt GPU-geheugen en kan de prestaties zelfs schaden.
Hoe debug ik CSS animaties?
Chrome DevTools biedt krachtige animatie-debugging-tools. Open het Animations-paneel (in het menu More Tools) om alle actieve animaties te zien, door tijdlijnen te scrubben, duur en vertragingen in realtime aan te passen en animaties te vertragen tot 1/4 snelheid. U kunt ook het Performance-paneel gebruiken om animatie-jank en layout-thrashing te identificeren.