css-animations
Create performant CSS animations, transitions, and motion design
When & Why to Use This Skill
This Claude skill enables the creation of high-performance, accessible CSS animations and motion designs. It provides expert guidance on transitions, keyframes, and transforms, ensuring all generated code is optimized for 60fps performance and includes built-in accessibility features like reduced-motion media queries.
Use Cases
- Developing smooth UI transitions for web components such as modals, sidebars, and interactive navigation menus.
- Optimizing existing web animations to prevent layout shifts and repaints by utilizing compositor-only properties like transform and opacity.
- Creating complex, multi-stage keyframe animations for custom loading indicators, pulse effects, and storytelling elements.
- Implementing accessible motion design that automatically respects user system preferences for reduced motion to ensure a better UX for all users.
- Generating precise cubic-bezier timing functions to achieve specific brand-aligned motion feels, such as 'bouncy' or 'snappy' interactions.
| name | css-animations |
|---|---|
| description | Create performant CSS animations, transitions, and motion design |
| sasmp_version | "1.3.0" |
| version | "2.0.0" |
| updated | "2025-12-30" |
| bonded_agent | 03-css-animations |
| bond_type | PRIMARY_BOND |
CSS Animations Skill
Create performant, accessible CSS animations and transitions with proper timing and motion design.
Overview
This skill provides atomic, focused guidance on CSS animations with performance optimization and accessibility considerations built-in.
Skill Metadata
| Property | Value |
|---|---|
| Category | Motion |
| Complexity | Intermediate to Expert |
| Dependencies | css-fundamentals |
| Bonded Agent | 03-css-animations |
Usage
Skill("css-animations")
Parameter Schema
parameters:
animation_type:
type: string
required: true
enum: [transition, keyframe, transform, timing]
description: Type of animation to create
effect:
type: string
required: false
enum: [fade, slide, scale, rotate, bounce, shake, pulse]
description: Predefined animation effect
performance_mode:
type: boolean
required: false
default: true
description: Optimize for 60fps performance
accessible:
type: boolean
required: false
default: true
description: Include reduced-motion alternatives
validation:
- rule: animation_type_required
message: "animation_type parameter is required"
- rule: valid_effect
message: "effect must be a recognized animation effect"
Topics Covered
Transitions
- Property, duration, timing-function, delay
- Transitionable vs non-transitionable properties
- Multi-property transitions
Keyframe Animations
- @keyframes syntax
- Animation properties (name, duration, iteration, direction)
- Fill modes and play states
Transforms
- 2D: translate, rotate, scale, skew
- 3D: perspective, rotateX/Y/Z, translateZ
- Transform origin and composition
Timing Functions
- Built-in: ease, linear, ease-in, ease-out, ease-in-out
- cubic-bezier() custom curves
- steps() for frame-by-frame
Retry Logic
retry_config:
max_attempts: 3
backoff_type: exponential
initial_delay_ms: 1000
max_delay_ms: 10000
Logging & Observability
logging:
entry_point: skill_invoked
exit_point: skill_completed
metrics:
- invocation_count
- effect_usage
- performance_mode_ratio
Quick Reference
Transition Template
.element {
transition: property duration timing-function delay;
transition: transform 0.3s ease-out;
transition: opacity 0.2s, transform 0.3s ease-out;
}
Keyframe Template
@keyframes animation-name {
0% { /* start state */ }
50% { /* midpoint state */ }
100% { /* end state */ }
}
.element {
animation: name duration timing-function delay iteration-count direction fill-mode;
animation: slide-in 0.5s ease-out forwards;
}
Performance Rules
SAFE (Compositor-only):
├─ transform
└─ opacity
AVOID (Trigger repaint/reflow):
├─ width, height
├─ top, left, right, bottom
├─ margin, padding
└─ background-color
Common Effects
Fade In
@keyframes fade-in {
from { opacity: 0; }
to { opacity: 1; }
}
.fade-in {
animation: fade-in 0.3s ease-out forwards;
}
Slide Up
@keyframes slide-up {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.slide-up {
animation: slide-up 0.4s ease-out forwards;
}
Pulse
@keyframes pulse {
0%, 100% { transform: scale(1); }
50% { transform: scale(1.05); }
}
.pulse {
animation: pulse 2s ease-in-out infinite;
}
Accessibility Template
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
Timing Function Reference
cubic-bezier(x1, y1, x2, y2)
ease: (0.25, 0.1, 0.25, 1.0)
ease-in: (0.42, 0, 1.0, 1.0)
ease-out: (0, 0, 0.58, 1.0)
ease-in-out: (0.42, 0, 0.58, 1.0)
Custom:
Bounce: (0.68, -0.55, 0.265, 1.55)
Snap: (0.5, 0, 0.75, 0)
Smooth: (0.4, 0, 0.2, 1)
Test Template
describe('CSS Animations Skill', () => {
test('validates animation_type parameter', () => {
expect(() => skill({ animation_type: 'invalid' }))
.toThrow('animation_type must be one of: transition, keyframe...');
});
test('returns accessible version when flag is true', () => {
const result = skill({
animation_type: 'keyframe',
effect: 'fade',
accessible: true
});
expect(result).toContain('prefers-reduced-motion');
});
test('uses compositor-only properties in performance mode', () => {
const result = skill({
animation_type: 'transform',
performance_mode: true
});
expect(result).not.toContain('left:');
expect(result).not.toContain('top:');
});
});
Error Handling
| Error Code | Cause | Recovery |
|---|---|---|
| INVALID_ANIMATION_TYPE | Unknown animation type | Show valid options |
| PERFORMANCE_WARNING | Using layout-triggering properties | Suggest transform alternative |
| ACCESSIBILITY_MISSING | No reduced-motion fallback | Add default accessible version |
Related Skills
- css-fundamentals (prerequisite)
- css-performance (animation optimization)
- css-modern (scroll-driven animations)