Skip to content

n8tb1t/use-scroll-position

Repository files navigation

use-scroll-position

NPM Version Downloads License

Screenshot

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.


⚡️ Quickstart

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)
})

📖 Documentation

👉 Full Docs Site


✨ Features

  • ✅ React 19 support
  • ✅ SSR-ready
  • ✅ LLM-friendly docs
  • ✅ Native TypeScript

📦 Installation

Using NPM:

npm install @n8tb1t/use-scroll-position

Using PNPM:

pnpm add @n8tb1t/use-scroll-position

🚀 Usage

Track window scroll position

useWindowScrollPosition(({ prevPos, currPos, top, bottom }) => {
  console.log(prevPos, currPos, top, bottom)
})
useBodyScrollPosition(({ prevPos, currPos, top, bottom }) => {
  console.log(prevPos, currPos, top, bottom)
})

Track element position in the viewport (window)

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} />

Track scroll position in an overflow container

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' }} />
)

Track element scroll position inside an overflow container

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>
)

💡 Use Cases

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.

🤝 Contributing

See the Contributing Rules.