The most popular React animation library. Framer Motion provides a declarative API for complex animations, gestures, and layout transitions with minimal code.
License
MIT
Language
TypeScript
Adding fluid animations to React applications
Complex gesture interactions (drag, hover, tap)
Page transitions and shared element animations
What drives the Trust Score
Last 12 months
Simple CSS transitions (overkill for basic hover effects)
Performance-critical animations at 60fps+ (consider CSS)
Non-React projects
Free tier & paid plans
100% free, open-source (MIT)
Free & open-source
No paid tiers
Complementary tools that pair well with Framer Motion
Docs, videos, tutorials, and courses
Repository and installation options
View on GitHub
github.com/framer/motion
npm install framer-motionCopy and adapt to get going fast
import { motion } from 'framer-motion';
export function FadeIn({ children }: { children: React.ReactNode }) {
return (
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.4 }}
>
{children}
</motion.div>
);
}Common usage patterns
Staggered list animation
Animate list items one by one
const container = { hidden: { opacity: 0 }, show: { opacity: 1, transition: { staggerChildren: 0.1 } } };
const item = { hidden: { opacity: 0, x: -20 }, show: { opacity: 1, x: 0 } };
<motion.ul variants={container} initial="hidden" animate="show">
{items.map(i => <motion.li key={i.id} variants={item}>{i.name}</motion.li>)}
</motion.ul>Drag interaction
Make elements draggable
<motion.div
drag
dragConstraints={{ left: -100, right: 100, top: -50, bottom: 50 }}
whileDrag={{ scale: 1.1, boxShadow: '0 10px 30px rgba(0,0,0,0.2)' }}
className="cursor-grab active:cursor-grabbing w-32 h-32 bg-indigo-500 rounded-2xl"
/>Real experiences from developers who've used this tool