With the Framer Motion library, we can render animations in our React app easily.
In this article, we’ll take a look at how to get started with Framer Motion.
Animation
We can use the animate
prop to specify how to animate an element.
For example, we can write:
import React from "react";
import { motion } from "framer-motion";
export default function App() {
return (
<motion.div
style={{ backgroundColor: "red", width: 100, height: 100 }}
animate={{ scale: 2 }}
transition={{ duration: 0.5 }}
/>
);
}
We set animate
to { scale: 2 }
to double the size of the div.
The transition
component is set to { duration: 0.5 }
to set the duration of the animation in seconds.
Keyframes
We can add keyframes to create more complex animations.
For example, we can write:
import React from "react";
import { motion } from "framer-motion";
export default function App() {
return (
<motion.div
style={{ backgroundColor: "red", width: 100, height: 100 }}
animate={{
scale: [1, 2, 2, 1, 1],
rotate: [0, 0, 270, 270, 0],
borderRadius: ["30%", "30%", "50%", "50%", "40%"]
}}
/>
);
}
We add the scale
property to set the quality to scale the div by in each frame.
rotate
sets the rotation of the div in degrees in each frame.
borderRadius
sets the border radius of the div in each frame.
Each entry an array is a quantity in a frame.
Variants
We can set predefined visual states in which a component can be in.
For instance, we can write:
import React, { useState } from "react";
import { motion } from "framer-motion";
const variants = {
open: { opacity: 1, x: 0 },
closed: { opacity: 0, x: "-100%" }
};
export default function App() {
const [isOpen, setIsOpen] = useState(false);
return (
<>
<button onClick={() => setIsOpen(!isOpen)}>toggle</button>
<motion.nav animate={isOpen ? "open" : "closed"} variants={variants}>
<p>foo</p>
</motion.nav>
</>
);
}
to add animation when we toggle click on the toggle button to toggle the nav
on and off.
The variants
object have the style that the motion.nav
can be in in different animation stages.
If it’s open
, then opacity
is 1, and x
is 0.
And if it’s closed
, then opacity
is 0 and x
is '-100%'
.
Now we should see the ‘foo’ text move when we click on toggle.
Gesture Animations
We can listen to various gestures and animate elements when various gestures are applied.
For instance, we can write:
import React from "react";
import { motion } from "framer-motion";
export default function App() {
return (
<>
<motion.div
whileHover={{ scale: 1.1 }}
whileTap={{ scale: 0.9 }}
style={{ backgroundColor: "red", width: 100, height: 100 }}
></motion.div>
</>
);
}
to listen for hovers with the whileHover
prop.
And we listen to taps with the whileTap
prop.
Then we set the scale
to change the size of the div when those gestures are applied.
Conclusion
We can add complex animations with keyframes, and animate when gestures are applied with Framer Motion.