SVG animations can be implemented in multiple ways, each with its own characteristics and use cases:
1. SMIL Animation (Native SVG Animation) SMIL (Synchronized Multimedia Integration Language) is the native animation syntax supported by SVG.
Common Elements:
<animate>: Basic attribute animation<animateTransform>: Transform animation (rotate, scale, translate, skew)<animateMotion>: Motion along a path
Example:
svg<svg width="200" height="200"> <circle cx="50" cy="50" r="20" fill="red"> <animate attributeName="cx" from="50" to="150" dur="2s" repeatCount="indefinite" /> <animate attributeName="fill" values="red;blue;red" dur="2s" repeatCount="indefinite" /> </circle> </svg>
Pros:
- Native support, no JavaScript needed
- Declarative syntax, easy to understand
- Good performance
Cons:
- Chrome has announced deprecation of SMIL
- Limited flexibility
- Difficult to debug
2. CSS Animation
Using CSS @keyframes and transition properties.
Example:
svg<svg width="200" height="200"> <style> .circle { animation: move 2s infinite alternate; transition: fill 0.3s; } .circle:hover { fill: blue; } @keyframes move { from { transform: translateX(0); } to { transform: translateX(100px); } } </style> <circle class="circle" cx="50" cy="50" r="20" fill="red" /> </svg>
Pros:
- Widely supported, standard technology
- Excellent performance (GPU accelerated)
- Easy to maintain and debug
- Supports interactive states like hover
Cons:
- Cannot directly manipulate internal SVG attributes
- Complex animations require extensive CSS
3. JavaScript Animation Manipulating SVG DOM with JavaScript or using animation libraries.
Native JavaScript Example:
javascriptconst circle = document.querySelector('circle'); let position = 50; function animate() { position += 1; circle.setAttribute('cx', position); if (position < 150) { requestAnimationFrame(animate); } } animate();
Using GSAP Library Example:
javascriptgsap.to('circle', { attr: { cx: 150 }, duration: 2, repeat: -1, yoyo: true });
Pros:
- Maximum flexibility
- Can implement complex logic
- Rich animation library support (GSAP, Anime.js, etc.)
- Can interact with other JavaScript
Cons:
- Requires more code
- Performance needs optimization
- Depends on JavaScript
Selection Recommendations:
- Simple animations: Prioritize CSS animations
- Complex interactions: Use JavaScript + animation libraries
- Backward compatibility: Avoid SMIL
- Performance critical: Prioritize CSS and requestAnimationFrame