Skip to content

Instantly share code, notes, and snippets.

@luisvinicius09
Last active March 29, 2023 21:29
Show Gist options
  • Save luisvinicius09/9d00128437232353a4423da5f3e32195 to your computer and use it in GitHub Desktop.
Save luisvinicius09/9d00128437232353a4423da5f3e32195 to your computer and use it in GitHub Desktop.
useScrollPercentage hook
import { useRef, useState, useEffect } from 'react';
export default function useScrollPercentage(): [
React.RefObject<HTMLDivElement> | React.LegacyRef<HTMLDivElement>,
number
] {
const scrollRef = useRef<HTMLDivElement>(null);
const [scrollPercentage, setScrollPercentage] = useState(NaN);
const reportScroll = (e: any) => {
setScrollPercentage(getScrollPercentage(e.target));
};
useEffect(() => {
const node = scrollRef.current;
if (node !== null) {
node.addEventListener('scroll', reportScroll, { passive: true });
if (Number.isNaN(scrollPercentage)) {
setScrollPercentage(getScrollPercentage(node));
}
}
return () => {
if (node !== null) {
node.removeEventListener('scroll', reportScroll);
}
};
}, [scrollPercentage]);
return [scrollRef, Number.isNaN(scrollPercentage) ? 0 : scrollPercentage];
}
function getScrollPercentage(element: HTMLElement) {
if (element === null) {
return NaN;
}
const height = element.scrollHeight - element.clientHeight;
return Math.round((element.scrollTop / height) * 100);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment