vant
Version:
Mobile UI Components built on Vue
69 lines (57 loc) • 1.73 kB
JavaScript
function isWindow(val) {
return val === window;
} // get nearest scroll element
// https://github.com/youzan/vant/issues/3823
var overflowScrollReg = /scroll|auto/i;
export function getScroller(el, root) {
if (root === void 0) {
root = window;
}
var node = el;
while (node && node.tagName !== 'HTML' && node.tagName !== 'BODY' && node.nodeType === 1 && node !== root) {
var _window$getComputedSt = window.getComputedStyle(node),
overflowY = _window$getComputedSt.overflowY;
if (overflowScrollReg.test(overflowY)) {
return node;
}
node = node.parentNode;
}
return root;
}
export function getScrollTop(el) {
var top = 'scrollTop' in el ? el.scrollTop : el.pageYOffset; // iOS scroll bounce cause minus scrollTop
return Math.max(top, 0);
}
export function setScrollTop(el, value) {
if ('scrollTop' in el) {
el.scrollTop = value;
} else {
el.scrollTo(el.scrollX, value);
}
}
export function getRootScrollTop() {
return window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
}
export function setRootScrollTop(value) {
setScrollTop(window, value);
setScrollTop(document.body, value);
} // get distance from element top to page top or scroller top
export function getElementTop(el, scroller) {
if (isWindow(el)) {
return 0;
}
var scrollTop = scroller ? getScrollTop(scroller) : getRootScrollTop();
return el.getBoundingClientRect().top + scrollTop;
}
export function getVisibleHeight(el) {
if (isWindow(el)) {
return el.innerHeight;
}
return el.getBoundingClientRect().height;
}
export function getVisibleTop(el) {
if (isWindow(el)) {
return 0;
}
return el.getBoundingClientRect().top;
}