smooth-scroll-to
Version:
80 lines (77 loc) • 2.17 kB
JavaScript
var _interopRequireDefault = require("reshow-runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports["default"] = void 0;
var _getScrollInfo = require("get-scroll-info");
var _callFunc = _interopRequireDefault(require("call-func"));
var _easingLib = require("easing-lib");
var _reshowConstant = require("reshow-constant");
// @ts-check
var isRunning = (0, _reshowConstant.NEW_OBJ)();
/**
* !!Important!! any logic change need take care isRunning
*
* @param {number} to
* @param {number} [duration]
* @param {HTMLElement} [el]
* @param {function} [callback]
* @param {string} [scrollKey]
* @returns {function} cancel handler
*/
var smoothScrollTo = function smoothScrollTo(to, duration, el, callback, scrollKey) {
if (duration === void 0) {
duration = 500;
}
if (scrollKey === void 0) {
scrollKey = "scrollTop";
}
var scrollNode = (0, _getScrollInfo.getScrollNode)(el);
var cb = function cb() {
if (isRunning[scrollKey]) {
(0, _callFunc["default"])(callback, [{
scrollNode: scrollNode,
from: from,
to: to,
go: go
}]);
isRunning[scrollKey] = false;
}
};
var cancel = function cancel() {
clearTimeout(isRunning[scrollKey]);
isRunning[scrollKey] = false;
};
if (isRunning[scrollKey]) {
clearTimeout(isRunning[scrollKey]);
isRunning[scrollKey] = setTimeout(function () {
scrollNode[scrollKey] = to;
cb();
});
return cancel;
}
var from = scrollNode[scrollKey];
var go = to - from;
if (!go) {
return function () {};
}
(0, _easingLib.aniTimer)({
isContinue: function isContinue( /**@type number*/elapsedTime) {
if (isRunning[scrollKey]) {
var progress = (0, _easingLib.easeInOutCubic)(elapsedTime, from, go, duration);
scrollNode[scrollKey] = progress;
return true;
}
},
cancel: function cancel() {
return cb();
},
done: function done() {
return cb();
}
}, duration);
isRunning[scrollKey] = true;
return cancel;
};
var _default = smoothScrollTo;
exports["default"] = _default;
module.exports = exports.default;
;