Communitygithub.com

yuzhang-ai/web-animation-skill

Concevez et construisez des animations web interactives qui semblent conçues sur mesure, pas standardisées. À utiliser lorsque l'utilisateur demande du mouvement sur un site ou une application web.

Qu'est-ce que web-animation-skill ?

Cette compétence permet de concevoir et d'implémenter des animations web interactives de haute qualité, en privilégiant une approche de conception avant le choix technique. Elle couvre un large éventail de bibliothèques et d'APIs (GSAP, Motion, Anime.js, View Transitions, Lottie, Rive, D3, Flubber, Konva, Three.js) et de techniques (scroll-driven, parallaxe, text reveal, micro-interactions). Le processus de travail est structuré : vérifier le projet existant, déterminer le rôle de l'animation (feedback, orientation, attention, narration), choisir l'outil le plus léger adapté, appliquer des règles non-négociables (performance, accessibilité, cleanup), et valider dans un navigateur réel. Des fichiers de règles dédiés détaillent chaque technologie et principe de conception, garantissant des animations fluides et professionnelles.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/yuzhang-ai/web-animation-skill/tree/HEAD

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Animation web

Un bon mouvement web est d'abord une décision de conception, puis un appel de bibliothèque. Suivez le flux de travail ci-dessous dans l'ordre ; ne chargez les fichiers de règles que lorsqu'une étape en a besoin.

Flux de travail

1. Lire le projet avant de choisir quoi que ce soit

  • Vérifiez package.json. Si une bibliothèque d'animation est déjà installée, utilisez-la. N'en ajoutez pas une seconde pour un seul effet.
  • Notez le framework (React / Next.js App Router / Vue / Svelte / HTML simple) et vérifiez si les composants sont rendus sur le serveur ("use client" nécessaire pour les animations côté client dans Next.js).
  • Recherchez des jetons de mouvement existants (durées, easing) dans les variables CSS ou un fichier de thème, et réutilisez-les.

2. Déterminez le rôle du mouvement

Chaque animation a besoin d'une mission. Choisissez-en une par élément :

MissionExempleBudget typique
Feedback — confirmer une actionpression de bouton, bascule, copier-dans-le-presse-papier100–200ms
Orientation — montrer d'où vient ou où va quelque choseune modale s'ouvre depuis son déclencheur, réorganisation d'un élément de liste, changement de route200–400ms
Attention — pointer vers une seule choseune unique séquence hero, une nouvelle notification400–1200ms, une fois
Narratif — raconter une histoire liée au défilementdémonstration épinglée d'un produit, chronologie défiléelié à la distance de défilement

Si un élément n'a pas de mission, ne l'animez pas. Un moment orchestré bat un fade-up sur chaque section. Lisez règles/conception-mouvement.md pour les durées, l'easing, la chorégraphie et la checklist "sensation premium".

3. Choisissez l'outil le plus léger qui fait le travail

Plateforme d'abord, puis bibliothèques :

BesoinUtilisezFichier de règle
Survol, focus, pression, boucles simplesTransitions CSS / @keyframescss-keyframes.md
Entrée et sortie de dialogue, popover, menu déroulantCSS @starting-style + transition-behavior: allow-discretecss-keyframes.md
Transitions de page / route, morphing d'élément partagé entre étatsAPI View Transitionsview-transitions.md
Révélation simple liée au défilement, barre de progression, parallaxeCSS animation-timeline: view() / scroll()animations-defilement.md
Sections épinglées, chronologies multi-étapes défilées, défilement horizontalGSAP + ScrollTriggergsap.md
Révélations de titres avec texte fractionné / masque de ligneGSAP SplitTextgsap.md
Animation d'entrée/sortie React, animation de mise en page et partagée, gestesMotion pour React (motion/react)framer-motion.md
Animation impérative sans framework, ressortsMotion (motion)motion-one.md
Dessin et morphing de lignes SVG sans GSAPAnime.js v4 (svg.createDrawable, svg.morphTo)animejs.md
Morphing de chemins complexes entre formes non apparentéesFlubber (ou GSAP MorphSVG)flubber.md
Lecture d'animation After EffectsLottie (dotLottie)lottie.md
Animation illustrée interactive pilotée par étatRiverive.md
Graphiques animésTransitions D3d3.md
Formes 2D interactives multiples (éditeurs, diagrammes)Konvakonva.md
3D, particules, shadersThree.js / React Three Fiberthree-js.md

Lorsque le choix n'est pas évident, lisez règles/choisir-bibliotheque.md.

4. Construisez avec les non-négociables

Ceci s'applique à chaque animation, dans chaque bibliothèque :

  1. Animez transform et opacity. Évitez d'animer width, height, top, left, margin ; utilisez scale/translate, FLIP (GSAP Flip, Motion layout) ou les View Transitions pour les changements de mise en page. Voir règles/performance.md.
  2. Respectez prefers-reduced-motion. Remplacez le mouvement par un fondu d'opacité ou un changement instantané ; ne supprimez jamais l'entrée du contenu pour qu'il reste invisible. Les effets liés au défilement doivent devenir statiques.
  3. Ne cachez jamais le contenu avant l'exécution de JS. Définissez l'état initial caché dans JS (ou derrière une classe .js), afin que le contenu soit visible si le script échoue. Avec SSR, évitez un flash de contenu visible puis caché en appliquant les styles initiaux avant le premier affichage.
  4. Nettoyez. Revenez en arrière ou tuez les animations lors du démontage (useGSAP, createScope().revert(), gsap.context), et tuez les ScrollTriggers lors d'un changement de route.
  5. Gardez l'interaction réactive. Animations interruptibles pour tout ce qui est déclenché par l'utilisateur : un deuxième clic ne doit pas s'empiler derrière le premier. Ne bloquez jamais l'entrée en attendant la fin d'une animation.
  6. N'animez pas le focus loin. Les éléments qui se déplacent doivent conserver un état :focus-visible visible, et les dialogues animés doivent toujours déplacer le focus correctement.

5. Vérifiez dans un vrai navigateur

Ne signalez pas une animation comme terminée en lisant le code. Exécutez-la et vérifiez :

  • Elle se joue, et l'état final correspond à la conception (capture d'écran au milieu et au repos).
  • Aucune erreur dans la console, aucun décalage de mise en page lors du démarrage.
  • Émulez prefers-reduced-motion: reduce et confirmez que la version réduite fonctionne et que le contenu est visible.
  • Redimensionnez à une largeur mobile : les sections épinglées et le texte fractionné fonctionnent toujours (re-fractionnement lors du redimensionnement).
  • Les effets liés au défilement fonctionnent aussi bien en défilant vers le haut que vers le bas, et après un rechargement en milieu de page.
  • Panneau des performances : aucune trame longue pendant l'animation, aucun pic de mise en page/peinture dû aux propriétés animées.

Points de départ minimaux

// GSAP + ScrollTrigger (npm i gsap)
import gsap from "gsap";
import { ScrollTrigger } from "gsap/ScrollTrigger";
gsap.registerPlugin(ScrollTrigger);

gsap.from(".card", {
  y: 40, opacity: 0, duration: 0.8, ease: "expo.out", stagger: 0.08,
  scrollTrigger: { trigger: ".cards", start: "top 80%" },
});
// Motion pour React (npm i motion)
import { motion, AnimatePresence } from "motion/react";

<AnimatePresence>
  {open && (
    <motion.div
      key="panel"
      initial={{ opacity: 0, y: 8 }}
      animate={{ opacity: 1, y: 0 }}
      exit={{ opacity: 0, y: 8 }}
      transition={{ type: "spring", duration: 0.35, bounce: 0 }}
    />
  )}
</AnimatePresence>
/* Révélation au défilement uniquement via la plateforme : Chrome 115+, Safari 26+, Firefox 159+ */
@media (prefers-reduced-motion: no-preference) {
  @supports (animation-timeline: view()) {
    .reveal {
      animation: reveal linear both;
      animation-timeline: view();
      animation-range: entry 10% cover 30%;
    }
  }
}
@keyframes reveal { from { opacity: 0; translate: 0 2rem; } }

Fichiers de règles

Des exemples fonctionnels de ces techniques se trouvent dans demos/.

Skills associés