UNPKG

@morjs/runtime-web

Version:
67 lines 3.06 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const pulldown_api_1 = require("./pulldown-api"); function getTotalOffsetTop(element, root) { let totalOffsetTop = element.offsetTop; let parent = element.offsetParent; while (parent !== null && parent !== root) { totalOffsetTop += parent.offsetTop; parent = parent.offsetParent; } return totalOffsetTop; } exports.default = { pageScrollTo({ scrollTop, duration = 0, selector }) { return new Promise((resolve, reject) => { if (scrollTop < 0) { return reject('scrollTop 必须大于0'); } if (typeof scrollTop === 'undefined' && typeof selector === 'undefined') { return reject('缺少 scrollTop 或者 selector 参数,scrollTop 与 selector 必须传入一个'); } duration = Number.isNaN(Number(duration)) ? 0 : Math.max(0, Number(duration)); const page = (0, pulldown_api_1.getPage)(); const scrollSelector = page.shadowRoot.querySelector('.content'); const currentScrollTop = scrollSelector.scrollTop; // 滚动开始时的位置 let distance; if (selector) { const element = document.querySelector(selector); if (!element) return reject(`未找到选择器为 ${selector} 的元素,请确认元素是否存在`); distance = getTotalOffsetTop(element, scrollSelector) - currentScrollTop; } else { distance = scrollTop - currentScrollTop; // 一共需要滚动的距离 } if (duration === 0 && distance !== 0) { // 无duration,有滚动距离 requestAnimationFrame(() => { scrollSelector.scrollTo({ top: scrollTop, left: 0 }); }); return resolve(undefined); } else if (duration === 0 || distance === 0) { // 无duration 或 无滚动距离 return resolve(undefined); } const start = Date.now(); // 滚动开始时间 requestAnimationFrame(function doPageScroll() { const scrollingTime = Date.now() - start; const newScrollTop = (function (scrollingTime, currentScrollTop, distance, duration) { return (-distance * (scrollingTime /= duration) * (scrollingTime - 2) + currentScrollTop); })(scrollingTime, currentScrollTop, distance, duration); if (duration <= scrollingTime) { scrollSelector.scrollTo({ top: scrollTop, left: 0 }); return; } scrollSelector.scrollTo({ top: newScrollTop, left: 0 }); requestAnimationFrame(doPageScroll); }); resolve(undefined); }); } }; //# sourceMappingURL=pageScrollTo.js.map