UNPKG

overscroll

Version:
328 lines (275 loc) 8.83 kB
'use strict'; exports.__esModule = true; var _whatitis = require('whatitis'); var _whatitis2 = _interopRequireDefault(_whatitis); var _actions = require('./actions'); var _actions2 = _interopRequireDefault(_actions); var _dom = require('./utils/dom'); var _dom2 = _interopRequireDefault(_dom); var _domStates = require('./domStates'); var _domStates2 = _interopRequireDefault(_domStates); var _animations = require('./animations'); var _animations2 = _interopRequireDefault(_animations); var _getWindow = require('./utils/dom/getWindow'); var _getWindow2 = _interopRequireDefault(_getWindow); var _getDocument = require('./utils/dom/getDocument'); var _getDocument2 = _interopRequireDefault(_getDocument); var _handlers = require('./handlers'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var X = 'x'; var Y = 'y'; var XY = 'xy'; var xreg = /x/i; var yreg = /y/i; var OVERSCROLL = 'OverScroll'; var OVERSCROLLX = 'OverScrollX'; var OVERSCROLLY = 'OverScrollY'; var BUBBLE = 'bubble'; var NOBUBBLE = 'noBubble'; function hasX(axis) { return xreg.test(axis); } function hasY(axis) { return yreg.test(axis); } function hasXY(axis) { return hasX(axis) && hasY(axis); } function getAxis() { var axis = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : XY; if (hasXY(axis)) { return XY; } else if (hasX(axis)) { return X; } return Y; } var getScrollByAxis = function getScrollByAxis(_ref) { var target = _ref.target, axis = _ref.axis, win = _ref.win, html = _ref.html, body = _ref.body, isPageScroll = _ref.isPageScroll; return function () { // CSS1Compat 标准模式 BackCompat 混杂模式 // const isCSS1Compat = doc.compatMode === 'CSS1Compat'; var scrollX = function scrollX() { return !isPageScroll ? target.scrollLeft : _whatitis2['default'].Defined(win.pageXOffset) ? win.pageXOffset : Math.max(html.scrollLeft, body.scrollLeft); }; var scrollY = function scrollY() { return !isPageScroll ? target.scrollTop : _whatitis2['default'].Defined(win.pageYOffset) ? win.pageYOffset : Math.max(html.scrollTop, body.scrollTop); }; if (hasXY(axis)) { return { top: scrollY(), left: scrollX() }; } else if (hasX(axis)) { return { top: 0, left: scrollX() }; } return { top: scrollY(), left: 0 }; }; }; var defaultOptions = { axis: XY, prefix: OVERSCROLL, thumbMiniSize: 20, // show: true, // showX: true, // showY: true, target: null, watchInterval: 100, watch: null, onInit: null, onScroll: null, onBeforeScroll: null, onAfterScroll: null, onDestroy: null, // getContainer: null, isPageScroll: false, // 判断是否是页面滚动 mode: 'scroll', // 'section' anchors: null, switchScale: [0.2, 0.2], // [往上拉的距离比例,往下拉的距离比例] position: [0, 0], bubble: true, // 让父级的滚动可以触发 dragable: true, // pointerType === 'mouse' 的开关 touchable: true // pointerType === 'touch' 的开关 }; function getOptions() { var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, axis = _ref2.axis, prefix = _ref2.prefix, target = _ref2.target, watchInterval = _ref2.watchInterval, watch = _ref2.watch, onInit = _ref2.onInit, onScroll = _ref2.onScroll, onBeforeScroll = _ref2.onBeforeScroll, onAfterScroll = _ref2.onAfterScroll, onDestroy = _ref2.onDestroy, mode = _ref2.mode, anchors = _ref2.anchors, switchScale = _ref2.switchScale, position = _ref2.position, bubble = _ref2.bubble, dragable = _ref2.dragable, touchable = _ref2.touchable; var options = Object.assign({}, defaultOptions); var doc = (0, _getDocument2['default'])(target); var win = (0, _getWindow2['default'])(doc); var body = doc.body; var html = doc.documentElement; // 滚动容器 if (_whatitis2['default'].Undefined(target) || [html, body].includes(target)) { options.target = doc.scrollingElement || body; options.isPageScroll = true; } else { options.target = target; } // 元素装载容器 // if ( target === html ) { // // options.container = options.target === html ? body : options.target; // options.target = body; // } else { // options.target = target; // } // container => containerX containerY // if ( is.Function( getContainer )) { // const container = getContainer(); // if ( is.Element( container )) { // options.containerX = container; // options.containerY = container; // } else { // const { x, y, X, Y } = container; // options.containerX = x || X; // options.containerY = y || Y || options.containerX; // } // } else { // options.containerX = options.container; // options.containerY = options.containerX; // } // 滚动条 计算 // axis => scrollX scrollY options.axis = getAxis(axis); options.scrollX = hasX(options.axis); options.scrollY = hasY(options.axis); // 滚动条 显示/隐藏 // show => showX showY // options.show = show !== false; // options.showX = options.show && showX !== false; // options.showY = options.show && showY !== false; // 样式前缀 prefix if (_whatitis2['default'].String(prefix)) { options.prefix = prefix; } // 事件 if (_whatitis2['default'].Function(onInit)) { options.onInit = onInit; } // onScroll( scrollTop, scrollLeft ) if (_whatitis2['default'].Function(onScroll)) { options.onScroll = onScroll; } if (_whatitis2['default'].Function(onBeforeScroll)) { options.onBeforeScroll = onBeforeScroll; } if (_whatitis2['default'].Function(onAfterScroll)) { options.onAfterScroll = onAfterScroll; } if (_whatitis2['default'].Function(onDestroy)) { options.onDestroy = onDestroy; } if (_whatitis2['default'].Function(watch)) { options.watch = watch; if (_whatitis2['default'].Number(watchInterval) && watchInterval > 50) { options.watchInterval = watchInterval; } } if (_whatitis2['default'].Array(position) && position.every(_whatitis2['default'].Number)) { options.position = position; } if (mode === 'section') { options.mode = mode; options.axis = hasY(options.axis) ? Y : X; options.scrollX = options.axis === X; options.scrollY = options.axis === Y; options.position = _whatitis2['default'].Number(position) ? position : 1; if (_whatitis2['default'].Array(anchors) && anchors.every(_whatitis2['default'].Element)) { options.anchors = anchors; } else { options.anchors = Array.prototype.slice.call(target.children); } if (_whatitis2['default'].String(switchScale) && /^\d*$/.test(switchScale)) { switchScale = [parseFloat(switchScale), parseFloat(switchScale)]; } if (_whatitis2['default'].Number(switchScale)) { switchScale = [switchScale, switchScale]; } if (_whatitis2['default'].Array(switchScale) && anchors.every(function (num) { return _whatitis2['default'].Number(num) && num <= 1 && num >= 0; })) { options.switchScale = [].concat(switchScale); } } // 设置当前滚动区间是否冒泡事件 if (bubble === false) { options.bubble = bubble; } // 鼠标拖动开关 if (dragable === false) { options.dragable = dragable; } // 触摸开关 if (touchable === false) { options.touchable = touchable; } return Object.assign(options, { body: body, html: html, doc: doc, win: win }); } exports['default'] = function (options) { var overscroll = { scrollTop: 0, scrollLeft: 0, scrollHeight: 0, scrollWidth: 0, clientHeight: 0, clientWidth: 0, section: 1, scrolling: false }; var scope = { X: X, Y: Y, XY: XY, xreg: xreg, yreg: yreg, hasX: hasX, hasY: hasY, hasXY: hasXY, OVERSCROLL: OVERSCROLL, OVERSCROLLX: OVERSCROLLX, OVERSCROLLY: OVERSCROLLY, BUBBLE: BUBBLE, NOBUBBLE: NOBUBBLE, overscroll: overscroll }; Object.assign(scope, getOptions(options)); Object.assign(scope, (0, _dom2['default'])(scope), { getScroll: getScrollByAxis(scope), handleDestroy: (0, _handlers.handleDestroy)(scope), handleBeforeScroll: (0, _handlers.handleBeforeScroll)(scope), handleAfterScroll: (0, _handlers.handleAfterScroll)(scope), handleScroll: (0, _handlers.handleScroll)(scope), handleInit: (0, _handlers.handleInit)(scope) }); Object.assign(scope, (0, _domStates2['default'])(scope)); Object.assign(scope, (0, _actions2['default'])(scope)); Object.assign(scope, (0, _animations2['default'])(scope)); return scope; };