useIntersectionObserver

Observe when an element enters or leaves the viewport.

https://www.shaktools.com/shak-hooks
Sensor

API Reference

Installation

terminal
pnpm add @shak-hooks/usehooks
import.ts
import { useIntersectionObserver } from "@shak-hooks/usehooks";
Source: packages/react/src/useIntersectionObserver.ts

Signature

signature.ts
export function useIntersectionObserver(elementRef: RefObject<Element>, { threshold = 0, root = null, rootMargin = '0%', freezeOnceVisible = false, }: UseIntersectionObserverOptions = {}): IntersectionObserverEntry | undefined

Parameters

NameTypeOptionalDefault
elementRefRefObject<Element>No-
{ threshold = 0, root = null, rootMargin = '0%', freezeOnceVisible = false, }UseIntersectionObserverOptionsYes{}

Returns

IntersectionObserverEntry | undefined

Exported Types

types.ts
1export interface UseIntersectionObserverOptions extends IntersectionObserverInit {
2 freezeOnceVisible?: boolean;
3}

Implementation

use-intersection-observer.ts
1import { useEffect, useRef, useState } from "react";
2
3export function useIntersectionObserver(
4 elementRef: React.RefObject<Element>,
5 {
6 threshold = 0,
7 root = null,
8 rootMargin = "0%",
9 freezeOnceVisible = false,
10 }: IntersectionObserverInit & { freezeOnceVisible?: boolean }
11): IntersectionObserverEntry | undefined {
12 const [entry, setEntry] = useState<IntersectionObserverEntry>();
13
14 const frozen = entry?.isIntersecting && freezeOnceVisible;
15
16 const updateEntry = ([entry]: IntersectionObserverEntry[]) => {
17 setEntry(entry);
18 };
19
20 useEffect(() => {
21 const node = elementRef?.current;
22 const hasIOSupport = !!window.IntersectionObserver;
23
24 if (!hasIOSupport || frozen || !node) return;
25
26 const observerParams = { threshold, root, rootMargin };
27 const observer = new IntersectionObserver(updateEntry, observerParams);
28
29 observer.observe(node);
30
31 return () => observer.disconnect();
32 }, [elementRef, JSON.stringify(threshold), root, rootMargin, frozen]);
33
34 return entry;
35}

Advertisement

Google Ads

Usage

example.tsx
1import { useIntersectionObserver } from "@shak-hooks/usehooks";
2
3const result = useIntersectionObserver(null, undefined);
4// result: IntersectionObserverEntry | undefined
5// Use values directly (React state).

Let‘s do great work together

Empowering creators with free, high-performance AI, SEO, and developer tools. Join thousands of users optimizing their workflow with Shak-Tools.

Tools10+ Free
UsersGlobal

Stay in the loop

Join our newsletter for the latest AI tools and updates.

ShakTools
© 2025 Shaktools. All Rights Reserved.Privacy Policy