Skip to content

Instantly share code, notes, and snippets.

@maxpou

maxpou/index.ts Secret

Created September 15, 2023 08:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save maxpou/f235ef5b2e0f63b3a32e78f484b081c8 to your computer and use it in GitHub Desktop.
Save maxpou/f235ef5b2e0f63b3a32e78f484b081c8 to your computer and use it in GitHub Desktop.
useIsInViewport - a React Hook to detect if an HTML element is visible on screen
// How to use it
export default function MyComponent(): JSX.Element {
const containerRef = useRef<HTMLDivElement>(null);
const isInViewport = useIsVisibleOnScreen(containerRef, '50px');
return (
<div ref={containerRef}>
<h1>{isInViewport ? 'Visible' : 'Not visible'}</h1>
</div>
);
}
import { MutableRefObject, useEffect, useMemo, useState } from 'react';
export function useIsVisibleOnScreen(
ref: MutableRefObject<HTMLElement | null>,
rootMargin = '0px',
): boolean {
const [isVisible, setIsVisible] = useState(false);
const observer = useMemo(
() =>
new IntersectionObserver(
([entry]) => setIsVisible(entry.isIntersecting),
{ rootMargin },
),
[rootMargin],
);
useEffect(() => {
const currentElement = ref?.current;
if (currentElement) {
observer.observe(currentElement);
}
return () => {
observer.disconnect();
};
}, [ref, observer]);
return isVisible;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment