Live Demo | API Reference | MCP Server | PNG Animator
Animotion is a production-ready CSS3 animation framework built for the modern web. It provides 745+ hand-crafted animations across 20 categories, 120 SVG icons, a PNG Animator tool, and an MCP server so AI agents can search and use animations directly.
Built for everyone — from manual coders to vibe coders, from junior developers to AI agents.
- 745+ CSS3 animations across 20 categories — the largest collection available
- 120 SVG icons — clean, stroke-based, production-ready
- Zero dependencies — pure CSS, no JavaScript frameworks required
- GPU-optimized — animations use
transformandopacityfor 60fps performance - Copy-paste ready — every animation has a single CSS class
- AI-friendly — MCP server + machine-readable
api.jsonfor agent integration - PNG Animator — upload any image, apply animation, export CSS
- Utility classes — control duration, delay, easing, iteration, stagger
- Accessibility —
prefers-reduced-motionsupport built in - MIT Licensed — free forever, commercial use allowed
Add these lines to your HTML <head>:
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/shouvikfullstack/css3-animations@main/css/keyframes.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/shouvikfullstack/css3-animations@main/css/keyframes-part2.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/shouvikfullstack/css3-animations@main/css/utilities.css">Then use any animation class:
<div class="animotion-fade-in">Hello World</div>git clone https://github.com/shouvikfullstack/css3-animations.gitInclude the CSS files from the css/ folder in your project.
Visit shouvikfullstack.github.io/css3-animations, find your animation, click the card, and copy the CSS.
<!-- Fade in an element -->
<div class="animotion-fade-in">Welcome</div>
<!-- Bounce a button -->
<button class="animotion-bounce">Click Me</button>
<!-- Spin a loader -->
<div class="animotion-spinner-border animotion-infinite"></div>
<!-- Typewriter text -->
<p class="animotion-typewriter">Loading system...</p>Control duration, delay, easing, and more:
<!-- Slow fade with delay -->
<div class="animotion-fade-in-up animotion-duration-1500 animotion-delay-500">
Appears after 500ms, takes 1.5s
</div>
<!-- Bouncy easing -->
<div class="animotion-zoom-in animotion-ease-spring">
Spring effect
</div>
<!-- Infinite loop -->
<div class="animotion-float animotion-infinite">
Floating element
</div>
<!-- Alternate direction -->
<div class="animotion-pulse animotion-infinite animotion-alternate">
Pulsing
</div>Animate list items with increasing delays:
<ul class="animotion-stagger">
<li class="animotion-fade-in-up">Item 1 (0ms delay)</li>
<li class="animotion-fade-in-up">Item 2 (50ms delay)</li>
<li class="animotion-fade-in-up">Item 3 (100ms delay)</li>
<li class="animotion-fade-in-up">Item 4 (150ms delay)</li>
</ul>
<!-- Wider stagger (100ms increments) -->
<div class="animotion-stagger-100">
<div class="animotion-slide-in-left">Card 1</div>
<div class="animotion-slide-in-left">Card 2</div>
<div class="animotion-slide-in-left">Card 3</div>
</div>// Add animation to an element
const el = document.querySelector('.my-element');
el.classList.add('animotion-bounce-in');
// Replay an animation
function replay(element, animClass) {
element.classList.remove(animClass);
void element.offsetWidth; // force reflow
element.classList.add(animClass);
}
// Listen for animation completion
el.addEventListener('animationend', () => {
console.log('Animation finished!');
el.classList.remove('animotion-bounce-in'); // cleanup
});
// Chain animations
async function chainAnimations(el, animations) {
for (const anim of animations) {
el.classList.add(anim);
await new Promise(resolve =>
el.addEventListener('animationend', resolve, { once: true })
);
el.classList.remove(anim);
}
}
// Usage: fade in, then pulse, then glow
chainAnimations(myElement, [
'animotion-fade-in',
'animotion-pulse',
'animotion-glow-pulse'
]);Use Intersection Observer to animate elements as they enter the viewport:
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const anim = entry.target.dataset.animotion;
entry.target.classList.add(anim);
observer.unobserve(entry.target);
}
});
}, { threshold: 0.1 });
// Mark elements for scroll animation
document.querySelectorAll('[data-animotion]').forEach(el => {
observer.observe(el);
});<div data-animotion="animotion-fade-in-up">Animates on scroll</div>
<div data-animotion="animotion-slide-in-left">Slides in on scroll</div>
<div data-animotion="animotion-zoom-in">Zooms in on scroll</div>Animotion respects prefers-reduced-motion. Add the utility class:
<div class="animotion-fade-in animotion-respect-motion">
This animation is disabled for users who prefer reduced motion
</div>Or handle it globally:
@media (prefers-reduced-motion: reduce) {
[class*="animotion-"] {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
}
}| # | Category | Count | Description | Example Classes |
|---|---|---|---|---|
| 1 | Entrance | 65 | Elements appearing on screen | animotion-fade-in, animotion-slide-in-up, animotion-zoom-in, animotion-bounce-in |
| 2 | Exit | 50 | Elements leaving the screen | animotion-fade-out, animotion-slide-out-down, animotion-zoom-out |
| 3 | Attention | 40 | Draw user attention | animotion-bounce, animotion-pulse, animotion-shake-x, animotion-heartbeat |
| 4 | Text | 50 | Typography animations | animotion-typewriter, animotion-shimmer-text, animotion-glitch-text, animotion-neon-flicker |
| 5 | Background | 40 | Animated backgrounds | animotion-gradient-shift, animotion-aurora, animotion-starfield, animotion-particle-field |
| 6 | Button | 40 | Button interactions | animotion-ripple-click, animotion-glow-pulse, animotion-shine-sweep, animotion-press-3d |
| 7 | Card | 35 | Card animations | animotion-card-lift, animotion-card-flip-3d, animotion-glassmorphism, animotion-shimmer-loading |
| 8 | Loader | 60 | Spinners & progress | animotion-spinner-border, animotion-dots-wave, animotion-bars-wave, animotion-orbital |
| 9 | Navigation | 25 | Nav & menu animations | animotion-underline-grow, animotion-hamburger-x, animotion-dropdown-slide |
| 10 | Form | 30 | Input & form animations | animotion-label-float, animotion-input-glow-focus, animotion-toggle-slide |
| 11 | 3D Transform | 35 | 3D perspective effects | animotion-rotate-x-axis, animotion-card-flip-front-back, animotion-cube-spin-loader |
| 12 | Filter | 25 | CSS filter animations | animotion-blur-in, animotion-grayscale-to-color, animotion-hue-rotate-cycle |
| 13 | Micro Interaction | 40 | UI feedback animations | animotion-like-bounce, animotion-notification-pop, animotion-checkmark-draw |
| 14 | Scroll | 25 | Scroll-triggered effects | animotion-scroll-fade-in, animotion-scroll-zoom-in, animotion-scroll-clip-reveal |
| 15 | Creative | 40 | Artistic & special effects | animotion-paint-splash, animotion-ink-bleed, animotion-fire-flicker, animotion-sparkle |
| 16 | Fintech | 30 | Finance & data UI | animotion-ticker-scroll, animotion-price-up, animotion-coin-flip, animotion-chart-line-draw-fintech |
| 17 | Gaming | 40 | Game UI & physics | animotion-gravity-fall, animotion-health-bar-fill, animotion-level-up, animotion-teleport |
| 18 | E-Commerce | 25 | Shopping UI animations | animotion-add-to-cart-bounce, animotion-wishlist-heart, animotion-shipping-truck |
| 19 | Social | 25 | Social media UI | animotion-like-heart, animotion-story-ring, animotion-notification-bell |
| 20 | Dashboard | 25 | Data viz & dashboards | animotion-chart-line-draw, animotion-gauge-needle, animotion-kpi-counter |
| Class | Duration |
|---|---|
.animotion-duration-100 |
100ms |
.animotion-duration-200 |
200ms |
.animotion-duration-300 |
300ms |
.animotion-duration-400 |
400ms |
.animotion-duration-500 |
500ms |
.animotion-duration-600 |
600ms |
.animotion-duration-700 |
700ms |
.animotion-duration-800 |
800ms |
.animotion-duration-1000 |
1s |
.animotion-duration-1200 |
1.2s |
.animotion-duration-1500 |
1.5s |
.animotion-duration-2000 |
2s |
.animotion-duration-2500 |
2.5s |
.animotion-duration-3000 |
3s |
.animotion-duration-5000 |
5s |
| Class | Delay |
|---|---|
.animotion-delay-0 |
0ms |
.animotion-delay-100 |
100ms |
.animotion-delay-200 |
200ms |
.animotion-delay-300 |
300ms |
.animotion-delay-500 |
500ms |
.animotion-delay-700 |
700ms |
.animotion-delay-1000 |
1s |
.animotion-delay-1500 |
1.5s |
.animotion-delay-2000 |
2s |
.animotion-delay-3000 |
3s |
| Class | Curve | Best For |
|---|---|---|
.animotion-ease-linear |
linear |
Continuous motion |
.animotion-ease-in |
ease-in |
Exit animations |
.animotion-ease-out |
ease-out |
Entrance animations |
.animotion-ease-in-out |
ease-in-out |
Symmetric motion |
.animotion-ease-spring |
cubic-bezier(0.175, 0.885, 0.32, 1.275) |
Bouncy entrances |
.animotion-ease-bounce |
cubic-bezier(0.68, -0.55, 0.265, 1.55) |
Playful UI |
.animotion-ease-elastic |
cubic-bezier(0.68, -0.6, 0.32, 1.6) |
Elastic stretch |
.animotion-ease-smooth |
cubic-bezier(0.4, 0, 0.2, 1) |
Material Design |
.animotion-ease-sharp |
cubic-bezier(0.4, 0, 0.6, 1) |
Quick transitions |
.animotion-ease-decelerate |
cubic-bezier(0, 0, 0.2, 1) |
Smooth stop |
.animotion-ease-accelerate |
cubic-bezier(0.4, 0, 1, 1) |
Smooth start |
.animotion-ease-overshoot |
cubic-bezier(0.34, 1.56, 0.64, 1) |
Overshoot & settle |
| Class | Effect |
|---|---|
.animotion-once |
Play once |
.animotion-twice |
Play twice |
.animotion-thrice |
Play three times |
.animotion-infinite |
Loop forever |
.animotion-normal |
Normal direction |
.animotion-reverse |
Reverse direction |
.animotion-alternate |
Alternate direction |
.animotion-alternate-reverse |
Alternate starting in reverse |
| Class | Effect |
|---|---|
.animotion-fill-none |
No fill |
.animotion-fill-forwards |
Keep end state |
.animotion-fill-backwards |
Apply start state during delay |
.animotion-fill-both |
Both forwards and backwards |
.animotion-running |
Animation running |
.animotion-paused |
Animation paused |
| Class | Effect |
|---|---|
.animotion-gpu |
Force GPU acceleration (will-change: transform, opacity) |
.animotion-respect-motion |
Disable animation for prefers-reduced-motion |
Animotion provides a machine-readable JSON API at api.json for programmatic access.
GET https://shouvikfullstack.github.io/css3-animations/api.json
{
"name": "animotion",
"version": "1.0.0",
"totalAnimations": 745,
"totalCategories": 20,
"categories": [
{
"id": "entrance",
"name": "Entrance",
"icon": "→",
"color": "#3b82f6",
"count": 65
}
],
"animations": [
{
"id": "E01",
"name": "Fade In",
"description": "Element fades in from transparent to opaque",
"cssClass": "animotion-fade-in",
"keyframeName": "animotion-fadeIn",
"category": "entrance",
"subcategory": "fade",
"tags": ["fade", "opacity", "entrance", "basic"],
"duration": "0.6s",
"timingFunction": "ease-out",
"iterationCount": "1",
"fillMode": "both",
"demoType": "box",
"css": ".animotion-fade-in { animation: animotion-fadeIn 0.6s ease-out both; }",
"keyframeCSS": "@keyframes animotion-fadeIn { from { opacity: 0; } to { opacity: 1; } }"
}
]
}const response = await fetch('https://shouvikfullstack.github.io/css3-animations/api.json');
const data = await response.json();
// Get all loader animations
const loaders = data.animations.filter(a => a.category === 'loader');
console.log(`${loaders.length} loader animations available`);
// Search by name
const searchResults = data.animations.filter(a =>
a.name.toLowerCase().includes('fade')
);const anim = data.animations.find(a => a.cssClass === 'animotion-bounce-in');
// Inject into page
const style = document.createElement('style');
style.textContent = anim.keyframeCSS + '\n' + anim.css;
document.head.appendChild(style);
// Apply to element
document.querySelector('.my-element').classList.add(anim.cssClass);const data = await fetch('/api.json').then(r => r.json());
// Populate a <select> dropdown
const select = document.getElementById('animation-picker');
data.categories.forEach(cat => {
const group = document.createElement('optgroup');
group.label = `${cat.name} (${cat.count})`;
data.animations
.filter(a => a.category === cat.id)
.forEach(a => {
const opt = document.createElement('option');
opt.value = a.cssClass;
opt.textContent = a.name;
group.appendChild(opt);
});
select.appendChild(group);
});Animotion includes a Model Context Protocol (MCP) server that lets AI agents like Claude, GPT, and others directly search, retrieve, and compose animations.
cd mcp/
npm installAdd to your ~/.claude/claude_desktop_config.json:
{
"mcpServers": {
"animotion": {
"command": "node",
"args": ["/absolute/path/to/css3-animations/mcp/server.js"]
}
}
}Add to your project's .claude/settings.json:
{
"mcpServers": {
"animotion": {
"command": "node",
"args": ["/absolute/path/to/css3-animations/mcp/server.js"]
}
}
}Search animations by name, category, or tags.
// Input
{
"query": "fade in",
"category": "entrance",
"limit": 10
}
// Output — matching animations with metadata
{
"count": 13,
"animations": [
{
"id": "E01",
"name": "Fade In",
"description": "Element fades in from transparent to opaque",
"cssClass": "animotion-fade-in",
"category": "entrance",
"tags": ["fade", "opacity", "entrance", "basic"],
"duration": "0.6s"
}
]
}Get complete details for a specific animation by ID or class name.
// Input
{ "id": "E01" }
// or
{ "id": "animotion-fade-in" }
// Output — full animation object including CSS codeList all 20 animation categories with names, icons, colors, and counts.
// No input needed
// Output
{
"categories": [
{ "id": "entrance", "name": "Entrance", "icon": "→", "color": "#3b82f6", "count": 65 },
{ "id": "exit", "name": "Exit", "icon": "←", "color": "#94a3b8", "count": 50 },
...
]
}Compose custom CSS with your own duration, easing, delay, and selector.
// Input
{
"animation": "animotion-bounce-in",
"selector": ".my-modal",
"duration": "0.8s",
"easing": "cubic-bezier(0.175, 0.885, 0.32, 1.275)",
"delay": "0.1s",
"iterationCount": "1",
"fillMode": "both"
}
// Output — ready-to-use CSS
// @keyframes animotion-bounceIn { ... }
//
// .my-modal {
// animation: animotion-bounceIn 0.8s cubic-bezier(0.175, 0.885, 0.32, 1.275) 0.1s 1 both;
// }Describe your use case in natural language and get the best matching animations.
// Input
{
"useCase": "modal appearing on screen with a bouncy effect",
"count": 5
}
// Output — ranked suggestions with relevance scores
{
"useCase": "modal appearing on screen with a bouncy effect",
"suggestions": [
{
"id": "E30",
"name": "Bounce In",
"description": "Element bounces in with spring-like scaling",
"cssClass": "animotion-bounce-in",
"css": "...",
"keyframeCSS": "...",
"relevanceScore": 12
}
]
}Get ONLY the CSS code — perfect for directly inserting into stylesheets.
// Input
{
"id": "animotion-fade-in",
"includeKeyframes": true
}
// Output — raw CSS string
// @keyframes animotion-fadeIn { from { opacity: 0; } to { opacity: 1; } }
// .animotion-fade-in { animation: animotion-fadeIn 0.6s ease-out both; }The server also exposes resources that AI agents can read:
| URI | Description |
|---|---|
animotion://catalog |
Complete animation catalog (JSON) |
animotion://categories |
Category list with metadata (JSON) |
animotion://utilities |
All utility CSS classes (CSS) |
Upload any image (PNG, JPG, SVG, GIF) and apply any of the 745 animations to it.
- Visit the website and click PNG Animator tab
- Drag & drop your image or click to browse
- Select an animation from the dropdown (organized by category)
- Adjust duration, easing, and delay
- Preview the animation live
- Click Export CSS to copy the ready-to-use CSS code
/* Animotion: Bounce In */
@keyframes animotion-bounceIn {
0% { transform: scale(0.3); opacity: 0; }
50% { transform: scale(1.05); }
70% { transform: scale(0.9); }
100% { transform: scale(1); opacity: 1; }
}
.my-animated-image {
animation: animotion-bounceIn 1s ease-out 0s 1 both;
}120 production-ready SVG icons across 7 categories. All icons use a consistent 24x24 viewBox with stroke-based rendering.
| Category | Count | Examples |
|---|---|---|
| UI Elements | 25 | home, search, settings, menu, close, bell, user, star, heart |
| Arrows & Direction | 20 | arrow-up, chevron-down, refresh, download, external-link |
| Media & Files | 15 | file, folder, image, camera, video, play, pause |
| Social & Communication | 15 | message, mail, phone, send, share, globe, wifi |
| Commerce | 15 | shopping-cart, credit-card, tag, gift, truck, wallet |
| Developer | 15 | code, terminal, git-branch, database, server, cloud, cpu |
| Miscellaneous | 15 | sun, moon, clock, calendar, flag, zap, coffee, pen |
Visit the Icons tab on the website and click any icon to copy its SVG to clipboard.
<!-- Paste the SVG directly -->
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"
stroke-linecap="round" stroke-linejoin="round">
<path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/>
<polyline points="9 22 9 12 15 12 15 22"/>
</svg>Icons inherit currentColor, so they match your text color automatically.
// Load the icons data
const response = await fetch('js/icons.js');
// or include <script src="js/icons.js"></script>
// Access icons
const homeIcon = ANIMOTION_ICONS.icons.find(i => i.id === 'home');
document.getElementById('my-icon').innerHTML = homeIcon.svg;css3-animations/
├── index.html # Showcase website
├── api.json # Machine-readable catalog (608KB)
├── LICENSE # MIT License
├── README.md # This file
│
├── css/
│ ├── keyframes.css # 500 @keyframes (Part 1)
│ ├── keyframes-part2.css # 341 @keyframes (Part 2)
│ ├── style.css # Website UI styles
│ └── utilities.css # Duration/delay/easing helpers
│
├── js/
│ ├── data.js # Animation registry (745 entries)
│ ├── icons.js # Icons registry (120 entries)
│ ├── app.js # Website controller
│ ├── icons-app.js # Icons tab controller
│ └── png-animator.js # PNG upload & animate
│
├── mcp/
│ ├── server.js # MCP server (6 tools + 3 resources)
│ └── package.json # MCP server dependencies
│
├── docs/
│ └── api.md # Detailed API documentation
│
├── scripts/
│ └── generate-api.js # Regenerate api.json from data.js
│
└── .github/
└── workflows/
└── pages.yml # GitHub Pages auto-deploy
import './animotion/keyframes.css';
import './animotion/utilities.css';
function Modal({ isOpen, children }) {
return isOpen ? (
<div className="animotion-fade-in animotion-duration-300">
<div className="animotion-zoom-in animotion-ease-spring">
{children}
</div>
</div>
) : null;
}<template>
<transition enter-active-class="animotion-fade-in-up" leave-active-class="animotion-fade-out-down">
<div v-if="show">Content</div>
</transition>
</template>Use alongside Tailwind — Animotion classes don't conflict:
<div class="bg-white rounded-lg shadow-md p-6 animotion-card-lift">
Tailwind styling + Animotion animation
</div>@Component({
template: `<div [class]="animClass">{{ message }}</div>`
})
export class MyComponent {
animClass = 'animotion-fade-in animotion-duration-500';
}Animotion works in all modern browsers:
| Browser | Version |
|---|---|
| Chrome | 60+ |
| Firefox | 55+ |
| Safari | 12+ |
| Edge | 79+ |
| Opera | 47+ |
| iOS Safari | 12+ |
| Chrome Android | 60+ |
We welcome contributions! Here's how:
- Fork the repository
- Add animations — add @keyframes to
css/keyframes-part2.cssand entries tojs/data.js - Add icons — add SVG entries to
js/icons.js - Run
node scripts/generate-api.jsto updateapi.json - Submit a pull request
- Add the
@keyframestocss/keyframes-part2.css:
@keyframes animotion-myAnimation {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}- Add the entry to
js/data.js:
{
id: 'CUSTOM01',
name: 'My Animation',
description: 'A custom entrance animation',
cssClass: 'animotion-my-animation',
keyframeName: 'animotion-myAnimation',
category: 'entrance',
subcategory: 'custom',
tags: ['custom', 'entrance'],
duration: '0.6s',
timingFunction: 'ease-out',
iterationCount: '1',
fillMode: 'both',
demoType: 'box',
css: `.animotion-my-animation { animation: animotion-myAnimation 0.6s ease-out both; }`,
keyframeCSS: `@keyframes animotion-myAnimation { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } }`
}- Regenerate API:
node scripts/generate-api.js
MIT License. Free forever. Commercial use allowed.
Built by Bachao.AI for the developer community.