/** * elementをparentのスクロールビューに入るようにスクロールする * parentがスクロール可能でなければelementが見えるようにスクロールする * * @param element * @param parent */ export function handleFocusByKeyBoard(element: Element, parent: HTMLElement) { const isScrollable = parent.scrollHeight > parent.clientHeight if (isScrollable) { const rect = element.getBoundingClientRect() const parentRect = parent.getBoundingClientRect() if (rect.bottom > parentRect.bottom) { parent.scrollTo({ top: parent.scrollTop + rect.bottom - parentRect.bottom, }) } else if (rect.top < parentRect.top) { parent.scrollTo({ top: parent.scrollTop - (parentRect.top - rect.top), }) } } else { scrollIfNeeded(element) } } /** * 要素が画面外にあればスクロールする、画面内にあればスクロールしない * @param element */ function scrollIfNeeded(element: Element) { const elementRect = element.getBoundingClientRect() const isVisible = elementRect.top >= 0 && elementRect.bottom <= (window.innerHeight || document.documentElement.clientHeight) if (!isVisible) { element.scrollIntoView({ block: 'nearest', }) } }