With the react-spring library, we can render animations in our React app easily.
In this article, we’ll take a look at how to get started with react-spring.
Installation
We can install the react-spring package by running:
npm install react-spring
Basic Animation
We can create basic animations with the useSpring hook.
For example, we can write:
import React from "react";
import { useSpring, animated } from "react-spring";
export default function App() {
const props = useSpring({ opacity: 1, from: { opacity: 0 } });
return <animated.div style={props}>hello world</animated.div>;
}
We call the useSpring hook to set the opacity that’s applied after the animation is done.
The from property has the styles before the animation.
The animated.div component lets us create a div that can be animated.
We pass in the props variable to the style prop to style it.
We can also animate text:
import React from "react";
import { useSpring, animated } from "react-spring";
export default function App() {
const props = useSpring({ number: 1, from: { number: 0 } });
return <animated.span>{props.number}</animated.span>;
}
We animate props.number when it changes from 0 to 1.
Also, we can scroll a div with the scroll property.
For example, we can write:
import React from "react";
import { useSpring, animated } from "react-spring";
export default function App() {
const props = useSpring({ scroll: 300, from: { scroll: 0 } });
return (
<animated.div
scrollTop={props.scroll}
style={{ overflowY: "scroll", height: 200 }}
>
{Array(100)
.fill()
.map((_, i) => (
<p key={i}>{i}</p>
))}
</animated.div>
);
}
We scroll 300px down from the top.
Also, we can combine multiple effects together:
import React from "react";
import { useSpring, animated, interpolate } from "react-spring";
export default function App() {
const { o, xyz, color } = useSpring({
from: { o: 0, xyz: [0, 0, 0], color: "red" },
o: 1,
xyz: [10, 20, 5],
color: "green"
});
return (
<animated.div
style={{
color,
background: o.interpolate((o) => `rgba(210, 57, 77, ${o})`),
transform: xyz.interpolate(
(x, y, z) => `translate3d(${x}px, ${y}px, ${z}px)`
),
border: interpolate([o, color], (o, c) => `${o * 10}px solid ${c}`),
padding: o
.interpolate({ range: [0, 0.5, 1], output: [0, 0, 10] })
.interpolate((o) => `${o}%`),
borderColor: o.interpolate({
range: [0, 1],
output: ["red", "#ffaabb"]
}),
opacity: o.interpolate([0.1, 0.2, 0.6, 1], [1, 0.1, 0.5, 1])
}}
>
{o.interpolate((n) => n.toFixed(2))}
</animated.div>
);
}
We call the useSpring hook to generate some values that are passed into the style prop.
We interpolate o , x , y , and z into various values to change the style of the div as it is animating.
We can pass in values that are created from the react-spring hooks into components directly.
For instance, we can write:
import React, { useState } from "react";
import { useSpring, animated } from "react-spring";
export default function App() {
const [state, setState] = useState(1);
const props = useSpring({ x: state ? 1 : 0 });
return (
<>
<button onClick={() => setState((state) => (state === 1 ? 0 : 1))}>
toggle
</button>
<animated.div
style={{
transform: props.x
.interpolate({
range: [0, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 1],
output: [1, 0.97, 0.9, 1.1, 0.9, 1.1, 1.03, 1]
})
.interpolate((x) => `scale(${x})`),
backgroundColor: "red",
height: 100,
width: 100
}}
/>
</>
);
}
We add the div and then we can change the scale as we click the toggle button by setting the transform prop.
We map the value from the range to the output .
And x is the value of output that corresponds to the one in range .
Conclusion
We can add basic animation to our React app with react-spring.