overscroll
Version:
328 lines (275 loc) • 8.83 kB
JavaScript
;
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;
};