React.js useIsInViewport Hook

React hook which reports if an element is in viewport.

React.js useIsInViewport Hook

export function useIsInViewport(ref) {
  const [isIntersecting, setIsIntersecting] = useState(false);

  const observer = useMemo(
    () =>
      new IntersectionObserver(([entry]) =>
        setIsIntersecting(entry.isIntersecting)
      ),
    []
  );

  useEffect(() => {
    observer.observe(ref.current);

    return () => {
      // disconnect() will stop observing all elements.
      // unobserve(entry.target) will stop observing the element passed in 
      observer.disconnect();
    };
  }, [ref, observer]);

  return isIntersecting;
}

Usage

import { useEffect, useRef, useState, useMemo } from "react";
import { useIsInViewport } from "./hooks/useIsInViewport";

export default function App() {
  const ref1 = useRef(null);
  const ref2 = useRef(null);

  const isInViewport1 = useIsInViewport(ref1);

  const isInViewport2 = useIsInViewport(ref2);

  return (
    <div>
      <div ref={ref1}>Top div {isInViewport1 && "| in viewport ✅"}</div>

      <div style={{ height: "155rem" }} />

      <div ref={ref2}>Bottom div {isInViewport2 && "| in viewport ✅"}</div>
    </div>
  );
}