UNPKG

ten-design-vue

Version:

ten-vue

104 lines (80 loc) 2.55 kB
"use strict"; 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); }