ten-design-vue
Version:
ten-vue
104 lines (80 loc) • 2.55 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getOffsetTop = getOffsetTop;
exports.scrollTo = scrollTo;
exports.sharpMatcherRegx = void 0;
function getScroll(target, top) {
if (typeof window === 'undefined') {
return 0;
}
var prop = top ? 'pageYOffset' : 'pageXOffset';
var method = top ? 'scrollTop' : 'scrollLeft';
var isWindow = target === window;
var ret = isWindow ? target[prop] : target[method]; // ie6,7,8 standard mode
if (isWindow && typeof ret !== 'number') {
ret = window.document.documentElement[method];
}
return ret;
}
function easeInOutCubic(t, b, c, d) {
var cc = c - b;
t /= d / 2;
if (t < 1) {
return cc / 2 * t * t * t + b; // eslint-disable-line
}
return cc / 2 * ((t -= 2) * t * t + 2) + b; // eslint-disable-line
}
function getOffsetTop(element, container) {
if (!element) {
return 0;
}
if (!element.getClientRects().length) {
return 0;
}
var rect = element.getBoundingClientRect();
if (rect.width || rect.height) {
if (container === window) {
container = element.ownerDocument.documentElement;
return rect.top - container.clientTop;
}
return rect.top - container.getBoundingClientRect().top;
}
return rect.top;
}
var sharpMatcherRegx = /#([^#]+)$/;
exports.sharpMatcherRegx = sharpMatcherRegx;
function scrollTo(href) {
var offsetTop = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
var container = arguments.length > 2 ? arguments[2] : undefined;
var callback = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : function () {};
var scrollTop = getScroll(container, true);
var sharpLinkMatch = sharpMatcherRegx.exec(href);
if (!sharpLinkMatch) {
return;
}
var targetElement = document.getElementById(sharpLinkMatch[1]);
if (!targetElement) {
return;
}
var eleOffsetTop = getOffsetTop(targetElement, container);
var targetScrollTop = scrollTop + eleOffsetTop - offsetTop;
var startTime = Date.now();
var frameFunc = function frameFunc() {
var timestamp = Date.now();
var time = timestamp - startTime;
var nextScrollTop = easeInOutCubic(time, scrollTop, targetScrollTop, 450);
if (container === window) {
window.scrollTo(window.pageXOffset, nextScrollTop);
} else {
container.scrollTop = nextScrollTop;
}
if (time < 450) {
window.requestAnimationFrame(frameFunc);
} else {
callback();
}
};
window.requestAnimationFrame(frameFunc);
}
;