framer-motion
Version:
An open source and production-ready motion library for React on the web
53 lines (44 loc) • 1.32 kB
text/typescript
import { motionValue, MotionValue } from "../"
/**
* @public
*/
export interface ScrollMotionValues {
scrollX: MotionValue<number>
scrollY: MotionValue<number>
scrollXProgress: MotionValue<number>
scrollYProgress: MotionValue<number>
}
export interface ScrollOffsets {
xOffset: number
yOffset: number
xMaxOffset: number
yMaxOffset: number
}
export type GetScrollOffsets = () => ScrollOffsets
export function createScrollMotionValues(): ScrollMotionValues {
return {
scrollX: motionValue(0),
scrollY: motionValue(0),
scrollXProgress: motionValue(0),
scrollYProgress: motionValue(0),
}
}
function setProgress(offset: number, maxOffset: number, value: MotionValue) {
value.set(!offset || !maxOffset ? 0 : offset / maxOffset)
}
export function createScrollUpdater(
values: ScrollMotionValues,
getOffsets: GetScrollOffsets
) {
const update = () => {
const { xOffset, yOffset, xMaxOffset, yMaxOffset } = getOffsets()
// Set absolute positions
values.scrollX.set(xOffset)
values.scrollY.set(yOffset)
// Set 0-1 progress
setProgress(xOffset, xMaxOffset, values.scrollXProgress)
setProgress(yOffset, yMaxOffset, values.scrollYProgress)
}
update()
return update
}