Skip to main content

useIntersectionObserver

Description and use case

useIntersectionObserver exposes visibility state plus timing metrics for lazy loading and engagement tracking.

API signature

function useIntersectionObserver<T extends Element = Element>(
options?: IntersectionObserverInit,
): UseIntersectionObserverReturn<T>;

Parameters

NameTypeRequiredDescription
optionsIntersectionObserverInitNoStandard root, rootMargin, and threshold observer options.

Return value

FieldTypeDescription
ref(node: T | null) => voidCallback ref to attach to target element.
isVisiblebooleanWhether element currently satisfies intersection visibility threshold.
metrics.firstVisibleAtnumber | nullTimestamp of first visibility event.
metrics.totalVisibleMsnumberAccumulated visible duration across sessions.

Live interactive demo (StackBlitz)

GitHub Pages does not serve the isolation headers required for embedded StackBlitz WebContainers. Open the demo in StackBlitz to run it interactively.

Code example

import { useIntersectionObserver } from 'react-perf-hooks';

export function HeroImage() {
const { ref, isVisible, metrics } = useIntersectionObserver<HTMLImageElement>({
threshold: 0.25,
rootMargin: '150px 0px',
});

return (
<figure>
<img ref={ref} src={isVisible ? '/hero-large.jpg' : '/hero-placeholder.jpg'} alt="Hero" />
<figcaption>
First visible at: {metrics.firstVisibleAt?.toFixed(1) ?? 'n/a'}ms, total visible:{' '}
{metrics.totalVisibleMs.toFixed(1)}ms
</figcaption>
</figure>
);
}

Companion article