Skip to content

Commit 4e9c471

Browse files
feat: getScrollParent()
1 parent 026c7fa commit 4e9c471

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

@@ -302,13 +303,13 @@ const Tooltip = ({
302303
handleShow(false)
303304
}
304305

305-
const tooltipParent = tooltipRef.current?.parentElement
306-
const anchorParent = activeAnchor?.parentElement
306+
const anchorScrollParent = getScrollParent(activeAnchor)
307+
const tooltipScrollParent = getScrollParent(tooltipRef.current)
307308

308309
if (closeOnScroll) {
309310
window.addEventListener('scroll', handleScrollResize)
310-
tooltipParent?.addEventListener('scroll', handleScrollResize)
311-
anchorParent?.addEventListener('scroll', handleScrollResize)
311+
anchorScrollParent?.addEventListener('scroll', handleScrollResize)
312+
tooltipScrollParent?.addEventListener('scroll', handleScrollResize)
312313
}
313314
if (closeOnResize) {
314315
window.addEventListener('resize', handleScrollResize)
@@ -367,8 +368,8 @@ const Tooltip = ({
367368
return () => {
368369
if (closeOnScroll) {
369370
window.removeEventListener('scroll', handleScrollResize)
370-
tooltipParent?.removeEventListener('scroll', handleScrollResize)
371-
anchorParent?.removeEventListener('scroll', handleScrollResize)
371+
anchorScrollParent?.removeEventListener('scroll', handleScrollResize)
372+
tooltipScrollParent?.removeEventListener('scroll', handleScrollResize)
372373
}
373374
if (closeOnResize) {
374375
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)