Animate SVGs Visually.
Export Pure CSS.
Draw shapes, set keyframes on a timeline, tweak easing curves — export clean CSS keyframes, SMIL SVG, or a React component. No runtime needed.
Built for icons, loaders, logos, and UI micro-animations.
Wrong tool for the job
Lottie, GSAP, and Rive
are built for something else.
Those tools are great for interactive game-like experiences and complex scenes. But if you need to animate a loading spinner, a nav icon, or a small SVG logo — you don't need a 250 KB runtime. You need CSS, and a visual editor to write it.
This animation
Same animation. Different results.
| Tool | JS Runtime gzip / minified | File size raw / format | Built for |
|---|---|---|---|
| Lottie | 77 KB305 KB min | 16.5 KBJSON file | Complex JSON-driven animation |
| GSAP | 27 KB70 KB min | —write JS code | JS-controlled rich animation |
| Rive | 41 KB143 KB min | —.riv binary | Interactive / game-like animation |
| SVGator | 13 KB36 KB min | 51.1 KBSVG + player script | Subscription editor, proprietary player |
| CSSVGyou are here | 0 KBno runtime | 1.5 KBSMIL SVG · CSS · JSX | Visual editor — icon & SVG animation |
For icons and small SVG animations, the browser already knows how to run it. CSSVG just makes it visual — export SMIL SVG, CSS @keyframes, or React JSX.
Features
Built for the job.
Every control you need to animate an icon or loader. Nothing you don't.
No JavaScript Runtime
Every animation runs in the browser natively — no GSAP, no Lottie, no Rive player. Export SMIL SVG or CSS @keyframes and ship zero bytes of JS. Faster loads, better Core Web Vitals.
3 Export Formats
Export as self-contained SMIL SVG, pure CSS @keyframes, or a React JSX component with inline SMIL. Drop into any stack — no wrappers, no build step, no dependencies.
6 Shape Types
Rectangle, Circle, Line, Polygon, Pen path, and Text. Each shape supports fill, stroke, opacity, border radius, and independent keyframe tracks on the timeline.
Visual Timeline
Drag keyframe diamonds, scrub the playhead, set adjustable duration with an editable M:SS timer, and choose your FPS. Looping, play, pause, and restart controls built in.
Per-Keyframe Easing
Every keyframe interval has its own cubic-bezier curve. Pick from 9 presets (Spring, Bounce, Anticipate…) or drag the interactive bezier graph to dial in the exact feel.
Full Transform Control
Position, rotation, scale X/Y, orbit X/Y, anchor point, and pivot — all animatable per keyframe. Inspect and tweak every property numerically in the inspector panel.
How it works
Four steps.
From blank canvas to animated export in minutes.
Draw
Add shapes to the canvas — rectangle, circle, polygon, line, pen path, or text. Paste an existing SVG or build from scratch. Drag to position, resize handles to fit.
Rect · Circle · Polygon · Line · Path · TextKeyframe
Scrub the playhead to any point in time and set a keyframe. Move, rotate, scale, change fill or opacity — each property is interpolated automatically between keyframes. Adjust duration from 0.5s to any length.
Position · Rotation · Scale · Opacity · Fill · OrbitEase
Click the curve preview on any keyframe to open the bezier easing editor. Drag the two control handles to shape the feel — or pick from 9 presets: Linear, Spring, Bounce, Anticipate, Snap, and more.
9 presets · Interactive bezier graph · Per-keyframeExport
Export as a self-contained SMIL SVG, a CSS @keyframes file, or a React JSX component. Copy and paste directly into your project — no runtime, no build step, no dependencies.
SMIL SVG · CSS @keyframes · React JSXExamples
See what it makes.
Real animations built with CSSVG — icons, loaders, and small SVGs. Fork any of them and edit in the editor.
What you get
Clean code.
Every time.
CSSVG exports readable, minimal SVG and CSS — no minification tricks, no opaque JSON blobs. Drop it straight into your project.
.anim-0 { animation: anim-0 2000ms linear 0s infinite;}.anim-1 { animation: anim-1 2000ms linear 0s infinite;}.anim-2 { animation: anim-2 2000ms linear 0s infinite;}.anim-3 { animation: anim-3 2000ms linear 0s infinite;}@keyframes anim-0 { 0% { opacity: 1; fill: #bcbcbc; stroke: #bcbcbc; } 25% { opacity: 1; fill: #bcbcbc; stroke: #bcbcbc; } 50% { opacity: 1; fill: #bcbcbc; stroke: #bcbcbc; } 75% { opacity: 1; fill: #bcbcbc; stroke: #bcbcbc; } 100% { opacity: 1; fill: #bcbcbc; stroke: #bcbcbc; }}@keyframes anim-1 { 0% { opacity: 1; fill: #bcbcbc; stroke: #bcbcbc; } 25% { opacity: 1; fill: #bcbcbc; stroke: #bcbcbc; } 50% { opacity: 1; fill: #bcbcbc; stroke: #bcbcbc; } 75% { opacity: 1; fill: #bcbcbc; stroke: #bcbcbc; } 100% { opacity: 1; fill: #bcbcbc; stroke: #bcbcbc; }}@keyframes anim-2 { 0% { opacity: 1; fill: #bcbcbc; stroke: #bcbcbc; } 25% { opacity: 1; fill: #bcbcbc; stroke: #bcbcbc; } 50% { opacity: 1; fill: #bcbcbc; stroke: #bcbcbc; } 75% { opacity: 1; fill: #bcbcbc; stroke: #bcbcbc; } 100% { opacity: 1; fill: #bcbcbc; stroke: #bcbcbc; }}@keyframes anim-3 { 0% { opacity: 1; fill: #bcbcbc; stroke: #bcbcbc; } 25% { opacity: 1; fill: #bcbcbc; stroke: #bcbcbc; } 50% { opacity: 1; fill: #bcbcbc; stroke: #bcbcbc; } 75% { opacity: 1; fill: #bcbcbc; stroke: #bcbcbc; } 100% { opacity: 1; fill: #bcbcbc; stroke: #bcbcbc; }}<svg xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 800 600">
<g transform="translate(116.96,329.93)">
<animateTransform attributeName="transform"
type="translate" additive="replace"
values="116.96,329.93;116.72,330.11;
116.96,329.93;117.04,330.03;116.96,329.93"
dur="2s" repeatCount="indefinite"
calcMode="spline"
keyTimes="0;0.25;0.5;0.75;1"
keySplines="0 0 1 1;0 0 1 1;0 0 1 1;0 0 1 1"/>
<rect class="anim-0" fill="#bcbcbc"
stroke="#bcbcbc" x="-33.9" y="-183.5"
width="67.8" height="367.01" rx="15">
<animate attributeName="height"
values="367.01;29.82;367.01;37.29;367.01"
dur="2s" repeatCount="indefinite"
calcMode="spline"
keyTimes="0;0.25;0.5;0.75;1"
keySplines="0 0 1 1;0 0 1 1;0 0 1 1;0 0 1 1"/>
<animate attributeName="y"
values="-183.5;-14.91;-183.5;-18.64;-183.5"
dur="2s" repeatCount="indefinite"
calcMode="spline"
keyTimes="0;0.25;0.5;0.75;1"
keySplines="0 0 1 1;0 0 1 1;0 0 1 1;0 0 1 1"/>
</rect>
</g>
<!-- bars 2–4: same pattern, staggered -->
</svg>Draw it. Keyframe it.
Ship it.
SMIL SVG · CSS @keyframes · React JSX
A visual editor for SVG animation. Set keyframes, shape easing curves, export clean code — no JavaScript runtime, no subscriptions, no proprietary player.
Open Editor — It's Free