UNPKG

autoscroll

Version:

A utility for auto-scroll when almost reach boundary

134 lines (108 loc) 4.86 kB
'use strict'; 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();