UNPKG

@nutui/nutui-react

Version:

京东风格的轻量级移动端 React 组件库,支持一套代码生成 H5 和小程序

64 lines (63 loc) 1.98 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function _export(target, all) { for(var name in all)Object.defineProperty(target, name, { enumerable: true, get: all[name] }); } _export(exports, { getAllScrollableParents: function() { return getAllScrollableParents; }, getScrollParent: function() { return getScrollParent; } }); var _canusedom = require("./can-use-dom"); var defaultRoot = _canusedom.canUseDom ? window : undefined; var overflowStylePatterns = [ 'scroll', 'auto', 'overlay' ]; function isElement(node) { var ELEMENT_NODE_TYPE = 1; return node.nodeType === ELEMENT_NODE_TYPE; } function getScrollParent(el) { var root = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : defaultRoot; var node = el; while(node && node !== root && isElement(node)){ if (node === document.body) { return root; } var overflowY = window.getComputedStyle(node).overflowY; if (overflowStylePatterns.includes(overflowY) && node.scrollHeight > node.clientHeight) { return node; } node = node.parentNode; } return root; } function getAllScrollableParents(element) { var scrollableParents = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : []; if (!element) { return scrollableParents; } // 检查元素是否具有滚动条 var isScrollable = element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth; if (isScrollable) { // 如果当前元素具有滚动条,则将其添加到数组中 if (element.nodeName === 'HTML') { // @ts-ignore scrollableParents.push(document); } else { scrollableParents.push(element); } } // 递归检查父元素 return getAllScrollableParents(element.parentElement, scrollableParents); }