Framer Motion mit Claude Code: React Animationen 2026
Flüssige, physikalisch korrekte Animationen sind in modernen React-Apps kein Nice-to-have mehr — sie sind erwartet. Framer Motion ist die führende Animationsbibliothek im React-Ökosystem. Und mit Claude Code schreibst du komplexe Animations-Logik in Minuten statt Stunden.
1. motion Components: animate, initial, exit
Framer Motion ersetzt Standard-HTML-Elemente durch motion.*-Äquivalente. Das Herzstück sind drei Props: initial (Startzustand), animate (Zielzustand) und exit (Zustand beim Verlassen des DOM).
import { motion } from "framer-motion"; // Claude Code Prompt: "Erstelle eine motion.div die von unten einschwebt" export function FadeSlideIn({ children }: { children: React.ReactNode }) { return ( <motion.div initial={{ opacity: 0, y: 32 }} animate={{ opacity: 1, y: 0 }} exit={{ opacity: 0, y: -16 }} transition={{ duration: 0.4, ease: "easeOut" }} > {children} </motion.div> ); }
transition-Werte automatisch (spring, mass, stiffness, damping).
Die transition-Prop steuert den Animations-Typ. Framer Motion unterstützt tween, spring und inertia. Spring-Animationen fühlen sich am natürlichsten an:
// Spring-basierte Karten-Animation <motion.div initial={{ scale: 0.8, opacity: 0 }} animate={{ scale: 1, opacity: 1 }} transition={{ type: "spring", stiffness: 300, damping: 24, mass: 0.8 }} />
2. Variants: Wiederverwendbare Animation-States
Variants externalisieren Animations-Definitionen aus dem JSX. Das macht Code lesbarer und ermöglicht komplexe Stagger-Effekte für Listen und Grids.
const containerVariants = { hidden: { opacity: 0 }, visible: { opacity: 1, transition: { staggerChildren: 0.08, // Kinder zeitversetzt einblenden delayChildren: 0.2 } } }; const itemVariants = { hidden: { opacity: 0, x: -20 }, visible: { opacity: 1, x: 0, transition: { type: "spring", stiffness: 260, damping: 20 } } }; export function AnimatedList({ items }: { items: string[] }) { return ( <motion.ul variants={containerVariants} initial="hidden" animate="visible" > {items.map((item) => ( <motion.li key={item} variants={itemVariants}> {item} </motion.li> ))} </motion.ul> ); }
initial und animate vom Elternteil — du musst sie nicht explizit setzen.
Hover- und Tap-Variants machen interaktive States deklarativ:
const buttonVariants = { idle: { scale: 1, backgroundColor: "#0055ff" }, hover: { scale: 1.04, backgroundColor: "#0044ee" }, tap: { scale: 0.97 } }; <motion.button variants={buttonVariants} initial="idle" animate="idle" whileHover="hover" whileTap="tap" > Jetzt starten </motion.button>
3. AnimatePresence: Ein- und Ausblend-Animationen
Das größte Problem klassischer CSS-Animationen: Elemente, die aus dem DOM entfernt werden, können nicht animiert werden. AnimatePresence löst das, indem Framer Motion das Element im DOM hält, bis die Exit-Animation abgeschlossen ist.
import { AnimatePresence, motion } from "framer-motion"; export function Modal({ isOpen, onClose, children }) { return ( <AnimatePresence> {isOpen && ( <> // Backdrop <motion.div className="backdrop" initial={{ opacity: 0 }} animate={{ opacity: 1 }} exit={{ opacity: 0 }} onClick={onClose} /> // Modal Panel <motion.div className="modal-panel" initial={{ opacity: 0, scale: 0.92, y: 20 }} animate={{ opacity: 1, scale: 1, y: 0 }} exit={{ opacity: 0, scale: 0.92, y: 20 }} transition={{ type: "spring", duration: 0.35 }} > {children} </motion.div> </> )} </AnimatePresence> ); }
Für Seiten-Übergänge in Next.js oder React Router kombinierst du AnimatePresence mit dem mode="wait"-Prop — die alte Seite animiert vollständig aus, bevor die neue einblendet:
// Next.js App Router — layout.tsx <AnimatePresence mode="wait"> <motion.div key={pathname} initial={{ opacity: 0, x: 20 }} animate={{ opacity: 1, x: 0 }} exit={{ opacity: 0, x: -20 }} transition={{ duration: 0.28 }} > {children} </motion.div> </AnimatePresence>
4. Scroll Animationen: useScroll & useTransform
useScroll gibt reaktive Motion-Values zurück, die sich mit dem Scroll-Fortschritt des Users verändern. useTransform mappt diese Werte auf beliebige CSS-Properties.
import { useScroll, useTransform, motion } from "framer-motion"; export function ParallaxHero() { const { scrollY } = useScroll(); // scrollY 0→300px mappt auf y 0→-120px (Parallax-Effekt) const y = useTransform(scrollY, [0, 300], [0, -120]); // Opacity blendet aus wenn gescrollt wird const opacity = useTransform(scrollY, [0, 200], [1, 0]); return ( <motion.section style={{ y, opacity }} className="hero"> <h1>Willkommen</h1> </motion.section> ); }
Für element-relative Scroll-Progress (z.B. "Element ist 50% sichtbar") nutzt du useScroll mit dem target-Ref:
export function ScrollRevealCard() { const ref = useRef(null); const { scrollYProgress } = useScroll({ target: ref, offset: ["start end", "end start"] }); const scale = useTransform(scrollYProgress, [0, 0.5], [0.85, 1]); const opacity = useTransform(scrollYProgress, [0, 0.4], [0, 1]); return ( <motion.div ref={ref} style={{ scale, opacity }} className="card"> Content hier </motion.div> ); }
useTransform, useSpring) laufen außerhalb des React-Render-Zyklus direkt auf der GPU. Du bekommst 60fps-Scroll-Animationen ohne Re-Renders.
5. Drag und Gestures
Framer Motion macht Drag-Interaktionen deklarativ. Das drag-Prop aktiviert Drag, dragConstraints begrenzt den Bereich, dragElastic simuliert Widerstand an den Rändern.
// Draggable Karte mit Constraints und Snap-Back <motion.div drag dragConstraints={{ left: -100, right: 100, top: -50, bottom: 50 }} dragElastic={0.15} dragTransition={{ bounceStiffness: 400, bounceDamping: 30 }} whileDrag={{ scale: 1.05, cursor: "grabbing", zIndex: 10 }} className="draggable-card" > Drag mich! </motion.div> // Swipe-to-Dismiss (z.B. für Notifications) <motion.div drag="x" dragConstraints={{ left: 0, right: 0 }} onDragEnd={(_, info) => { if (Math.abs(info.offset.x) > 120) dismiss(); }} > Toast-Notification </motion.div>
Gesture-Callbacks (onHoverStart, onTap, onPan) geben dir vollständige Kontrolle über pointer-Events. In Kombination mit useMotionValue baust du custom Drag-Interaktionen:
import { useMotionValue, useTransform } from "framer-motion"; export function TiltCard() { const x = useMotionValue(0); const y = useMotionValue(0); const rotateX = useTransform(y, [-150, 150], [15, -15]); const rotateY = useTransform(x, [-150, 150], [-15, 15]); return ( <motion.div style={{ x, y, rotateX, rotateY, perspective: 800 }} drag dragElastic={0.08} className="tilt-card" > 3D Tilt Effekt </motion.div> ); }
6. Layout Animationen: Automatische FLIP-Technik
Layout-Animationen sind das mächtigste Feature in Framer Motion. Das layout-Prop animiert automatisch wenn sich Position oder Größe eines Elements ändert — ohne manuelle Keyframes. Intern verwendet Framer Motion die FLIP-Technik (First, Last, Invert, Play).
// FLIP-Animation: Elemente reorganisieren sich automatisch export function SortableList({ items, onSort }) { return ( <ul> {items.map((item) => ( <motion.li key={item.id} layout // ← Diese eine Prop reicht! transition={{ type: "spring", stiffness: 350, damping: 25 }} onClick={() => onSort(item.id)} > {item.label} </motion.li> ))} </ul> ); }
Shared Layout Animations über Komponenten-Grenzen hinweg — z.B. ein Thumbnail das zur Detailansicht expandiert — ermöglicht layoutId:
// Card expand → Detail (Shared Element Transition) {!isExpanded ? ( <motion.div layoutId="product-card" className="card-thumbnail" onClick={() => setExpanded(true)} > <motion.img layoutId="product-image" src={img} /> </motion.div> ) : ( <motion.div layoutId="product-card" className="card-detail" onClick={() => setExpanded(false)} > <motion.img layoutId="product-image" src={img} /> <p>Vollständige Beschreibung...</p> </motion.div> )}
layoutId-Strings verbinden Elemente über verschiedene Render-Zustände. Framer Motion interpoliert Position und Größe automatisch — keine zusätzliche Konfiguration nötig.
7. Claude Code Workflow für Framer Motion
Claude Code beschleunigt die Arbeit mit Framer Motion massiv — besonders bei der Entwicklung komplexer Animations-Systeme. So nutzt du Claude Code optimal:
Prompt-Strategie
Beschreibe die Animation visuell: "Karten fliegen von links rein, gestaffelt mit 100ms Abstand, Federphysik."
Variants generieren
Claude erstellt komplette Variant-Objekte inklusive staggerChildren, Timing und Easing-Kurven.
Performance-Review
Claude identifiziert animierte Properties die Layout-Thrashing verursachen (width/height statt transform/opacity).
Accessibility
Claude fügt automatisch prefers-reduced-motion-Checks ein — wichtig für Nutzer mit Bewegungsempfindlichkeit.
// Claude Code: "Respektiere prefers-reduced-motion" import { useReducedMotion } from "framer-motion"; export function AccessibleAnimation({ children }) { const reduceMotion = useReducedMotion(); return ( <motion.div initial={{ opacity: 0, y: reduceMotion ? 0 : 24 }} animate={{ opacity: 1, y: 0 }} transition={{ duration: reduceMotion ? 0.01 : 0.4 }} > {children} </motion.div> ); }
Mit Claude Code als Pair-Programmer iterierst du Animations-Designs in Echtzeit. Starte mit einfachen motion-Components, erweitere zu Variants, und optimiere mit Scroll- und Layout-Animationen — Claude begleitet jede Stufe.
Framer Motion mit KI beschleunigen
Starte deinen kostenlosen Trial und lass Claude Code deine React-Animationen entwickeln.
Kostenlos testen →