home / skills / dylantarre / animation-principles / anime-js

This skill helps you implement Disney's 12 animation principles using Anime.js to craft expressive motion across UI elements.

npx playbooks add skill dylantarre/animation-principles --skill anime-js

Review the files below or copy the command above to add this skill to your agents.

Files (1)
SKILL.md
3.6 KB
---
name: anime-js
description: Use when implementing Disney's 12 animation principles with Anime.js library
---

# Anime.js Animation Principles

Implement all 12 Disney animation principles using Anime.js's flexible animation engine.

## 1. Squash and Stretch

```javascript
anime({
  targets: '.ball',
  scaleX: [1, 1.2, 1],
  scaleY: [1, 0.8, 1],
  duration: 300,
  easing: 'easeInOutQuad'
});
```

## 2. Anticipation

```javascript
anime.timeline()
  .add({
    targets: '.character',
    translateY: 10,
    scaleY: 0.9,
    duration: 200
  })
  .add({
    targets: '.character',
    translateY: -200,
    duration: 400,
    easing: 'easeOutQuad'
  });
```

## 3. Staging

```javascript
anime({
  targets: '.background',
  filter: 'blur(3px)',
  opacity: 0.6,
  duration: 500
});
anime({
  targets: '.hero',
  scale: 1.1,
  duration: 500
});
```

## 4. Straight Ahead / Pose to Pose

```javascript
anime({
  targets: '.element',
  keyframes: [
    { translateX: 0, translateY: 0 },
    { translateX: 100, translateY: -50 },
    { translateX: 200, translateY: 0 },
    { translateX: 300, translateY: -30 }
  ],
  duration: 1000
});
```

## 5. Follow Through and Overlapping Action

```javascript
anime.timeline()
  .add({ targets: '.body', translateX: 200, duration: 500 })
  .add({ targets: '.hair', translateX: 200, duration: 500 }, '-=450')
  .add({ targets: '.cape', translateX: 200, duration: 600 }, '-=500');
```

## 6. Slow In and Slow Out

```javascript
anime({
  targets: '.element',
  translateX: 300,
  duration: 600,
  easing: 'easeInOutCubic'
});
// Options: easeInQuad, easeOutQuad, easeInOutQuad
// easeInCubic, easeOutCubic, easeInOutCubic
// spring(mass, stiffness, damping, velocity)
```

## 7. Arc

```javascript
anime({
  targets: '.ball',
  translateX: 200,
  translateY: [
    { value: -100, duration: 500 },
    { value: 0, duration: 500 }
  ],
  easing: 'easeOutQuad',
  duration: 1000
});

// Or use SVG path
anime({
  targets: '.element',
  translateX: anime.path('.motion-path')('x'),
  translateY: anime.path('.motion-path')('y'),
  duration: 1000
});
```

## 8. Secondary Action

```javascript
const tl = anime.timeline();
tl.add({
  targets: '.button',
  scale: 1.1,
  duration: 200
})
.add({
  targets: '.icon',
  rotate: 15,
  duration: 150
}, '-=150')
.add({
  targets: '.particles',
  opacity: [0, 1],
  delay: anime.stagger(50)
}, '-=100');
```

## 9. Timing

```javascript
// Fast - snappy
anime({ targets: '.fast', translateX: 100, duration: 150 });

// Normal
anime({ targets: '.normal', translateX: 100, duration: 300 });

// Slow - dramatic
anime({ targets: '.slow', translateX: 100, duration: 600 });

// Spring physics
anime({ targets: '.spring', translateX: 100, easing: 'spring(1, 80, 10, 0)' });
```

## 10. Exaggeration

```javascript
anime({
  targets: '.element',
  scale: 1.5,
  rotate: '2turn',
  duration: 800,
  easing: 'easeOutElastic(1, 0.5)' // overshoot
});
```

## 11. Solid Drawing

```javascript
anime({
  targets: '.box',
  rotateX: 45,
  rotateY: 30,
  perspective: 1000,
  duration: 500
});
```

## 12. Appeal

```javascript
anime({
  targets: '.card',
  scale: 1.02,
  boxShadow: '0 20px 40px rgba(0,0,0,0.2)',
  duration: 300,
  easing: 'easeOutQuad'
});
```

## Stagger Animation

```javascript
anime({
  targets: '.item',
  translateY: [20, 0],
  opacity: [0, 1],
  delay: anime.stagger(100), // 100ms between each
  easing: 'easeOutQuad'
});
```

## Key Anime.js Features

- `anime.timeline()` - Sequence animations
- `keyframes` - Multiple poses
- `anime.stagger()` - Offset delays
- `anime.path()` - SVG motion paths
- Built-in easings + `spring()` + `elastic()`
- `'-=200'` - Relative offset timing
- `anime.set()` - Instant property set

Overview

This skill shows how to implement Disney's 12 animation principles using the Anime.js library. It provides ready-to-use patterns and code snippets that map each principle to Anime.js features. Use it to make UI and character motion feel more lifelike, clear, and engaging.

How this skill works

Each principle is translated into concrete Anime.js setups: scale and squash for squash-and-stretch, timelines and offsets for anticipation and overlapping action, keyframes for straight-ahead or pose-to-pose workflows, and path-based motion for arcs. The skill highlights easings, timelines, keyframes, staggered delays, and spring/elastic options so you can compose expressive, physically convincing animations quickly. It also shows small UI tweaks (shadows, perspective) to boost appeal and staging.

When to use it

  • Designing character motion or toy-like interactions that need personality
  • Polishing UI microinteractions (buttons, cards, loaders) for better feedback
  • Animating complex sequences that require overlapping parts or secondary actions
  • Creating motion along paths or arcs (projectiles, flight, guided movement)
  • When you want consistent, principle-driven animation across a product

Best practices

  • Favor timelines and relative offsets (e.g., '-=150') to coordinate follow-through and overlapping parts
  • Use easing and spring presets for slow-in/slow-out and natural timing; reserve elastic for exaggeration
  • Apply squash-and-stretch subtly on UI elements to avoid layout shifts and accessibility issues
  • Use keyframes for pose-to-pose sequences and straight-ahead tweaks for exploratory motion
  • Leverage anime.stagger() for rhythmic entrance/exit patterns and anime.path() for precise arc motion

Example use cases

  • A hero card that anticipates and pops with secondary icon rotation and particle reveal
  • A bouncing ball demo using squash-and-stretch, arcs, and easing to teach timing
  • A character jump composed with anticipation, slow-in/out, follow-through (hair/cape) and appeal tweaks
  • Staggered list entrance where items rise on an arc with staggered delays for rhythm
  • Button tap that scales, rotates a small icon as a secondary action, and reveals a subtle shadow for appeal

FAQ

Can I combine multiple principles in one timeline?

Yes. Use anime.timeline() to sequence anticipation, primary action, and secondary actions with relative offsets so each part overlaps naturally.

How do I keep animations accessible and non-jarring?

Keep durations moderate, avoid excessive scale/rotation, respect reduced-motion preferences by disabling or simplifying animations, and use opacity/translate instead of abrupt layout changes.