zhangjian
2023-06-05 0976d2d0f90cff460cedfdc8bd74e98c2c31a58c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
function findScrollParents($el) {
  const $scrollParents = []
  let $parent = $el.parentNode
 
  while ($parent && $parent.nodeName !== 'BODY' && $parent.nodeType === document.ELEMENT_NODE) {
    if (isScrollElment($parent)) $scrollParents.push($parent)
    $parent = $parent.parentNode
  }
  $scrollParents.push(window)
 
  return $scrollParents
}
 
function isScrollElment($el) {
  // Firefox wants us to check `-x` and `-y` variations as well
  const { overflow, overflowX, overflowY } = getComputedStyle($el)
  return /(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)
}
 
export function setupResizeAndScrollEventListeners($el, listener) {
  const $scrollParents = findScrollParents($el)
 
  window.addEventListener('resize', listener, { passive: true })
  $scrollParents.forEach(scrollParent => {
    scrollParent.addEventListener('scroll', listener, { passive: true })
  })
 
  return function removeEventListeners() {
    window.removeEventListener('resize', listener, { passive: true })
    $scrollParents.forEach($scrollParent => {
      $scrollParent.removeEventListener('scroll', listener, { passive: true })
    })
  }
}