use-scroll-position
is a lightweight, tree-shakable React hook library for detecting and tracking scroll position — either of the window or a specific element. Designed for performance-sensitive use cases.
⚡️ Version 4.0.0 is a complete rewrite of the library.
For older versions, see the legacy docs.
Track the global window scroll position in just a few lines:
import { useWindowScrollPosition } from '@n8tb1t/use-scroll-position'
useWindowScrollPosition(({ currPos }) => {
console.log('Current scroll position:', currPos.y)
})
- useWindowScrollPosition – track global window scroll or specific element position.
- useBodyScrollPosition – similar to window scroll, with a different detection method.
- useOverflowScrollPosition – track scroll inside an overflow container (supports root + child target refs).
- ✅ React 19 support
- ✅ SSR-ready
- ✅ LLM-friendly docs
- ✅ Native TypeScript
Using NPM:
npm install @n8tb1t/use-scroll-position
Using PNPM:
pnpm add @n8tb1t/use-scroll-position
useWindowScrollPosition(({ prevPos, currPos, top, bottom }) => {
console.log(prevPos, currPos, top, bottom)
})
useBodyScrollPosition(({ prevPos, currPos, top, bottom }) => {
console.log(prevPos, currPos, top, bottom)
})
const setElementRef = useWindowScrollPosition(({ prevPos, currPos, top, bottom }) => {
console.log(prevPos, currPos, top, bottom)
})
return <div ref={setElementRef} />
const setElementRef = useBodyScrollPosition(({ prevPos, currPos, top, bottom }) => {
console.log(prevPos, currPos, top, bottom)
})
return <div ref={setElementRef} />
const [setRootRef] = useOverflowScrollPosition(({ prevPos, currPos, top, bottom }) => {
console.log(prevPos, currPos, top, bottom) // root container scroll
})
return (
<div ref={setRootRef} style={{ height: '100px', width: '300px', overflow: 'auto' }} />
)
const [setRootRef, setTargetRef] = useOverflowScrollPosition(({ prevPos, currPos, top, bottom }) => {
console.log(prevPos, currPos, top, bottom) // target element scroll
})
return (
<div ref={setRootRef} style={{ height: '100px', width: '300px', overflow: 'auto' }}>
<div ref={setTargetRef} />
</div>
)
Here are some common ways developers use use-scroll-position
:
- Sticky Headers & Navbars – hide, reveal, or shrink navigation bars depending on scroll direction.
- Infinite Scrolling – detect when the user reaches the bottom of a container or the window to load more data.
- Scroll-Based Animations – trigger animations or transitions as elements enter the viewport.
- Active Section Highlighting – update navigation menus (scrollspy effect) as the user scrolls through sections.
- Custom Parallax Effects – adjust element positions or backgrounds smoothly based on scroll position.
- Performance Monitoring – track scroll behavior for analytics or user experience optimization.
See the Contributing Rules.