2019-07-11 19:51:59 +08:00
|
|
|
import getStyleComputedProperty from './getStyleComputedProperty'
|
|
|
|
import getParentNode from './getParentNode'
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the scrolling parent of the given element
|
|
|
|
* @method
|
|
|
|
* @param {Element} element
|
2019-07-24 23:53:02 +08:00
|
|
|
* @returns {Element|null} scroll parent
|
2019-07-11 19:51:59 +08:00
|
|
|
*/
|
|
|
|
export default function getScrollParent (element) {
|
|
|
|
// Return body, `getScroll` will take care to get the correct `scrollTop` from it
|
|
|
|
if (!element) {
|
2019-07-24 23:53:02 +08:00
|
|
|
return null
|
2019-07-11 19:51:59 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
switch (element.nodeName) {
|
|
|
|
case 'HTML':
|
|
|
|
case 'BODY':
|
2019-07-24 23:53:02 +08:00
|
|
|
return document
|
2019-07-11 19:51:59 +08:00
|
|
|
case '#document':
|
2019-07-24 23:53:02 +08:00
|
|
|
return null
|
2019-07-11 19:51:59 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// Firefox want us to check `-x` and `-y` variations as well
|
|
|
|
const { overflow, overflowX, overflowY } = getStyleComputedProperty(element)
|
|
|
|
if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {
|
|
|
|
return element
|
|
|
|
}
|
|
|
|
|
|
|
|
return getScrollParent(getParentNode(element))
|
|
|
|
}
|