Animaties zijn hetgeen dat een eenvoudige website omzet in een spannende en onvergetelijke ervaring. Ze geven aan uw website wat persoonlijkheid en uniekheid en laten de bezoeker de algehele esthetiek bewonderen.
Het is een no-brainer dat mensen mooie dingen houden. We allen houden van producten die mooi aan de ogen zijn.
In dit artikel zullen we leren hoe we animaties kunnen maken die gebruikers verbluffen met de hulp van Framer motion en React-Router-Dom.
Voorwaarden
om te kunnen volgen wat we in dit artikel doen, moet u wat kennis hebben van React, Framer motion en React-Router-DOM.
Om beter Framer motion te leren, kunt u hun documentatie bestuderen.
Node.js moet ook op uw systeem zijn geïnstalleerd en u moet een werkende code-editor hebben. Ik zal VS Code gebruiken.
Hoe u het project opzet
Om ons project op te zetten, zullen we Vite gebruiken om ons React-ontwikkelingsomgeving in te stellen.
-
Open het terminal in VScode. U kunt Ctrl + backtick(`) gebruiken
-
In uw terminal, typ de volgende opdracht:
npm create vite@latest
-
Volg de opdrachten om uw project te noemen en kies uw gewenste framework. In ons geval gebruiken we React. Dit zal een JavaScript-project zijn.
-
Ga naar uw projectmap en gebruik
npm i
in de terminal. -
Om uw project te starten, gebruik
npm run dev
. -
Vergeet niet uw project schoon te maken door het code in App.js en uw CSS-bestanden in de
src
map te verwijderen.
Hoe u Framer Motion en React-Router-Dom initialiseert
- Om Framer-motion in uw project te installeren, open de terminal en voer in:
npm i framer-motion
- Om React-Router-DOM in uw project te installeren, open de terminal en voer in:
npm i react-router-dom
Hoe u Components opzet en Basic Routing met React-Router-Dom
Laat ons onze components instellen en de pagina’s die we voor dit project zullen routeren.
-
Maak in
src
een nieuwe map aan genaamdcomponents
. -
We zullen in deze map vier bestanden toevoegen met de namen
Home.jsx
,About.jsx
,Projects.jsx
enNavbar.jsx
. -
In de eerste drie zullen we een React functional component aanmaken. Wijzig de inhoud van de
h1
tag in elke component:
const Home = () => {
return (
<div>
<h1>Home</h1>
</div>
)
}
export default Home
- In de Navbar moeten we
Link
importeren van React-Router-DOM om anchor elementen te maken. We moeten vervolgens een container aanmaken die ons logo en navigatie knoppen bevat. Het logo zal de punten naar onze index pagina linken.
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>
)
}
- Nu gaan we naar ons
index.js
ofmain.js
bestand. Het doel is om onze gehele app te verpakken inBrowserRouter
wat ons routing binnen onze applicatie zal activeren.
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>,
)
- Nu in
App.js
zullen we de laatste stap van onze configuratie voltooien. We zullen onze componenten importeren, en enkele functies van React-Router-DOM en onze componenten renderen. DooruseLocation
functie van React-Router-DOM te gebruiken, kunnen we de huidige locatie van de routes instellen door de key op de huidige pad te zetten.
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
- Nu kunnen we onze stijling toevoegen in
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;
}
- Na het volgen van alle stappen zou uw app er ongeveer zo uit moeten zien:
geschikt voor opmaken pagina zonder animatie
Hoe u transities kunt maken met behulp van Framer Motion
Telkens weergaan we onze animaties voor de transitie tussen pagina’s aanmaken.
-
Maak een bestand in de map components aan en importeer motion uit framer-motion.
-
We kunnen dan twee div’s teruggeven, met
classNames
vanslide-in
enslide-out
, een voor glijden binnen en een voor glijden uit. -
We plakken onze animatie in deze div’s met behulp van 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>
)
}
- Vervolgens voegen we onze stijling toe in ons CSS-bestand voor
slide-in
enslide-out
in ons 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;
}
- Tot slot is de laatste stap om
AnimatePresence
van framer-motion in onsApp.js
-bestand te gebruiken en de gehele App inAnimatePresence
te plakken en de modus in te stellen op wait. Als u meer wilt leren overAnimatePresence
, bezoek de documenten van 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
- Tot slot zou ons werk eruit moeten zien als in het onderstaande video:
Conclusie
Het maken van multi-paginaanimaties met Framer Motion en React-Router-Dom verbetert de gebruikerservaring door middel van vloeiende transities.
Deze integratie maakt gebruik van de animatiescapabilitaten van Framer Motion samen met de routingfuncties van React-Router-Dom, resulterend in dynamische, interactieve webapplicaties.