useScroll

React hook to track and manipule the scroll position of a web page.

Add the hook via the CLI:

npx @novajslabs/cli add useScroll

Or copy and paste the code into your project:

import { useState, useLayoutEffect } from 'react'

export const useScroll = () => {
  const [position, setPosition] = useState({
    x: 0,
    y: 0,
  })

  const handleScroll = () => {
    setPosition({
      x: window.scrollX,
      y: window.scrollY,
    })
  }

  useLayoutEffect(() => {
    window.addEventListener('scroll', handleScroll)

    return () => {
      window.removeEventListener('scroll', handleScroll)
    }
  }, [])

  return { position, scrollTo: window.scrollTo }
}

React 16.8 or higher

  • Name
    position
    Type
    object
    Description

    Indicates the current scroll position of the window.

  • Name
    position.x
    Type
    number
    Description

    The current horizontal scroll position of the window.

  • Name
    position.y
    Type
    number
    Description

    The current vertical scroll position of the window.

  • Name
    scrollTo
    Type
    function
    Description

    Allows you to scroll to a specified position.

import { useScroll } from './hooks/useScroll'

const App = () => {
  const { position, scrollTo } = useScroll()

  return (
    <div
      style={{
        height: window.innerHeight,
        width: window.innerWidth,
        display: 'flex',
        justifyContent: 'center',
        alignItems: 'center',
        flexDirection: 'column',
      }}
    >
      <p>x: {position.x}</p>
      <p>y: {position.y}</p>
      <button onClick={() => scrollTo({ top: 0, behavior: 'smooth' })}>
        Scroll to top
      </button>
    </div>
  )
}

export default App

Here are some use cases where this React hook is useful:

  • Track the scroll position to make a header sticky when the user scrolls past a certain point
  • Load more content when the user scrolls near the bottom of the page
  • Trigger animations based on the user's scroll position
  • Highlight navigation items based on the section currently in view
  • Show a button that scrolls the user back to the top of the page