Les animations sont ce qui permet de transformer des sites Web ordinaires en expériences excitées et inoubliables. Elles ajoutent un peu de personnalité et de caractère unique à votre site Web et laissent le visiteur admirant l’esthétique globale.
Il est évident que les humains aiment les choses belles. Nous aimons tous les produits qui semblent facile à la vue.
Dans cet article, nous allons apprendre comment créer des animations qui étonnent les utilisateurs en utilisant Framer motion et React-Router-Dom.
Prérequis
Pour pouvoir suivre ce que nous faisons dans cet article, vous devriez avoir une certaine connaissance de React, Framer motion et React-Router-DOM.
Pour mieux apprendre Framer motion, vous pouvez étudier leur documentation.
Node.js devrait également être installé sur votre système, et vous devez avoir un éditeur de code fonctionnel. Je vais utiliser VS Code.
Comment Set Up le Projet
Pour configurer notre projet, nous allons utiliser Vite pour créer notre environnement de développement React.
-
Ouvrez le terminal dans VScode. Vous pouvez utiliser Ctrl + backtick(`)
-
Dans votre terminal, saisissez la commande suivante :
npm create vite@latest
-
Suite aux instructions, donnez un nom à votre projet et choisissez le framework que vous souhaitez. Dans notre cas, nous utilisons React. Ce sera un projet JavaScript.
-
Allez dans le répertoire de votre projet et utilisez
npm i
dans le terminal. -
Pour démarrer votre projet, utilisez
npm run dev
. -
N’oubliez pas de nettoyer votre projet en supprimant le code dans App.js et vos fichiers CSS dans le dossier
src
.
Comment initialiser Framer Motion et React-Router-Dom
- Pour installer Framer-motion dans votre projet, ouvrez le terminal et saisissez :
npm i framer-motion
- Pour installer React-Router-DOM dans votre projet, ouvrez le terminal et saisissez :
npm i react-router-dom
Comment configurer les composants et la routage de base avec React-Router-Dom
Configurez donc vos composants et les pages vers lesquelles vous allez routez pour ce projet.
-
Dans
src
, créez un nouveau dossier nommécomponents
. -
Nous ajouterons quatre fichiers dans ce dossier nommés
Home.jsx
,About.jsx
,Projects.jsx
etNavbar.jsx
. -
Dans les trois premiers, nous allons créer un composant fonctionnel React. Changez le contenu de l’étiquette
h1
dans chaque composant :
const Home = () => {
return (
<div>
<h1>Home</h1>
</div>
)
}
export default Home
- Dans le Navbar, nous avons besoin d’importer
Link
de React-Router-DOM pour créer des éléments d’ancre. Nous devons ensuite créer un conteneur logique contenant notre logo et les liens de navigation. Le logo liera les points vers notre page d’accueil.
import {Link} from "react-router-dom"
const Navbar () => {
return (
<div className="nav">
<div className="logo">
<Link className="nav-link" to="/">Lennythedev</Link>
</div>
<div>
<div className="nav-links">
<div className="nav-item">
<Link className="nav-link" to="/">Home</Link>
</div>
<div className="nav-item">
<Link className="nav-link" to="/">About</Link>
</div>
<div className="nav-item">
<Link className="nav-link" to="/">Projects</Link>
</div>
</div>
</div>
</div>
)
}
- Maintenant, allons-y dans notre fichier
index.js
oumain.js
. Le but est de recouvrir notre application entière avecBrowserRouter
qui permet la navigation dans notre application.
import React from "react"
import ReactDOM from 'react-dom/client'
import App from './App.jsx'
import './index.css'
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'
ReactDOM.createRoot(document.getElementById('root')).render(
<React.StrictMode>
<Router>
<Routes>
<Route path='/*' element={<App />} />
</Routes>
</Router>
</React.StrictMode>,
)
- Maintenant, dans
App.js
, nous allons effectuer la dernière étape de notre configuration. Nous importons nos composants et certaines fonctionnalités de React-Router-DOM et affichons nos composants. En utilisant la fonctionnalitéuseLocation
de React-Router-DOM, nous pouvons définir l’emplacement actuel des itinéraires en fixant la clé à la chemin courant.
import './App.css'
import { Routes, Route, useLocation } from 'react-router-dom'
import NavBar from './components/NavBar';
import Home from './components/Home';
import Projects from './components/Projects';
import About from './components/About';
function App() {
const location = useLocation();
return (
<>
<NavBar />
<AnimatePresence mode='wait'>
<Routes location={location} key={location.pathname}>
<Route index element={<Home />} />
<Route path='/projects' element={<Projects />}/>
<Route path='/about' element={<About />}/>
</Routes>
</AnimatePresence>
</>
)
}
export default App
- Maintenant, nous pouvons ajouter notre style dans
App.css
:
* {
margin: 0;
padding: 0;
box-sizing: border-box;
color: white;
font-family: "Fira Sans Condensed", sans-serif;
}
html,
body {
font-family: "Fira Sans Condensed", sans-serif;
background: rgb(0, 162, 255);
}
.nav {
position: fixed;
width: 100%;
display: flex;
justify-content: space-between;
}
.nav-links {
display: flex;
cursor: pointer;
}
.logo, .nav-item {
margin: 2em;
font-weight: 400;
font-size: 1.5vw;
}
h1{
width: 80%;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
text-align: center;
font-weight: 500;
font-size: 10vw;
line-height: 1;
text-transform: uppercase;
}
a {
text-decoration: none;
font-weight: 500;
}
- Après avoir suivi toutes les étapes, votre application devrait ressembler à ceci :
page web stylisée sans animation
Comment créer des transitions à l’aide de Framer Motion
Finalement, let’s créer notre animation pour les transitions entre pages.
-
Créer un fichier dans le dossier components nommé
Box.jsx
etimport motion from framer-motion
. -
Nous pouvons ensuite retourner deux divs, avec les
classNames
deslide-in
etslide-out
l’un pour glisser à l’intérieur et l’autre pour glisser à l’extérieur. -
Nous insérons notre animation dans ces divs avec l’aide de framer-motion :
import { motion } from "framer-motion"
export default function Box() {
return(
<div>
<motion.div
className="slide-in"
initial={{ scaleY: 0 }}
animate={{ scaleY: 0 }}
exit={{ scaleY: 1 }}
transition={{ duration: 1, ease: [0.22, 1, 0.36, 1] }}
/>
<motion.div
className="slide-out"
initial={{ scaleY: 1 }}
animate={{ scaleY: 0 }}
exit={{ scaleY: 0 }}
transition={{ duration: 1, ease: [0.22, 1, 0.36, 1] }}
/>
</div>
)
}
- Ensuite, nous ajoutons notre style dans notre fichier CSS pour
slide-in
etslide-out
dans notre App.css
.slide-in {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100vh;
background: #0f0f0f;
transform-origin: bottom;
}
.slide-out {
position: fixed;
top: 0;
left: 0;
height: 100vh;
background: #0f0f0f;
transform-origin: top;
}
- Enfin, la dernière étape consiste à utiliser
AnimatePresence
de framer-motion dans notre fichierApp.js
et à enveloppez l’ensemble de l’App dansAnimatePresence
et à définir le mode comme wait. Si vous voulez en savoir plus sur unAnimatePresence
, visiter les docs de framer-motion.
import './App.css'
import { Routes, Route, useLocation } from 'react-router-dom'
import NavBar from './components/NavBar';
import Home from './components/Home';
import Projects from './components/Projects';
import About from './components/About';
import { AnimatePresence } from 'framer-motion';
function App() {
const location = useLocation();
return (
<>
<NavBar />
<AnimatePresence mode='wait'>
<Routes location={location} key={location.pathname}>
<Route index element={<Home />} />
<Route path='/projects' element={<Projects />}/>
<Route path='/about' element={<About />}/>
</Routes>
</AnimatePresence>
</>
)
}
export default App
- Enfin, notre travail devrait ressembler à celui du vidéo ci-dessous :
Conclusion
Créer des animations multicollines avec Framer Motion et React-Router-Dom améliore l’expérience utilisateur en fournissant des transitions fluides.
Cette intégration exploite les capacités d’animation de Framer Motion en combinaison avec les fonctionnalités de routage de React-Router-Dom, ce qui permet de créer des applications web dynamiques et interactives.