Skip to content

Commit d59950a

Browse files
feat: getScrollParent()
1 parent cd8cb81 commit d59950a

File tree

2 files changed

+32
-7
lines changed

2 files changed

+32
-7
lines changed

src/components/Tooltip/Tooltip.tsx

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ import classNames from 'classnames'
33
import debounce from 'utils/debounce'
44
import { useTooltip } from 'components/TooltipProvider'
55
import useIsomorphicLayoutEffect from 'utils/use-isomorphic-layout-effect'
6-
import { computeTooltipPosition } from '../../utils/compute-positions'
6+
import { getScrollParent } from 'utils/get-scroll-parent'
7+
import { computeTooltipPosition } from 'utils/compute-positions'
78
import styles from './styles.module.css'
89
import type { IPosition, ITooltip, PlacesType } from './TooltipTypes'
910

@@ -299,13 +300,13 @@ const Tooltip = ({
299300
handleShow(false)
300301
}
301302

302-
const tooltipParent = tooltipRef.current?.parentElement
303-
const anchorParent = activeAnchor?.parentElement
303+
const anchorScrollParent = getScrollParent(activeAnchor)
304+
const tooltipScrollParent = getScrollParent(tooltipRef.current)
304305

305306
if (closeOnScroll) {
306307
window.addEventListener('scroll', handleScrollResize)
307-
tooltipParent?.addEventListener('scroll', handleScrollResize)
308-
anchorParent?.addEventListener('scroll', handleScrollResize)
308+
anchorScrollParent?.addEventListener('scroll', handleScrollResize)
309+
tooltipScrollParent?.addEventListener('scroll', handleScrollResize)
309310
}
310311
if (closeOnResize) {
311312
window.addEventListener('resize', handleScrollResize)
@@ -364,8 +365,8 @@ const Tooltip = ({
364365
return () => {
365366
if (closeOnScroll) {
366367
window.removeEventListener('scroll', handleScrollResize)
367-
tooltipParent?.removeEventListener('scroll', handleScrollResize)
368-
anchorParent?.removeEventListener('scroll', handleScrollResize)
368+
anchorScrollParent?.removeEventListener('scroll', handleScrollResize)
369+
tooltipScrollParent?.removeEventListener('scroll', handleScrollResize)
369370
}
370371
if (closeOnResize) {
371372
window.removeEventListener('resize', handleScrollResize)

src/utils/get-scroll-parent.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
const isScrollable = (node: Element) => {
2+
if (!(node instanceof HTMLElement || node instanceof SVGElement)) {
3+
return null
4+
}
5+
const style = getComputedStyle(node)
6+
return ['overflow', 'overflow-x', 'overflow-y'].some((propertyName) => {
7+
const value = style.getPropertyValue(propertyName)
8+
return value === 'auto' || value === 'scroll'
9+
})
10+
}
11+
12+
export const getScrollParent = (node: Element | null) => {
13+
if (!node) {
14+
return null
15+
}
16+
let currentParent = node.parentElement
17+
while (currentParent) {
18+
if (isScrollable(currentParent)) {
19+
return currentParent
20+
}
21+
currentParent = currentParent.parentElement
22+
}
23+
return document.scrollingElement || document.documentElement
24+
}

0 commit comments

Comments
 (0)