Using a state to do animations can be very expensive in terms of performance.
react-spring
provides a way to control the styles/text without triggering re-renders.
By using the SpringValue (opens in a new tab) with an animated element, you can update the value without triggering re-renders.
react-scrollytelling provides a wrapper around useSectionScroll()
to update the SpringValue
, so you can animate the element based on the scroll progress.
Example
Single Section
You can use useSectionScrollSpring()
which returned updated SpringValue
- scrolledRatioSpring
based on the scroll progress:
import { useSectionScrollSpring } from '@react-scrollytelling/react-spring';
import { animated } from '@react-spring/web';
export const Section = () => {
const sectionRef = useRef<HTMLDivElement>(null);
const { scrolledRatioSpring } = useSectionScrollSpring(sectionRef);
return (
<>
{/* Use SpringValue with an animated element to change the styles */}
<animated.section ref={sectionRef} style={{
opacity: scrolledRatioSpring.to((val) => 0.2 + 0.8 * val),
borderWidth: scrolledRatioSpring.to((val) => `${Math.round(val * 6)}px`),
}}>
{/* ... */}
</animated.section>
</>
);
};
Example
- scrolledRatio: 0
Multiple Sections
Example
You can simply the example in track grouped sections and use useActiveSectionSpring()
to get the active section information and the updated SpringValue
based on the scroll progress:
import { useActiveSectionSpring } from '@react-scrollytelling/react-spring';
const { trackingId, scrolledRatioSpring } = useActiveSectionSpring();
You are viewing section
0
RED
ORANGE
YELLOW
GREEN
BLUE
PURPLE