- Published on
Page Transitions for Next.js
The page transitions on this site are created with Framer Motion. Page transitions add a touch of elegance and interactivity to the user experience, making the navigation between pages feel seamless and engaging. In this fiddle, I’ll briefly explain how the transitions are created in this project.
Introduction
Next.js is a popular React framework for building server-rendered applications, and Framer Motion is a powerful animation library that simplifies creating fluid and dynamic animations. By combining these two technologies, we can achieve smooth page transitions that enhance the overall user experience.
Basic Setup
To use Framer Motion in our Next.js project, we first need to wrap Component in _app.tsx with the AnimatePresence
component from Framer Motion. This component is used to animate the entrance and exit of components when they're mounted and unmounted, respectively.
<AnimatePresence mode="wait" initial={false} onExitComplete={() => window.scrollTo(0, 0)}>
<Component {...pageProps} key={router.asPath} />
</AnimatePresence>
- We pass a
scrollTo(0,0)
to onExitComplete, to ensure that the page is scrolled to the top when a page is exited. - We set initial to
false
to prevent an animation from playing when the app is first loaded.
Setting up the PageTransition Component
To begin, we'll create a custom PageTransition
component that handles the animation logic for our page transitions. This component will use Framer Motion to animate the entrance and exit of pages.
import { motion } from 'framer-motion'
export const PageTransition = ({ children }) => (
<motion.div
initial={{ y: -300, opacity: 0 }}
animate={{ y: 0, opacity: 1 }}
exit={{ y: -300, opacity: 0 }}
transition={{ duration: 0.2, ease: 'easeInOut' }}
>
{children}
</motion.div>
)
How it Works
The PageTransition
component uses Framer Motion's motion.div
to wrap the content of each page. The initial
, animate
, and exit
props define the animation behavior when the component is initially loaded, when it's in the viewport, and when it's about to be unmounted (exited), respectively.
The x
property is used to animate the position of the page along the X-axis. onTheRight
sets the initial position of the page to be outside the viewport on the right side, inTheCenter
animates the page to be in the center of the viewport, and onTheLeft
animates the page to move out of the viewport on the left side.
The transition
prop specifies the duration and easing function of the animation.
Using the PageTransition Component
To enable page transitions for our Next.js site, we need to wrap the content of each page with the PageTransition
component. For example, in a Next.js page component:
import { PageTransition } from '@/components/wrappers/PageTransition'
const MyPage = () => {
return (
<PageTransition>
<div>{/* Your page content here */}</div>
</PageTransition>
)
}
export default MyPage
Conclusion
By implementing the PageTransition
component using Framer Motion in our Next.js project, we have successfully added smooth and visually appealing page transitions to our site. Users will now experience a more seamless and engaging navigation between pages, enhancing their overall browsing experience.
Framer Motion offers numerous animation capabilities, allowing you to customize and tailor the page transitions to suit your specific design needs. So, if you're looking to elevate your Next.js site with captivating animations, Framer Motion is a fantastic tool to explore.
Happy animating!