SVG animation has exploded in popularity over the past few years — and for good reason. Unlike GIFs or video files, animated SVGs are lightweight, scale infinitely without quality loss, and can be controlled with code. Whether you want to create a subtle hover effect on a logo, build a loading spinner, or craft a complex scroll-triggered illustration, SVG animation gives you the power to bring vector graphics to life.
In this comprehensive tutorial, you'll learn everything you need to start animating SVG graphics in 2026. We'll cover CSS animations (the simplest approach), JavaScript libraries like GSAP (the most powerful), and when to use each technique. By the end, you'll have working code snippets you can copy, paste, and adapt for your own projects.
If you're starting with a raster image like a PNG or JPG and want to animate it, you'll first need to convert it to SVG format using a tool like Super Vectorizer Pro. You can try the free trial to preview vectorization results and see how your artwork will look as scalable vector graphics ready for animation.
Need to convert raster images to SVG first? Try Super Vectorizer Pro free trial to preview vectorization results.
Compatible with macOS 10.10+ (M1/M2/M3) & Windows 7/8/10/11
Why Animate SVG? (And When Not To)
Before diving into code, let's understand why SVG animation is worth learning — and its limitations.
Advantages of SVG Animation
- Infinite scalability: SVG animations look crisp on any screen — from a 1x iPhone to an 8K monitor. No pixelation, ever.
- Small file sizes: A well-optimized animated SVG is often 10-50x smaller than the equivalent MP4 or WebP video.
- Programmable: You can start, stop, reverse, and control animations with JavaScript. This enables interactive animations that respond to user actions.
- Accessibility: Unlike video or GIF, SVG content can remain accessible to screen readers (if you use proper ARIA labels).
- No external dependencies: CSS animations require zero JavaScript libraries. The browser handles everything natively.
When NOT to Use SVG Animation
- Complex video content: If you're animating photographic content or complex scenes with hundreds of elements, use MP4/WebM video instead.
- Heavy physics simulations: SVG isn't designed for particle systems with thousands of elements. Use Canvas or WebGL.
- Old browser support: If you need to support IE11 without polyfills, SMIL (the old SVG animation standard) may be your only option — but it's deprecated.
Method 1: CSS Animations (Simplest, Most Performant)
CSS animations are the best place to start. They're hardware-accelerated, don't require JavaScript, and have excellent browser support (97%+ of users).
Basic SVG CSS Animation: Rotating Loader
Here's a simple rotating loader — the "Hello World" of SVG animation:
<svg width="100" height="100" viewBox="0 0 100 100">
<circle
cx="50" cy="50" r="40"
fill="none"
stroke="#0070f3"
stroke-width="8"
stroke-dasharray="60 180"
stroke-linecap="round"
>
<animateTransform
attributeName="transform"
type="rotate"
from="0 50 50"
to="360 50 50"
dur="1.5s"
repeatCount="indefinite"
/>
</circle>
</svg>
This uses the <animateTransform> element (SMIL) which is the simplest way to get started. But for more control, use CSS:
/* The SVG */
<svg class="loader" width="100" height="100" viewBox="0 0 100 100">
<circle cx="50" cy="50" r="40" fill="none"
stroke="#0070f3" stroke-width="8"
stroke-dasharray="60 180" stroke-linecap="round"/>
</svg>
/* The CSS */
@keyframes rotate {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.loader {
animation: rotate 1.5s linear infinite;
transform-origin: 50% 50%;
}
Stroke Animation: The "Drawing" Effect
One of the most distinctive SVG animation effects is making a path appear to draw itself. This uses two CSS properties: stroke-dasharray and stroke-dashoffset.
<svg class="draw-path" width="400" height="100" viewBox="0 0 400 100">
<path d="M 10 50 Q 100 10, 200 50 T 390 50"
fill="none" stroke="#0070f3" stroke-width="3"/>
</svg>
/* First, get the path length using JavaScript:
document.querySelector('.draw-path path').getTotalLength()
Let's say it returns 580 */
.draw-path path {
stroke-dasharray: 580;
stroke-dashoffset: 580;
animation: draw 2s ease forwards;
}
@keyframes draw {
to {
stroke-dashoffset: 0;
}
}
The trick: stroke-dasharray creates dashes as long as the path itself. stroke-dashoffset hides those dashes initially. The animation gradually reveals them, creating the "drawing" effect.
Method 2: JavaScript Animation with GSAP (Most Powerful)
For complex animations — sequencing multiple elements, scroll-triggered effects, or morphing shapes — CSS alone isn't enough. GreenSock Animation Platform (GSAP) is the industry-standard JavaScript animation library, and its DrawSVGPlugin and MorphSVGPlugin are purpose-built for SVG.
Setting Up GSAP
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/gsap.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollTrigger.min.js"></script>
<svg id="morph-demo" width="300" height="200" viewBox="0 0 300 200">
<path id="shape" d="M150 50 L200 150 L100 150 Z"
fill="#0070f3" opacity="0.8"/>
</svg>
Scroll-Triggered SVG Animation
One of the most impressive effects in modern web design is SVG elements that animate as the user scrolls. GSAP's ScrollTrigger makes this straightforward:
gsap.registerPlugin(ScrollTrigger);
// Animate stroke drawing on scroll
gsap.fromTo("#draw-path",
{ strokeDashoffset: 580 },
{
strokeDashoffset: 0,
duration: 2,
scrollTrigger: {
trigger: "#draw-path",
start: "top 80%",
end: "bottom 20%",
scrub: true, // ties animation progress to scroll position
}
}
);
SVG Path Morphing
Morphing one SVG shape into another is visually striking. GSAP's MorphSVGPlugin handles this, but you can also use flubber (free alternative):
import flubber from 'flubber';
const circle = "M50,50m-37,0a37,37 0 1,1 74,0a37,37 0 1,1 -74,0";
const star = "M50,10 L61,38 L91,38 L67,57 L76,85 L50,68 L24,85 L33,57 L9,38 L39,38 Z";
const interpolator = flubber.interpolate(circle, star, { maxSegmentLength: 1 });
// Animate through intermediate shapes
for (let i = 0; i <= 100; i++) {
const t = i / 100;
path.setAttribute("d", interpolator(t));
}
CSS vs JavaScript: Which Should You Choose?
Both approaches have their place. Here's when to use each.
CSS Animations — Best For:
- Simple hover effects and transitions
- Loading spinners and progress indicators
- Always-on animations (bouncing, pulsing)
- Performance-critical animations (hardware accelerated)
- Projects where you want zero JavaScript dependencies
JavaScript (GSAP) — Best For:
- Complex sequencing of multiple elements
- Scroll-triggered animations
- Shape morphing and path interpolation
- Interactive animations (play/pause/reverse)
- Animations that respond to user input (clicks, drags)
Step-by-Step: Create an Animated SVG Logo Hover Effect
Let's build something practical: an SVG logo that "draws itself" when the user hovers over it. This is a common effect on modern websites.
Step 1: Prepare Your SVG
First, make sure your SVG is properly structured. Each path you want to animate should have a stroke (not just fill). If your logo is filled, add a stroke version or use a mask.
<svg class="logo-hover" width="200" height="60" viewBox="0 0 200 60"> <!-- Each letter as a separate path --> <path class="letter" d="M10 10 L..." fill="none" stroke="#0070f3" stroke-width="2"/> <path class="letter" d="M40 10 L..." fill="none" stroke="#0070f3" stroke-width="2"/> <path class="letter" d="M70 10 L..." fill="none" stroke="#0070f3" stroke-width="2"/> </svg>
Step 2: Add the CSS
.logo-hover .letter {
stroke-dasharray: var(--path-length);
stroke-dashoffset: var(--path-length);
transition: stroke-dashoffset 0.6s ease;
}
.logo-hover:hover .letter {
stroke-dashoffset: 0;
}
/* Stagger the animation for each letter */
.logo-hover .letter:nth-child(1) { transition-delay: 0s; }
.logo-hover .letter:nth-child(2) { transition-delay: 0.1s; }
.logo-hover .letter:nth-child(3) { transition-delay: 0.2s; }
Step 3: Set Path Lengths with JavaScript
document.querySelectorAll('.logo-hover .letter').forEach(path => {
const length = path.getTotalLength();
path.style.setProperty('--path-length', length);
path.style.strokeDasharray = length;
path.style.strokeDashoffset = length;
});
Advanced Technique: SVG Line Art Animation
If you have line art (like a sketch or technical drawing) converted to SVG, you can create a stunning "drawing" animation. This works especially well with vectorized sketches — if you have a hand-drawn sketch, first vectorize it to SVG format, then apply this animation technique.
The key insight: when you vectorize line art, each stroke becomes a <path> element. You can animate each path sequentially to create a "drawing" effect that looks like the original sketch being drawn in real-time.
// Get all paths in the SVG
const paths = document.querySelectorAll('.sketch-svg path');
paths.forEach((path, i) => {
const length = path.getTotalLength();
// Set up the path for animation
path.style.strokeDasharray = length;
path.style.strokeDashoffset = length;
// Animate each path with a delay
setTimeout(() => {
path.style.transition = 'stroke-dashoffset 1.5s ease-in-out';
path.style.strokeDashoffset = 0;
}, i * 300); // 300ms delay between each path
});
SVG Animation Techniques Comparison
| Technique | Complexity | Performance | Browser Support | Best Use Case |
|---|---|---|---|---|
| CSS @keyframes | Low | Excellent | 97%+ | Hover effects, spinners |
| CSS stroke-dashoffset | Medium | Excellent | 97%+ | Line drawing effects |
| GSAP | Medium | Very Good | 97%+ | Complex sequencing, scroll triggers |
| Web Animations API | Medium | Good | 90%+ | Native JS animations without libraries |
| SMIL (<animate>) | Low | Fair | Deprecated in favor of CSS/JS | Legacy support only |
Performance Tips for SVG Animation
- Animate
transformandopacityonly: These are GPU-accelerated. Avoid animatingstroke-dashoffseton hundreds of elements simultaneously. - Use
will-change: transform: Hint to the browser that an element will be animated. Don't overdo it — only apply to actively animating elements. - Simplify paths: Before animating, run your SVG through an optimizer like SVG Mini Online to reduce path complexity.
- Avoid animating
filter: SVG filters are computationally expensive. If you need glow effects, pre-render them or use CSSdrop-shadowinstead. - Use
requestAnimationFrame: If writing vanilla JS animations, always userequestAnimationFrameinstead ofsetTimeout/setInterval.
Frequently Asked Questions
Can I animate SVG elements inside an <img> tag?
No. SVG animations only work when the SVG is inline (embedded directly in the HTML) or loaded via an <object> or <iframe> tag. If you use <img src="logo.svg">, the animation won't play. Always inline your SVG if you need to animate it with CSS or JavaScript.
What's the best way to optimize SVG files for animation?
Use our free SVG Minifier tool to remove unnecessary metadata, reduce path complexity, and clean up the code. For animation-ready SVGs, make sure each element you want to animate separately is on its own layer with a unique ID or class. Avoid deeply nested groups when possible.
How do I convert a PNG logo to animated SVG?
First, convert the PNG to SVG using Super Vectorizer Pro (try the free trial to preview results). Once you have the vector version, you can add CSS or JavaScript animations. Note that complex photographic PNGs won't convert well to SVG — this works best for logos, icons, and illustrations with clear lines and flat colors.
Is GSAP free for commercial use?
GSAP's core library (including ScrollTrigger) is free for commercial use under the standard "GreenSock License." Some premium plugins (MorphSVG, DrawSVG) require a Club GreenSock membership. For most SVG animation needs, the free core is sufficient.
Why is my SVG animation choppy on mobile?
Mobile devices have less GPU power. Reduce the number of simultaneously animated elements, avoid animating filter or clip-path, and make sure you're using transform and opacity (which are GPU-accelerated). Also check that your SVG paths aren't unnecessarily complex — simplify them with our SVG compressor.
Ready to Create Animated SVGs?
Start by converting your images to SVG format. Try Super Vectorizer Pro free trial to preview vectorization results, then bring your graphics to life with CSS and JavaScript animations.
Compatible with macOS 10.10+ (M1/M2/M3) & Windows 7/8/10/11
Try These Free Online Tools
No download required — convert, compress & optimize SVGs right in your browser
PNG to SVG Converter
Convert PNG, JPG, BMP images to scalable vector graphics instantly
Try free →SVG Compressor (Mini)
Reduce SVG file size by up to 80% without losing quality
Try free →All Free Tools
Browse our complete collection of free online conversion tools
Browse all →