SVG-Animaties met CSS en JavaScript: Codevoorbeelden voor Ontwikkelaars (2026)
Praktische codevoorbeelden voor SVG-animatie met CSS-keyframes, GSAP, Framer Motion en vanilla JavaScript. Productieklare snippets voor loaders, transities, hover-effecten en scroll-animaties.

Founder of VectoSolve
Self-taught developer, founder and sole developer of VectoSolve since 2024. He builds the conversion engine and the cutting, embroidery and 3D printing exports.
How this article was made: drafted with AI assistance, then edited and fact-checked before publication. About the author
Waarom SVG-Animaties Ertoe Doen in 2026
SVG-animaties zijn de ruggengraat geworden van moderne webinterfaces. Van subtiele micro-interacties die gebruikers door een checkout-flow leiden tot beeldvullende hero-animaties die een merkidentiteit definiëren — geanimeerde SVG's leveren resolutie-onafhankelijke, lichtgewicht en toegankelijke beweging die geen ander formaat kan evenaren.
In tegenstelling tot rastergebaseerde animaties (GIF's, geanimeerde PNG's of zelfs video) schalen SVG's perfect naar elke schermgrootte, blijven ze scherp op 4K- en Retina-displays, en kunnen ze worden gemanipuleerd met dezelfde CSS en JavaScript die je al kent. In 2026, met Core Web Vitals die direct invloed hebben op zoekrankings, is het beheersen van SVG-animatie niet optioneel — het is essentieel.
CSS-Animatie Fundamenten voor SVG
CSS is je eerste en vaak beste tool voor SVG-animaties. De compositor-thread van de browser verwerkt CSS-animaties op transform- en opacity-eigenschappen zonder de hoofdthread aan te raken, wat je vloeiende 60fps-prestaties gratis oplevert.
CSS-Transities: De Eenvoudigste Aanpak
.svg-icon {
transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
transform-origin: center;
}
.svg-icon:hover {
transform: scale(1.15);
}
.svg-icon path {
transition: fill 0.25s ease-in-out, stroke 0.25s ease-in-out;
fill: #6366f1;
}
.svg-icon:hover path {
fill: #818cf8;
}
Tip: Stel transform-origin altijd expliciet in op SVG-elementen. In tegenstelling tot HTML-elementen die standaard gecentreerd zijn, gebruiken SVG-elementen standaard de viewport-oorsprong (0, 0).
CSS Keyframe-Animaties: Volledige Creatieve Controle
@keyframes pulse {
0% { transform: scale(1); opacity: 1; }
50% { transform: scale(1.4); opacity: 0.6; }
100% { transform: scale(1); opacity: 1; }
}
.notification-dot {
animation: pulse 2s ease-in-out infinite;
transform-origin: center;
}
@keyframes draw-path {
from { stroke-dashoffset: 1000; }
to { stroke-dashoffset: 0; }
}
.draw-line {
stroke-dasharray: 1000;
animation: draw-path 2.5s ease-out forwards;
}
CSS Transforms: De Performance Sweet Spot
@keyframes spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
@keyframes float-and-rotate {
0% { transform: translateY(0px) rotate(0deg); }
25% { transform: translateY(-10px) rotate(5deg); }
50% { transform: translateY(-18px) rotate(0deg); }
75% { transform: translateY(-10px) rotate(-5deg); }
100% { transform: translateY(0px) rotate(0deg); }
}
.floating-element {
animation: float-and-rotate 4s ease-in-out infinite;
transform-origin: center;
}
De Compositor-Veilige Eigenschappen: Alleen transform en opacity worden gegarandeerd op de compositor-thread uitgevoerd. Het animeren van fill, stroke, width, height of d triggert layout-herberekeningen.
JavaScript-Animatiebenaderingen
Wanneer CSS zijn grenzen bereikt — dynamische waarden, scroll-triggers, fysica-simulaties of complexe timelines — neemt JavaScript het over.
De Web Animations API (WAAPI)
const logo = document.querySelector("#svg-logo");
const fadeIn = logo.animate(
[
{ opacity: 0, transform: "translateY(20px) scale(0.95)" },
{ opacity: 1, transform: "translateY(0) scale(1)" }
],
{
duration: 800,
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
fill: "forwards"
}
);
fadeIn.finished.then(() => {
console.log("Logo-animatie voltooid");
animateSubElements();
});
GSAP: De Industriestandaard Bibliotheek
import { gsap } from "gsap";
gsap.from("#hero-svg", {
opacity: 0, scale: 0.8, rotation: -5,
duration: 1.2, ease: "back.out(1.7)",
transformOrigin: "center center"
});
const tl = gsap.timeline({ defaults: { ease: "power2.out" } });
tl.from("#bg-circle", { scale: 0, duration: 0.6 })
.from("#icon-paths path", {
strokeDashoffset: 500, duration: 1, stagger: 0.15
}, "-=0.3")
.from("#label-text", { opacity: 0, y: 15, duration: 0.5 }, "-=0.5");
SMIL-Animaties: Nog Levend, Maar Spaarzaam Gebruiken
<svg viewBox="0 0 100 100">
<circle cx="50" cy="50" r="20" fill="#6366f1">
<animate attributeName="r" values="20;25;20" dur="2s" repeatCount="indefinite" />
<animate attributeName="opacity" values="1;0.6;1" dur="2s" repeatCount="indefinite" />
</circle>
</svg>
Performance-Optimalisatie in Detail
/* GOED: Compositor-thread animaties */
.optimized {
transition: transform 0.3s, opacity 0.3s;
}
.optimized:hover {
transform: translateY(-4px) scale(1.02);
opacity: 0.9;
}
/* SLECHT: Hoofdthread-animaties */
.unoptimized {
transition: top 0.3s, width 0.3s, fill 0.3s;
}
SVG-Complexiteit Verminderen
- Vereenvoudig paden: Gebruik tools zoals SVGO of de ingebouwde optimizer van VectoSolve
- Verwijder verborgen elementen
- Vlak groepen af: Onnodige
<g>-nesting voegt overhead toe - Gebruik symbolen voor herhaalde vormen
Toegankelijkheid: Gebruikersvoorkeuren Respecteren
.animated-element {
animation: slide-in 0.6s ease-out forwards;
}
@media (prefers-reduced-motion: reduce) {
.animated-element {
animation: none;
opacity: 1;
}
}
const prefersReduced = window.matchMedia(
"(prefers-reduced-motion: reduce)"
).matches;
if (prefersReduced) {
element.style.opacity = "1";
} else {
element.animate(
[{ opacity: 0 }, { opacity: 1 }],
{ duration: 600, easing: "ease-out" }
);
}
WCAG 2.2 Succescriterium 2.3.3 beveelt aan dat bewegingsanimatie getriggerd door interactie kan worden uitgeschakeld. Dit is steeds meer een wettelijke vereiste.
CSS vs JavaScript vs AI: De Juiste Aanpak Kiezen
| Criterium | CSS-Animaties | JavaScript (WAAPI/GSAP) | AI (VectoSolve) |
|---|---|---|---|
| Setup-complexiteit | Nul afhankelijkheden | Minimaal tot matig | Uploaden en configureren |
| Prestaties | Uitstekend | Uitstekend / Zeer goed | Uitstekend |
| Dynamische waarden | Beperkt | Volledige controle | AI-bepaald |
| Pad-morphing | Niet ondersteund | Vereist bibliotheek | Ingebouwd |
| Ideaal voor | Hover, loops, transities | Complexe interacties, data viz | Snel prototypen |
Framework-Integratie: React en Next.js
import { useRef, useEffect } from "react";
function AnimatedIcon({ isActive }) {
const pathRef = useRef(null);
useEffect(() => {
const path = pathRef.current;
if (!path) return;
const prefersReduced = window.matchMedia(
"(prefers-reduced-motion: reduce)"
).matches;
if (prefersReduced) {
path.style.strokeDashoffset = "0";
return;
}
const length = path.getTotalLength();
path.style.strokeDasharray = length;
path.style.strokeDashoffset = length;
const animation = path.animate(
[{ strokeDashoffset: length }, { strokeDashoffset: 0 }],
{ duration: 1200, easing: "ease-out", fill: "forwards" }
);
return () => animation.cancel();
}, [isActive]);
return (
<svg viewBox="0 0 64 64" role="img" aria-label="Status">
<path ref={pathRef} d="M18 44 L26 32 L34 38 L46 20"
fill="none" stroke="currentColor" strokeWidth="2.5"
strokeLinecap="round" />
</svg>
);
}
Kernpunten en Volgende Stappen
- Begin met CSS voor eenvoudige hover-effecten, laadstatussen en loop-animaties
- Stap over naar de Web Animations API wanneer je dynamische controle of afspeelmanipulatie nodig hebt
- Adopteer GSAP voor complexe timelines, scroll-animaties en SVG-morphing
- Overweeg AI-tools zoals de SVG-animator van VectoSolve voor snel prototypen
- Optimaliseer altijd met compositor-veilige eigenschappen en respecteer
prefers-reduced-motion
De beste SVG-animatie is er een die de gebruiker nauwelijks opmerkt — het voelt natuurlijk, laadt direct en degradeert elegant voor wie de voorkeur geeft aan stilte.
| Eigenschap | Compositor (Snel) | Layout-triggerend (Langzaam) |
|---|---|---|
| transform | Ja — GPU-versneld | Nee |
| opacity | Ja — GPU-versneld | Nee |
| width / height | Nee | Ja — triggert reflow |
| top / left | Nee | Ja — triggert reflow |
| fill / stroke | Nee | Alleen repaint (matig) |