Framer Motion Hooks
Fill the hook gap in Framer Motion.
Installation
npm install framer-motion-hooks
Note: If you prefer yarn instead of npm, just use yarn add framer-motion-hooks.
Hooks
useInViewScroll
Returns a MotionValue representing the y scroll progress that updates when the target element is visible in viewport.
const MyComponent = () => {
const ref = useRef()
const progress = useInViewScroll(ref)
return <motion.div ref={ref} style={{ scale: progress }} />
}
API
const scrollProgress = useInViewScroll(ref, options)
scrollProgress: A number between 0 and 1ref: React ref target elementoptions: (optional) Scroll options (e.g. threshold)
useInViewAnimate
Fires an animation as soon as the element is visible in viewport.
const MyComponent = () => {
const { inViewRef, animation } = useInViewAnimate({ animate: "visible" })
return (
<motion.div
ref={inViewRef}
initial="initial"
animate={animation}
variants={variants}
/>
)
}
const variants = {
initial: {
x: 0
},
visible: {
x: 200
}
}
Note: Also works with direct props on the React element
API
const { inViewRef, animation } = useInViewAnimate(variants, options)
inViewRef: React refanimation: Motion animation controlsvariants: Motion target objectoptions: (optional) Intersection options
useMotionAsState
Returns a React state value that updates when the MotionValue changes
const MyComponent = () => {
const { scrollY } = useViewportScroll()
const reactState = useMotionAsState(scrollY)
return <span>{reactState}</span>
}
API
const state = useMotionAsState(value)
state: React statevalue: Motion value
useStateAsMotion
Returns a MotionValue value that updates when the React state changes
const MyComponent = () => {
const [opacity, setOpacity] = useState(0)
const motionOpacity = useStateAsMotion(opacity)
return <motion.div style={{ opacity: motionOpacity }} />
}
API
const value = useStateAsMotion(state)
value: Motion valuestate: React state