UNPKG

braid-design-system

Version:
36 lines (31 loc) 1.1 kB
import { useEffect } from 'react'; export function useScrollIntoView( element: HTMLElement | null, scrollContainer: HTMLElement | null, ) { useEffect(() => { if (scrollContainer && element) { const itemOffsetRelativeToContainer = element.offsetParent === scrollContainer ? element.offsetTop : element.offsetTop - scrollContainer.offsetTop; let { scrollTop } = scrollContainer; // Top of the visible area if (itemOffsetRelativeToContainer < scrollTop) { // Item is off the top of the visible area scrollTop = itemOffsetRelativeToContainer; } else if ( itemOffsetRelativeToContainer + element.offsetHeight > scrollTop + scrollContainer.offsetHeight ) { // Item is off the bottom of the visible area scrollTop = itemOffsetRelativeToContainer + element.offsetHeight - scrollContainer.offsetHeight; } if (scrollTop !== scrollContainer.scrollTop) { scrollContainer.scrollTop = scrollTop; } } }, [scrollContainer, element]); }