Smooth transitions between pages and views create continuity and help users understand spatial relationships. Choose transitions that match your content structure and user mental models.
Page 1
Pages slide left/right with spatial continuity
Best for: Navigation flows, wizard steps, carousel-like content
Pages slide up/down for hierarchical navigation
Best for: Modal overlays, detail views, mobile navigation
Pages scale and fade for focus transitions
Best for: Card expansions, focus changes, modal dialogs
Pages rotate on axis for dramatic transitions
Best for: Creative portfolios, image galleries, card reveals
Pages stack and unstack with depth
Best for: Layered navigation, settings panels, progressive disclosure
Simple fade for content-focused transitions
Best for: Content updates, subtle page changes, accessibility-friendly
// React Router + Framer Motion
import { AnimatePresence, motion } from 'framer-motion'
import { useLocation } from 'react-router-dom'
function AnimatedRoutes() {
const location = useLocation()
return (
<AnimatePresence mode="wait">
<motion.div
key={location.pathname}
initial={{ x: 300, opacity: 0 }}
animate={{ x: 0, opacity: 1 }}
exit={{ x: -300, opacity: 0 }}
transition={{ duration: 0.3 }}
>
<Routes location={location}>
{/* Your routes */}
</Routes>
</motion.div>
</AnimatePresence>
)
}// _app.js with Framer Motion
import { AnimatePresence, motion } from 'framer-motion'
function MyApp({ Component, pageProps, router }) {
return (
<AnimatePresence
mode="wait"
onExitComplete={() => window.scrollTo(0, 0)}
>
<motion.div
key={router.asPath}
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
exit={{ opacity: 0, y: -20 }}
transition={{ duration: 0.3 }}
>
<Component {...pageProps} />
</motion.div>
</AnimatePresence>
)
}prefers-reduced-motion