Communitygithub.com

HEI1491/frontend-animation

Design, implement, review and optimize frontend animations for web projects, especially React + TypeScript. 适用于动画、动效、转场、滚动效果、微交互等场景。

Was ist frontend-animation?

Dieses Skill ermöglicht es einem KI-Agenten, Frontend-Animationen professionell zu designen, zu implementieren, zu reviewen und zu optimieren. Es deckt eine breite Palette von Animationsbedürfnissen ab: Seiteneffekte wie Page-Transitions, Scroll-Animationen, Hover-Feedback, Ladeanimationen, Partikel- oder 3D-Effekte, Parallax, Skeleton-Screen-Übergänge, Zahlenanimationen sowie die Nutzung gängiger Bibliotheken wie Framer Motion, GSAP, Three.js, React Three Fiber, Lottie und der Web Animations API. Das Skill zwingt den Agenten, vor dem Schreiben von Code systematisch die vorhandenen Abhängigkeiten, Design-Tokens und Style-Konventionen des Projekts zu analysieren. Es enthält detaillierte Entscheidungsbäume, eine Liste von Anti-Patterns (z.B. verbotenes `transition: all`, übermäßige `blur`-Effekte, zu viele gleichzeitige Animationen), präzise numerische Vorgaben für Dauer, Easing und Amplitude sowie klare Performance- und Accessibility-Anforderungen (z.B. `prefers-reduced-motion` als Pflicht). Zudem schreibt es vor, dass Animationen schrittweise, von CSS über leichte bis hin zu schweren Bibliotheken, aufgebaut werden, und dass vor dem Hinzufügen neuer Abhängigkeiten eine Bestätigung des Nutzers eingeholt werden muss. Das Skill ist für den Einsatz in React-, Vue-, Next.js- und reinen CSS-Projekten ausgelegt, verbietet jedoch das Aufzwingen von React-Bibliotheken in Vue- oder nativen Projekten. Es bietet auch ein Audit-Skript und eine Checkliste zur Selbstprüfung vor dem Commit.

Funktioniert mit✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/HEI1491/frontend-animation-skill/tree/HEAD

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Frontend-Animationen

Du bist verantwortlich für Design, Implementierung, Review und Optimierung von Frontend-Animationen. Standardmäßig wird ein React + TypeScript-Projekt angenommen; bei reinem JS oder anderen Frameworks richte dich nach dem Projektstand, ohne React-Lösungen in Vue- oder native Projekte zu erzwingen. Animationen sind Verbesserungen, keine Dekoration: Stelle zuerst sicher, dass die statische Version gut aussieht und funktioniert, bevor du Animationen hinzufügst. Ohne Bestätigung des Nutzers dürfen keine neuen Abhängigkeiten hinzugefügt werden.

§0 Vor der Arbeit: Abhängigkeiten & Designsystem-Erkennung

Führe vor der Arbeit die folgenden fünf Schritte in dieser Reihenfolge aus; fehlt ein Schritt, führe zuerst die Erkennung durch, bevor du Code schreibst.

  1. Lies package.json und die tatsächlich gesperrten Versionen in pnpm-lock.yaml / package-lock.json / yarn.lock, um installierte Animationsbibliotheken und deren Hauptversionen zu identifizieren.
  2. Lies tailwind.config.*, globale Styles (globals.css / index.css / app.css) und Theme-Dateien, um vorhandene Tokens, Dauern, Easing-Funktionen und Namenskonventionen zu finden.
  3. Wenn motion vorhanden ist, verwende kein GSAP; wenn GSAP vorhanden ist, füge kein motion hinzu; für denselben Anwendungsfall sind keine zwei Bibliotheken erlaubt.
  4. Füge keine neuen Abhängigkeiten eigenmächtig hinzu. Wenn eine neue Abhängigkeit wirklich nötig ist, erkläre zuerst den Paketnamen, die min+gzip-Größe, Alternativen und warum vorhandene Bibliotheken nicht ausreichen, und warte auf die Bestätigung des Nutzers.
  5. Übernimm die vorhandenen Namenskonventionen, Dateistruktur, Codestil und Token-Namen des Projekts; führe kein zweites Animationssystem ein.
ErkanntesStandardvorgehen
Bereits motion vorhandenInteraktionen, Ein-/Ausblendungen und Layout-Animationen alle mit motion; GSAP nicht einführen
Bereits framer-motion (alte Version)Vorhandenen Paketnamen und API verwenden, nicht eigenmächtig auf motion migrieren; Upgrade separat vorschlagen und durchführen
Bereits GSAP vorhandenTimeline- und Scroll-Interaktionen mit GSAP + ScrollTrigger; einfaches Hover weiterhin mit CSS-Transition; kein motion hinzufügen
Nur Tailwindtransition / duration / ease Utility-Klassen mit globalen CSS-Variablen verwenden; keine Bibliothek installieren
Reines CSS-ProjektNur CSS-Transition/-Animation + WAAPI verwenden; keine JS-Animationsbibliothek installieren
Next.js App RouterAnimationskomponenten mit "use client" markieren; View Transitions und motion als Client-Komponenten behandeln; keine Hacklösungen für routenübergreifenden Zustand
VueNative CSS oder Vue-Ökosystem-Animationslösungen verwenden; React-spezifische Bibliotheken nicht aufzwingen

§1 Anti-Pattern-Liste (Nicht verhandelbar)

Prüfe Punkt für Punkt; wenn ein Punkt zutrifft, schreibe den Code neu – keine Kompromisse.

VerbotenAlternative
transition: all .3sExplizit transform, opacity auflisten, bei Bedarf color hinzufügen
Einheitliches ease-in-out für die ganze SeiteKurven nach Ein-/Aus-/Bidirektional-Kontext wählen (siehe §3)
Element mit opacity: 0 + scale(.8) einfliegenopacity: .9→1 + translateY(8px)→0
Gedankenloses linearNur bei Fortschrittsbalken und unendlichen Schleifendekorationen verwenden
Mehr als 3 gleichzeitig bewegte Elemente auf einem BildschirmNur 1 visuellen Fokus behalten; restliche Elemente still oder sehr schwach animieren
Hover mit transform: translateY(-4px), wenn der Container keinen Platz reserviert hatscale verwenden oder dem Elternelement padding zur Reservierung geben
Nur Einblendung, keine AusblendungMuss paarweise entworfen werden; Ausblendung schneller als Einblendung
Großflächige filter: blur() / drop-shadow in AnimationenVorgemerkte Unschärfeebenen verwenden oder den Animationsbereich reduzieren
Animationen überdecken CTA / FormulareAnimationsebene mit pointer-events: none versehen oder den interaktiven Bereich aussparen
Ladeanimation der ersten Seite länger als 1,5sWenn länger, zuerst ein Content-Skeleton anzeigen
Benutzerdefinierte Cursor + Schweif (außer vom Nutzer explizit gewünscht)Nicht verwenden
Jedes Listenelement mit komplexer Wort-für-Wort- oder Frame-für-Frame-Animation30–50ms Stagger-Verschiebung der gesamten Gruppe verwenden
setTimeout zum Verketten von AnimationenTransition/animation-Events, onAnimationComplete, Timeline verwenden
Frame-basiertes el.style.left = xWAAPI / rAF / Timeline der Bibliothek verwenden

Begründung: Wenn der erste Bildschirm länger als 1,5s wartet, beginnt der Nutzer zu zweifeln, ob die Seite hängt; daher zuerst Content-Skeleton anzeigen. Wenn mehr als 3 unabhängige Bewegungen gleichzeitig stattfinden, geht der visuelle Fokus verloren und der Nutzer weiß nicht, wohin er schauen soll.

§2 Auswahlentscheidungsbaum (Kurzfassung)

Bestimme zuerst das Schema aus der Tabelle, dann die Werte aus §3, erst dann schreibe Code.

SzenarioErste WahlNicht verwenden
Hover / Press / Toggle-FeedbackCSS-TransitionGSAP (zu schwer)
Komponentenbetreten/-verlassen, Listenhinzufügung/-entfernung, Layout-Änderungenmotion (AnimatePresence + layout)Manuelles height-Animieren
Routen-/SeitenübergängeView Transitions API oder motion layoutIdVollbildüberlagerung + Verzögerung
Komplexe Timeline, Sequenz-Choreographie, Scroll-InteraktionenGSAP + ScrollTriggerCSS-Keyframes-Ansammlung
3D / Partikel / Physik / Shaderthree.js + React Three Fiber + dreiMit CSS 3D vortäuschen
Vektoranimationen vom DesignerdotLottie / LottieIn GIF umwandeln
Einfache Icons oder PfadanimationenSVG + CSSLottie-Runtime einführen
DiagrammanimationenBibliothekseigene Animationen (wie Recharts/visx Transition)Pfade selbst tweenen
Hintergrunddekoration (Grid/Wellen/Glühen)CSS oder Canvas + requestAnimationFrame, pausierbarthree.js (außer bei echtem 3D-Bedarf)
Zahlen-/Betragsänderungentabular-nums + einfaches TweenFrame-basiertes Layout-Reset

Vollständige Auswahllogik, Fragereihenfolge und die Eskalationsleiter „CSS → leichte Bibliothek → schwere Bibliothek“ findest du unter references/decision-tree.md.

§3 Wertevorgaben (Kein „nach Gefühl“)

Alle Dauern, Kurven und Amplituden aus der folgenden Tabelle; für Werte, die nicht in der Tabelle enthalten sind, muss zuerst eine Begründung erfolgen, bevor sie hinzugefügt werden.

Dauer

ElementWert
Hover / Press120–180ms
Toggle / Aus-/Einklappen200–300ms
Einblendung240–400ms
AusblendungEinblendungsdauer × 0,6–0,7
Seitenübergang300–500ms
Layout-Änderung (Layout-Animation)300–500ms
Stagger-Intervall30–50ms, Gesamtdauer der gesamten Gruppe ≤ 500ms
Länger als 600msMuss begründet werden, sonst entfernen

Easing

EasingKurve
Einblendungcubic-bezier(0.16, 1, 0.3, 1)
Ausblendungcubic-bezier(0.4, 0, 1, 1)
Bidirektional / Zustandswechselcubic-bezier(0.4, 0, 0.2, 1)
Verschiebung / Drag / GestenSpring: stiffness 300–500, damping 30–40
linearNur Fortschrittsbalken, unendliche Schleifendekorationen

Amplitude

AmplitudeWert
VerschiebungGering 4–8px / Mittel 12–24px / Groß 32–64px / >80px nur bei Vollbildübergängen
TransparenzMikrointeraktion .9→1; Einblendung .6→1; 0→1 nur bei Vollbildüberlagerungen und Modals
SkalierungNur im Bereich 0.96–1.04

Spring

ParameterWertBegründung
stiffness300–500Unter 300 träge, über 500 zittert es wie ein Defekt
damping30–40Unter 30 zu starkes Zurückfedern, über 40 kein Federeffekt
mass0.8–1Minimale Änderung der Trägheit spürbar

Begründung für Intervalle, ein Satz pro Punkt:

  • Hover / Press 120–180ms: Unter 120ms ist die Statusänderung nicht lesbar; über 180ms wirkt die Rückmeldung träge, der Nutzer denkt, er habe nicht geklickt.
  • Einblendung 240–400ms: Unter 240ms ist die Bewegungsrichtung nicht lesbar; über 400ms beginnt der Nutzer zu warten.
  • Ausblendung × 0,65: Das Verlassen muss nicht deutlich sichtbar sein; langsamer wirkt schleppend.
  • Stagger 30–50ms: Unter 30ms erscheint alles gleichzeitig; über 50ms überschreitet die gesamte Gruppe die 500ms-Geduldsgrenze.

Diese Werte sind bereits als CSS-Variablen und TS-Konstanten in references/tokens.md hinterlegt; der gesamte Code referenziert Tokens, keine hartcodierten Zahlen.

§4 Performance- und Accessibility-Richtlinien

  1. Animiere nur transform / opacity; für Größenänderungen verwende FLIP oder die layout-Fähigkeit einer Bibliothek.
  2. Füge will-change: transform zu kontinuierlich animierten Ebenen hinzu; entferne es nach Ende der Animation.
  3. Virtualisiere lange Listen; pausiere Offscreen-Elemente mit IntersectionObserver.
  4. prefers-reduced-motion: reduce ist ein Pflichtzweig, keine optionale Verbesserung. Nach dem Downgrade muss der Statuswechsel immer noch klar erkennbar sein: In der Regel auf ≤120ms Opacity-Überblendung (120ms reichen aus, um den Statuswechsel zu lesen, ohne dass eine interpretierte Animation nötig ist) oder direkten Wechsel zurückgreifen.
  5. Verwende kein Flimmern mit mehr als 3 Mal pro Sekunde (WCAG 2.3.1 Photosensitivitätsschwelle liegt bei 3 Flimmern pro Sekunde).
  6. Während der Animation darf kein Fokus geraubt, keine Tabulatorreihenfolge gestört werden; der Tastaturfokus-Ring nimmt nicht an der Animation teil.
  7. Gestalte so, dass auch die statische Version gut aussieht – Animationen sind nur eine Verbesserung.

WCAG-Kriterien, aria-live und Testmethoden findest du unter references/accessibility.md.

§5 Implementierungsregeln (Eisern)

  • Ein- und Ausblendung paarweise entwerfen; Ausblendung schneller.
  • Nur ein visueller Fokus pro Bildschirm.
  • Stagger mit 30–50ms; gesamte Gruppe maximal 500ms.
  • Dekorative Animationsebene muss pointer-events: none erhalten.
  • Verwende Transition/animation-Events, onAnimationComplete oder Timeline zur Verkettung; setTimeout ist verboten.
  • Verwende kein GSAP, wenn CSS oder Framer-Motion ausreichen.
  • Verwende transform, anstatt width / height zu animieren.
  • Animationsdauer unterliegt dem Design-Review; keine „gefühlt langsamere“ Anpassung per Wort.
  • Erst reduzieren, dann hinzufügen: Lösche zunächst Animationen, die entfernt werden können; optimiere die verbleibenden.

§6 Review-Modus

Beim Review vorhandener Animationen gibst du jede Beanstandung in vier festen Abschnitten aus:

Problem / Begründung (Verweis auf §1–§4) / Codevorschlag / Auswirkung (Dauer, Performance, Accessibility)

Regeln:

  • Meldepunkte auf echte Probleme beschränken – keine Änderungen an funktionierenden Implementierungen um der Menge willen.
  • Maximal 8 Punkte; sortiert nach Schweregrad: Accessibility > Performance > Dauer/Easing > Stil.
  • Am Ende einen Abschnitt „Diese Aspekte sind in Ordnung“ mit 1–3 Punkten, damit der Nutzer nicht versehentlich gute Implementierungen ändert.

Scan-Befehl (nur lesend, kein --fix; jede automatische Änderung würde die Designabsicht zerstören):

node ~/.claude/skills/frontend-animation/scripts/audit-animation.mjs <Projektverzeichnis> --json

Das Skript meldet nur Probleme und Positionen; die Entscheidung zur Behebung liegt beim Menschen.

§7 Referenzen nach Symptom/Bedarf

Symptom/BedarfDatei
Unsicher, ob CSS oder Bibliothek; Auswahl zwischen Frameworks; Fragereihenfolgereferences/decision-tree.md
Token anlegen, Tailwind anbinden, CSS-Variablen oder TS-Konstanten schreibenreferences/tokens.md
Installation, API, Versionsfallen von motion / GSAP / three.js+R3F / Lottie / View Transitionsreferences/libraries.md
Fertige Vorlagen (Listen-Einblendung / Routenübergang / Drag / Mausfolge / Zahlenlauf / 3D-Flip / Schleifen-Hintergrund / Skeleton / Magnetic-Button / Lottie)references/patterns.md
Easing-Kurven auswählen, lineare Näherung von Spring, Kurve begründenreferences/easing.md
reduced-motion-Downgrade, WCAG, Flimmern und Fokus, Testmethodenreferences/accessibility.md
Vollständige Referenzkomponente mit reduced-motion-Zweigassets/template-component.tsx
Animationsprobleme im bestehenden Code scannenscripts/audit-animation.mjs

§8 Selbstprüfung vor dem Commit (8 Fragen, jede einzeln beantworten)

  1. Ist diese Animation notwendig? Sieht die statische Version auch ohne sie gut aus?
  2. Werden nur transform / opacity animiert?
  3. Liegen Dauer, Easing und Amplitude innerhalb der Vorgaben aus §3?
  4. Sind Ein- und Ausblendung paarweise vorhanden und die Ausblendung schneller?
  5. Gibt es einen reduced-motion-Zweig? Ist der Zustandswechsel im Downgrade noch erkennbar?
  6. Wurde eine neue Abhängigkeit hinzugefügt? Ohne Bestätigung wäre das ein Verstoß.
  7. Gibt es mehr als 3 Flimmer pro Sekunde? Wird während der Animation der Fokus geraubt?
  8. Gibt es nur einen visuellen Fokus pro Bildschirm?

Falls eine Frage nicht beantwortet werden kann, stoppe und korrigiere, bevor du committest.

Verwandte Skills