autoscroll
Version:
A utility for auto-scroll when almost reach boundary
134 lines (108 loc) • 4.86 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _lodash = require('lodash.throttle');
var _lodash2 = _interopRequireDefault(_lodash);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var setup = function setup() {
var autoScrollCtrl = {};
var stopAutoScrolling = function stopAutoScrolling() {
var cancelAnimationFrame = window.cancelAnimationFrame || window.mozCancelAnimationFrame;
cancelAnimationFrame(autoScrollCtrl.pid);
};
var _autoScroll = function _autoScroll( /**Event*/evt, /**Object*/options, /**HTMLElement*/rootEl) {
var scrollParentEl = void 0;
var scrollEl = void 0;
// Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521
if (rootEl && options.scroll) {
var el = void 0;
var rect = void 0;
var sens = options.scrollSensitivity;
var speed = options.scrollSpeed;
var x = evt.clientX;
var y = evt.clientY;
var winWidth = window.innerWidth;
var winHeight = window.innerHeight;
var vx = void 0,
vy = void 0,
scrollOffsetX = void 0,
scrollOffsetY = void 0;
// Delect scrollEl
if (scrollParentEl !== rootEl) {
scrollEl = options.scroll;
scrollParentEl = rootEl;
if (scrollEl === true) {
scrollEl = rootEl;
do {
if (scrollEl.offsetWidth < scrollEl.scrollWidth) {
break;
}
if (scrollEl.offsetHeight < scrollEl.scrollHeight) {
break;
}
if (!scrollEl.parentNode) {
break;
}
scrollEl = scrollEl.parentNode;
} while (true);
}
}
if (scrollEl) {
el = scrollEl;
rect = scrollEl.getBoundingClientRect();
vx = (Math.abs(rect.right - x) <= sens) - (Math.abs(rect.left - x) <= sens);
vy = (Math.abs(rect.bottom - y) <= sens) - (Math.abs(rect.top - y) <= sens);
}
if (!(vx || vy)) {
vx = (winWidth - x <= sens) - (x <= sens);
vy = (winHeight - y <= sens) - (y <= sens);
if (vx || vy) {
el = window;
}
}
if (autoScrollCtrl.vx !== vx || autoScrollCtrl.vy !== vy || autoScrollCtrl.el !== el) {
autoScrollCtrl.el = el;
autoScrollCtrl.vx = vx;
autoScrollCtrl.vy = vy;
stopAutoScrolling(); // Stop any exist autoScrolling
if (el) {
var requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;
var scrolling = function scrolling() {
scrollOffsetY = vy ? vy * speed : 0;
scrollOffsetX = vx ? vx * speed : 0;
if (el === window) {
window.scrollTo(window.pageXOffset + scrollOffsetX, window.pageYOffset + scrollOffsetY);
} else {
el.scrollTop += scrollOffsetY;
el.scrollLeft += scrollOffsetX;
}
autoScrollCtrl.pid = requestAnimationFrame(scrolling);
};
autoScrollCtrl.pid = requestAnimationFrame(scrolling);
}
}
}
};
var throttleAutoScroll = (0, _lodash2.default)(_autoScroll, 30);
var run = function run( /**Event*/evt, /**HTMLElement*/rootEl) {
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var _options$scroll = options.scroll,
scroll = _options$scroll === undefined ? true : _options$scroll,
_options$scrollSensit = options.scrollSensitivity,
scrollSensitivity = _options$scrollSensit === undefined ? 30 : _options$scrollSensit,
_options$scrollSpeed = options.scrollSpeed,
scrollSpeed = _options$scrollSpeed === undefined ? 10 : _options$scrollSpeed;
var newOptions = {
scroll: scroll,
scrollSensitivity: scrollSensitivity,
scrollSpeed: scrollSpeed
};
throttleAutoScroll(evt, newOptions, rootEl);
};
return {
run: run,
end: stopAutoScrolling
};
};
exports.default = setup();