--- name: anime-js description: Expert guidelines for building performant animations with Anime.js animation library --- # 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