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 })
|
})
|
}
|
}
|