Skip to content

useOnScreen

Tracks whenever a given element is visible on screen.

Installation

npx rabbithook@latest add use-on-screen

Usage

App.tsx
import useOnScreen from "@/hooks/use-on-screen";
function Component() {
const ref = useRef<HTMLDivElement>(null)
const isVisible = useOnScreen(ref);
return (
<div>
<div style={{ height: "100vh" }}>Scroll to see the magic</div>
<div ref={ref}>
{isVisible ? "Visible" : "Not visible"}
</div>
</div>
);
}

Code

use-on-screen.ts
import { RefObject, useEffect, useState } from "react";
function useOnScreen(ref: RefObject<Element>, offset = 0) {
const [isVisible, setIsVisible] = useState(false);
useEffect(() => {
const element = ref.current;
if (!element) return;
const observer = new IntersectionObserver(
([entry]) => {
setIsVisible(entry.isIntersecting);
},
{ rootMargin: `${offset}px` }
);
observer.observe(element);
return () => {
observer.unobserve(element);
};
}, [ref, offset]);
return isVisible;
}
export default useOnScreen;