anime-js · mindrally — скилл для Claude Code: анимации на Anime.js
Скилл задаёт агенту правила работы с Anime.js: таймлайны, stagger, SVG-морфинг и производительность. Пригодится, когда анимации в проекте пишет ИИ.
npx skills add Mindrally/skills --skill anime-js -a claude-codeЧто делает anime-js
Скилл превращает агента в человека, который знает Anime.js. Внутри — готовые шаблоны: базовая анимация через anime(), таймлайны с перехлёстом по времени, stagger с раскладкой по сетке, морфинг SVG-путей и рисование линий через strokeDashoffset. Отдельный блок про React: анимация запускается в useEffect, а на размонтировании вызывается pause().
Про производительность сказано прямо: двигайте translateX, scale и rotate, а не left, top и width — последние вызывают пересчёт раскладки. Для частых обновлений вроде слежения за курсором есть Animatable. Ещё в скилле есть мост к Web Animations API через wapiAnimate и проверка prefers-reduced-motion, чтобы анимация отключалась у тех, кто просил уменьшить движение.
Перед установкой учтите: скилл предполагает, что в проекте стоит сама библиотека — npm install animejs. Без неё советы бесполезны. Исходный файл обрезан на разделе с лучшими практиками, так что полного списка рекомендаций там нет.
Какие задачи решает
- написать таймлайн из нескольких шагов с перехлёстом по времени
- сделать каскадное появление элементов сетки через stagger
- нарисовать SVG-линию от начала к концу
- запустить анимацию в React-компоненте и убрать её при размонтировании
- отключить движение для пользователей с prefers-reduced-motion
Примеры запросов агенту
- сделай анимацию появления карточек через anime.js со stagger от центра
- перепиши этот таймлайн так, чтобы блоки шли с перехлёстом 500 мс
- анимируй SVG-путь через strokeDashoffset и добавь проверку prefers-reduced-motion
Как установить anime-js
1Через Skills CLI (Vercel)
npx skills add Mindrally/skills --skill anime-js -a claude-code2Вручную: положить файлы
~/.claude/skills/anime-js/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/anime-js/
1Через Skills CLI (Vercel)
npx skills add Mindrally/skills --skill anime-js -a codex2Вручную: положить файлы
.agents/skills/anime-js/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add Mindrally/skills --skill anime-js -a cursor2Вручную: положить файлы
.cursor/skills/anime-js/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install Mindrally/skills anime-js2Вручную: положить файлы
.github/skills/anime-js/SKILL.md1Через Skills CLI (Vercel)
npx skills add Mindrally/skills --skill anime-js -a gemini-cli2Командой платформы
gemini skills install https://github.com/Mindrally/skills --path anime-jsВручную: положить файлы
.devin/skills/anime-js/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add Mindrally/skills --skill anime-js -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Из того же набора168
Другие версии anime-js
Похожие
Рядом в теме «Фронтенд и UI»
Всё по теме «Фронтенд и UI» →Вопросы о anime-js
Как установить anime-js в Claude?
Выполните npx skills add Mindrally/skills --skill anime-js -a claude-code. Файл скилла появится по пути ~/.claude/skills/anime-js/SKILL.md.
Что делает скилл anime-js?
Даёт агенту инструкции по Anime.js: базовые анимации, таймлайны, stagger, easing, SVG и интеграция с React. Отдельно разобрана производительность — трансформы вместо свойств раскладки.
Нужна ли сама библиотека Anime.js?
Да, скилл описывает работу с ней и приводит установку через npm install animejs. Без установленного пакета примеры не запустятся.
Исходный текст
SKILL.md · Apache-2.0
---
name: anime-js
description: Expert guidelines for building performant animations with Anime.js animation library
metadata:
maintainer: Mindrally
source: https://github.com/Mindrally/skills
---
# Anime.js Animation Guidelines
You are an expert in Anime.js, JavaScript, and web animation performance. Follow these guidelines when creating animations.
## Core Principles
### Installation and Import
```bash
npm install animejs
```
```javascript
// Full import
import anime from "animejs";
// Modular import for smaller bundle size
import { animate, timeline, stagger } from "animejs";
```
### Basic Animation
```javascript
anime({
targets: ".element",
translateX: 250,
rotate: "1turn",
duration: 800,
easing: "easeInOutQuad"
});
```
## Performance Optimization
### Frame Rate Control
```javascript
// Adjust global frame rate for lower-end devices
anime.suspendWhenDocumentHidden = true;
// Control FPS for specific animations
anime({
targets: ".element",
translateX: 250,
update: function(anim) {
// Custom frame rate limiting if needed
}
});
```
### Use Transforms Over Layout Properties
```javascript
// Good - uses GPU-accelerated transforms
anime({
targets: ".element",
translateX: 100, // Good
translateY: 50, // Good
scale: 1.2, // Good
rotate: 45, // Good
opacity: 0.5 // Good
});
// Avoid - causes layout recalculation
anime({
targets: ".element",
left: 100, // Avoid
top: 50, // Avoid
width: 200, // Avoid
height: 150 // Avoid
});
```
### Use Animatable for High-Frequency Updates
```javascript
import { Animatable } from "animejs";
// Optimized for continuous updates (mouse tracking, etc.)
const animatable = new Animatable(".cursor", {
x: 0,
y: 0
});
document.addEventListener("mousemove", (e) => {
animatable.x = e.clientX;
animatable.y = e.clientY;
});
```
## Timeline Animations
### Basic Timeline
```javascript
const tl = anime.timeline({
easing: "easeOutExpo",
duration: 750
});
tl.add({
targets: ".header",
translateY: [-50, 0],
opacity: [0, 1]
})
.add({
targets: ".content",
translateY: [30, 0],
opacity: [0, 1]
}, "-=500") // Overlap by 500ms
.add({
targets: ".footer",
translateY: [30, 0],
opacity: [0, 1]
}, "-=500");
```
### Timeline Controls
```javascript
const tl = anime.timeline({
autoplay: false
});
// Control methods
tl.play();
tl.pause();
tl.restart();
tl.reverse();
tl.seek(1000); // Go to 1 second
```
## Stagger Animations
### Basic Stagger
```javascript
anime({
targets: ".grid-item",
translateY: [50, 0],
opacity: [0, 1],
delay: anime.stagger(100) // 100ms delay between each
});
```
### Advanced Stagger Options
```javascript
// Stagger from center
anime({
targets: ".grid-item",
scale: [0, 1],
delay: anime.stagger(100, { from: "center" })
});
// Grid stagger
anime({
targets: ".grid-item",
scale: [0, 1],
delay: anime.stagger(50, {
grid: [14, 5],
from: "center"
})
});
// Stagger with easing
anime({
targets: ".item",
translateX: 250,
delay: anime.stagger(100, { easing: "easeOutQuad" })
});
```
## Easing Functions
### Built-in Easings
```javascript
// Common easings
anime({
targets: ".element",
translateX: 250,
easing: "easeOutExpo" // Fast start, slow end
// easing: "easeInOutQuad" // Smooth both ends
// easing: "easeOutElastic(1, .5)" // Bouncy
// easing: "easeOutBounce" // Bounce effect
// easing: "spring(1, 80, 10, 0)" // Physics-based
});
```
### Custom Easing
```javascript
anime({
targets: ".element",
translateX: 250,
easing: "cubicBezier(0.25, 0.1, 0.25, 1)"
});
```
## SVG Animation
### Path Animation
```javascript
const path = anime.path(".motion-path");
anime({
targets: ".element",
translateX: path("x"),
translateY: path("y"),
rotate: path("angle"),
easing: "linear",
duration: 2000,
loop: true
});
```
### Line Drawing
```javascript
anime({
targets: "path",
strokeDashoffset: [anime.setDashoffset, 0],
easing: "easeInOutSine",
duration: 1500,
delay: anime.stagger(250)
});
```
### Morphing
```javascript
anime({
targets: "path",
d: [
{ value: "M10 10 L90 10 L90 90 L10 90 Z" },
{ value: "M10 50 Q50 10 90 50 Q50 90 10 50 Z" }
],
easing: "easeInOutQuad",
duration: 1000,
loop: true,
direction: "alternate"
});
```
## Function-Based Values
### Dynamic Values
```javascript
anime({
targets: ".element",
translateX: function(el, i) {
return i * 100; // Each element moves further
},
rotate: function(el, i, total) {
return (360 / total) * i; // Distribute rotation
},
delay: function(el, i) {
return i * 50;
}
});
```
## Callbacks and Events
### Animation Events
```javascript
anime({
targets: ".element",
translateX: 250,
begin: function(anim) {
console.log("Animation started");
},
update: function(anim) {
console.log(Math.round(anim.progress) + "%");
},
complete: function(anim) {
console.log("Animation completed");
}
});
```
### Looping
```javascript
anime({
targets: ".element",
translateX: 250,
direction: "alternate",
loop: true,
loopComplete: function(anim) {
console.log("Loop completed");
}
});
```
## React Integration
### Basic React Usage
```tsx
import { useEffect, useRef } from "react";
import anime from "animejs";
function AnimatedComponent() {
const elementRef = useRef(null);
useEffect(() => {
const animation = anime({
targets: elementRef.current,
translateX: 250,
duration: 800
});
return () => {
animation.pause(); // Cleanup
};
}, []);
return <div ref={elementRef}>Animated</div>;
}
```
### With useCallback for Controls
```tsx
function ControlledAnimation() {
const elementRef = useRef(null);
const animationRef = useRef(null);
const playAnimation = useCallback(() => {
animationRef.current = anime({
targets: elementRef.current,
translateX: [0, 250],
duration: 800
});
}, []);
useEffect(() => {
return () => {
animationRef.current?.pause();
};
}, []);
return (
<>
<div ref={elementRef}>Animated</div>
<button onClick={playAnimation}>Play</button>
</>
);
}
```
## Web Animations API Bridge
### Using WAAPI for Native Performance
```javascript
import { wapiAnimate } from "animejs";
// Uses browser's native Web Animations API
wapiAnimate(".element", {
translateX: 250,
duration: 800
});
```
## Accessibility
### Respect Reduced Motion
```javascript
const prefersReducedMotion = window.matchMedia(
"(prefers-reduced-motion: reduce)"
).matches;
anime({
targets: ".element",
translateX: 250,
duration: prefersReducedMotion ? 0 : 800,
easing: prefersReducedMotion ? "linear" : "easeOutExpo"
});
```
## Best Practices Summary
1. Use transforms (translate, scale, rotate) over layout properties
2. Import only needed modules for smaller bundle size
3. Use stagger for multiple element animations
4. Clean up animations on component unmount
5. Use Animatable for high-frequency updates
6. Leverage timeline for complex sequences
7. Use function-based values for dynamic animations
8. Respect reduced motion preferences
9. Consider WAAPI bridge for native performance
10. Test on lower-powered devices
© Mindrally · Apache-2.0 · Mindrally/skills