React Page Animations with Framer Motion

Date: 2023-05-26

The key to get it working is:

  • Wrap the <Routes> element in a <AnimatePresence> element
  • Add key={location.pathname} location={location} to the <Routes> element
  • Use a <motion.div> (or similar element) within your route (content) element
import React from "react";
import { Routes, Route, useLocation } from "react-router-dom";
import Home from "./Home";
import Contact from "./Contact";
import About from "./About";
import { AnimatePresence } from "framer-motion";

export function AnimatedRoutes(props: {}) {
    const location = useLocation();
    
    return (
    <AnimatePresence>
        <Routes key={location.pathname} location={location}>
            <Route path="/" element={<Home />} />
            <Route path="/home" element={<Home />} />
            <Route path="/about" element={<About />} />
            <Route path="/contact" element={<Contact />} />
        </Routes>
    </AnimatePresence>
    );
}


export function App(props: {}) {
    /* HashRouter or BrowserRouter */
    return (<div>
        <HashRouter> 
            <AnimatedRoutes />
        </HashRouter>
    </div>)
}
78240cookie-checkReact Page Animations with Framer Motion