version 1.5.2

This commit is contained in:
Rene
2018-09-09 14:14:21 +02:00
parent 793f607fb3
commit aba6cc5426
8 changed files with 412 additions and 419 deletions
+5 -4
View File
@@ -39,10 +39,10 @@ It was tested with the jQuery versions: 1.9.1, 2.x, 3.x, and it won't work with
Download OverlayScrollbars manually from [Releases](https://github.com/KingSora/OverlayScrollbars/releases).
#### cdn
You can also use OverlayScrollbars via a [cdn](https://cdnjs.com/libraries/overlayscrollbars).
You can use OverlayScrollbars via a [cdn](https://cdnjs.com/libraries/overlayscrollbars).
#### npm
OverlayScrollbars can be also downloaded from [npm](https://www.npmjs.com/package/overlayscrollbars).
OverlayScrollbars can be downloaded from [npm](https://www.npmjs.com/package/overlayscrollbars).
```
npm install overlayscrollbars
@@ -97,7 +97,7 @@ $(function() {
## Options
Due to clarity i can't provide all informations here.
Due to clarity I can't provide all informations here.
Take the table below only as a overview of all options.
[Please read the much more detailed documentation](https://kingsora.github.io/OverlayScrollbars/#!documentation).
@@ -594,7 +594,8 @@ var extensionObjects = OverlayScrollbars.extension();</pre>
## Future Plans
- Minimize the code as much as possible.
- Frequent updates in terms of bugsfixes and enhancements.
- Frequent updates in terms of bug-fixes and enhancements.
- Versions for frameworks like React, Vue and Angular.
## License
+2 -2
View File
@@ -2,13 +2,13 @@
* OverlayScrollbars
* https://github.com/KingSora/OverlayScrollbars
*
* Version: 1.5.1
* Version: 1.5.2
*
* Copyright KingSora.
* https://github.com/KingSora
*
* Released under the MIT license.
* Date: 13.07.2018
* Date: 09.09.2018
*/
/*
+2 -2
View File
File diff suppressed because one or more lines are too long
+200 -204
View File
@@ -2,13 +2,13 @@
* OverlayScrollbars
* https://github.com/KingSora/OverlayScrollbars
*
* Version: 1.5.1
* Version: 1.5.2
*
* Copyright KingSora.
* https://github.com/KingSora
*
* Released under the MIT license.
* Date: 13.07.2018
* Date: 09.09.2018
*/
(function (global, factory) {
@@ -41,6 +41,7 @@
s : 'style',
i : 'id',
l : 'length',
p : 'prototype',
oH : 'offsetHeight',
cH : 'clientHeight',
sH : 'scrollHeight',
@@ -212,14 +213,14 @@
// internal IsCallable function
//throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
}
var aArgs = Array.prototype.slice.call(arguments, 2);
var proto = LEXICON.p;
var aArgs = Array[proto].slice.call(arguments, 2);
var fNOP = function() {};
var fBound = function() { return func.apply(this instanceof fNOP ? this : thisObj, aArgs.concat(Array.prototype.slice.call(arguments))); };
var fBound = function() { return func.apply(this instanceof fNOP ? this : thisObj, aArgs.concat(Array[proto].slice.call(arguments))); };
if (func.prototype)
fNOP.prototype = func.prototype; // Function.prototype doesn't have a prototype property
fBound.prototype = new fNOP();
if (func[proto])
fNOP[proto] = func[proto]; // Function.prototype doesn't have a prototype property
fBound[proto] = new fNOP();
return fBound;
}
@@ -228,7 +229,7 @@
var JQUERY = window.jQuery;
var FRAMEWORK = (function(compatibility) {
var _rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
var _toStr = Object.prototype.toString;
var _toStr = Object[LEXICON.p].toString;
var _strSpace = ' ';
var _strEmpty = '';
var _strScrollLeft = 'scrollLeft';
@@ -482,9 +483,10 @@
return false;
var key;
var hasOwnProperty = Object.prototype.hasOwnProperty;
var proto = LEXICON.p;
var hasOwnProperty = Object[proto].hasOwnProperty;
var hasOwnConstructor = hasOwnProperty.call(obj, 'constructor');
var hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwnProperty.call(obj.constructor.prototype, 'isPrototypeOf');
var hasIsPrototypeOf = obj.constructor && obj.constructor[proto] && hasOwnProperty.call(obj.constructor[proto], 'isPrototypeOf');
if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {
return false;
@@ -797,7 +799,7 @@
}
}
FakejQuery.prototype = {
FakejQuery[LEXICON.p] = {
//EVENTS:
@@ -1343,10 +1345,11 @@
var restrictedStringsSplit = " ";
var restrictedStringsPossibilitiesSplit = ":";
var classNameAllowedValues = [TYPES.z, TYPES.s];
var booleanAllowedValues = TYPES.b;
var numberAllowedValues = TYPES.n;
var booleanNullAllowedValues = [TYPES.z, booleanAllowedValues];
var callbackAllowedValues = [TYPES.z, TYPES.f];
var booleanNullAllowedValues = [TYPES.z, TYPES.b];
var booleanTrueTemplate = [true, TYPES.b];
var booleanFalseTemplate = [false, TYPES.b];
var callbackTemplate = [null, [TYPES.z, TYPES.f]];
var resizeAllowedValues = 'n:none b:both h:horizontal v:vertical';
var overflowBehaviorAllowedValues = 'v-h:visible-hidden v-s:visible-scroll s:scroll h:hidden';
var scrollbarsVisibilityAllowedValues = 'v:visible h:hidden a:auto';
@@ -1354,15 +1357,15 @@
var optionsDefaultsAndTemplate = {
className: ['os-theme-dark', classNameAllowedValues], //null || string
resize: ['none', resizeAllowedValues], //none || both || horizontal || vertical || n || b || h || v
sizeAutoCapable: [true, booleanAllowedValues], //true || false
clipAlways: [true, booleanAllowedValues], //true || false
normalizeRTL: [true, booleanAllowedValues], //true || false
paddingAbsolute: [false, booleanAllowedValues], //true || false
sizeAutoCapable: booleanTrueTemplate, //true || false
clipAlways: booleanTrueTemplate, //true || false
normalizeRTL: booleanTrueTemplate, //true || false
paddingAbsolute: booleanFalseTemplate, //true || false
autoUpdate: [null, booleanNullAllowedValues], //true || false || null
autoUpdateInterval: [33, numberAllowedValues], //number
nativeScrollbarsOverlaid: {
showNativeScrollbars: [false, booleanAllowedValues], //true || false
initialize: [true, booleanAllowedValues] //true || false
showNativeScrollbars: booleanFalseTemplate, //true || false
initialize: booleanTrueTemplate //true || false
},
overflowBehavior: {
x: ['scroll', overflowBehaviorAllowedValues], //visible-hidden || visible-scroll || hidden || scroll || v-h || v-s || h || s
@@ -1372,27 +1375,27 @@
visibility: ['auto', scrollbarsVisibilityAllowedValues], //visible || hidden || auto || v || h || a
autoHide: ['never', scrollbarsAutoHideAllowedValues], //never || scroll || leave || move || n || s || l || m
autoHideDelay: [800, numberAllowedValues], //number
dragScrolling: [true, booleanAllowedValues], //true || false
clickScrolling: [false, booleanAllowedValues], //true || false
touchSupport: [true, booleanAllowedValues] //true || false
dragScrolling: booleanTrueTemplate, //true || false
clickScrolling: booleanFalseTemplate, //true || false
touchSupport: booleanTrueTemplate //true || false
},
textarea: {
dynWidth: [false, booleanAllowedValues], //true || false
dynHeight: [false, booleanAllowedValues] //true || false
dynWidth: booleanFalseTemplate, //true || false
dynHeight: booleanFalseTemplate //true || false
},
callbacks: {
onInitialized: [null, callbackAllowedValues], //null || function
onInitializationWithdrawn: [null, callbackAllowedValues], //null || function
onDestroyed: [null, callbackAllowedValues], //null || function
onScrollStart: [null, callbackAllowedValues], //null || function
onScroll: [null, callbackAllowedValues], //null || function
onScrollStop: [null, callbackAllowedValues], //null || function
onOverflowChanged: [null, callbackAllowedValues], //null || function
onOverflowAmountChanged: [null, callbackAllowedValues], //null || function
onDirectionChanged: [null, callbackAllowedValues], //null || function
onContentSizeChanged: [null, callbackAllowedValues], //null || function
onHostSizeChanged: [null, callbackAllowedValues], //null || function
onUpdated: [null, callbackAllowedValues] //null || function
onInitialized: callbackTemplate, //null || function
onInitializationWithdrawn: callbackTemplate, //null || function
onDestroyed: callbackTemplate, //null || function
onScrollStart: callbackTemplate, //null || function
onScroll: callbackTemplate, //null || function
onScrollStop: callbackTemplate, //null || function
onOverflowChanged: callbackTemplate, //null || function
onOverflowAmountChanged: callbackTemplate, //null || function
onDirectionChanged: callbackTemplate, //null || function
onContentSizeChanged: callbackTemplate, //null || function
onHostSizeChanged: callbackTemplate, //null || function
onUpdated: callbackTemplate //null || function
}
};
var convert = function(template) {
@@ -1551,11 +1554,8 @@
var scrollbarDummyElement = framework('<div id="hs-dummy-scrollbar-size"><div style="height: 200%; width: 200%; margin: 10px 0;"></div></div>');
var scrollbarDummyElement0 = scrollbarDummyElement[0];
var dummyContainerChild = framework(scrollbarDummyElement.children('div').eq(0));
var IEBUGFIX = scrollbarDummyElement0[LEXICON.oH]; //IE9 causes a bug where offsetHeight is zero for no reason
bodyElement.append(scrollbarDummyElement);
if(IEBUGFIX === 0)
scrollbarDummyElement.hide().show();
var nativeScrollbarSize = calcNativeScrollbarSize(scrollbarDummyElement0);
var nativeScrollbarIsOverlaid = {
@@ -1674,18 +1674,7 @@
if(nativeScrollbarIsOverlaid.x && nativeScrollbarIsOverlaid.y)
return;
function differenceIsBiggerThanOne(valOne, valTwo) {
var absValOne = Math.abs(valOne);
var absValTwo = Math.abs(valTwo);
return !(absValOne === absValTwo || absValOne + 1 === absValTwo || absValOne - 1 === absValTwo);
}
function getWindowDPR() {
var dDPI = window.screen.deviceXDPI || 0;
var sDPI = window.screen.logicalXDPI || 1;
return window.devicePixelRatio || (dDPI / sDPI);
}
var abs = Math.abs;
var windowWidth = compatibility.wW();
var windowHeight = compatibility.wH();
var windowDpr = getWindowDPR();
@@ -1701,10 +1690,10 @@
var deltaWRatio = Math.round(newW / (windowWidth / 100.0));
var deltaHRatio = Math.round(newH / (windowHeight / 100.0));
var absDeltaW = Math.abs(deltaW);
var absDeltaH = Math.abs(deltaH);
var absDeltaWRatio = Math.abs(deltaWRatio);
var absDeltaHRatio = Math.abs(deltaHRatio);
var absDeltaW = abs(deltaW);
var absDeltaH = abs(deltaH);
var absDeltaWRatio = abs(deltaWRatio);
var absDeltaHRatio = abs(deltaHRatio);
var newDPR = getWindowDPR();
var deltaIsBigger = absDeltaW > 2 && absDeltaH > 2;
@@ -1731,6 +1720,19 @@
windowDpr = newDPR;
}
};
function differenceIsBiggerThanOne(valOne, valTwo) {
var absValOne = abs(valOne);
var absValTwo = abs(valTwo);
return !(absValOne === absValTwo || absValOne + 1 === absValTwo || absValOne - 1 === absValTwo);
}
function getWindowDPR() {
var dDPI = window.screen.deviceXDPI || 0;
var sDPI = window.screen.logicalXDPI || 1;
return window.devicePixelRatio || (dDPI / sDPI);
}
framework(window).on('resize', onResize);
})();
@@ -1774,6 +1776,7 @@
var _base = this;
var _strAutoUpdate = 'autoUpdate';
var _strAutoUpdateInterval = _strAutoUpdate + 'Interval';
var _strLength = LEXICON.l;
var _loopingInstances = [ ];
var _loopingInstancesIntervalCache = [ ];
@@ -1787,7 +1790,7 @@
* The auto update loop which will run every 50 milliseconds or less if the update interval of a instance is lower than 50 milliseconds.
*/
var loop = function() {
if(_loopingInstances.length > 0 && _loopIsActive) {
if(_loopingInstances[_strLength] > 0 && _loopIsActive) {
_loopID = compatibility.rAF()(function () {
loop();
});
@@ -1797,7 +1800,7 @@
if (timeDelta > _loopInterval) {
_loopTimeOld = timeNew - (timeDelta % _loopInterval);
var lowestInterval = _loopIntervalDefault;
for(var i = 0; i < _loopingInstances.length; i++) {
for(var i = 0; i < _loopingInstances[_strLength]; i++) {
var instance = _loopingInstances[i];
if (instance !== undefined) {
var instanceOptions = instance.options();
@@ -1826,7 +1829,7 @@
if(framework.inArray(instance, _loopingInstances) === -1) {
_loopingInstances.push(instance);
_loopingInstancesIntervalCache.push(compatibility.now());
if (_loopingInstances.length > 0 && !_loopIsActive) {
if (_loopingInstances[_strLength] > 0 && !_loopIsActive) {
_loopIsActive = true;
globals.autoUpdateLoop = _loopIsActive;
loop();
@@ -1846,7 +1849,7 @@
_loopingInstances.splice(index, 1);
//correct update loop behavior
if (_loopingInstances.length === 0 && _loopIsActive) {
if (_loopingInstances[_strLength] === 0 && _loopIsActive) {
_loopIsActive = false;
globals.autoUpdateLoop = _loopIsActive;
if(_loopID !== undefined) {
@@ -1882,6 +1885,7 @@
//make correct instanceof
var _base = new window[PLUGINNAME]();
var _frameworkProto = framework[LEXICON.p];
//globals:
var _nativeScrollbarIsOverlaid;
@@ -3041,14 +3045,16 @@
* @param hostSizeChanged True if this method was called due to a host size change.
* @param contentSizeChanged True if this method was called due to a content size change.
* @param force True if every property shall be updated and the cache shall be ignored.
* @param preventSwallowing True if this method shall be executed event if it could be swallowed.
*/
function update(hostSizeChanged, contentSizeChanged, force) {
function update(hostSizeChanged, contentSizeChanged, force, preventSwallowing) {
var now = compatibility.now();
var swallow = _swallowUpdateLag > 0 && _initialized && (now - _lastUpdateTime) < _swallowUpdateLag && (!_heightAutoCache && !_widthAutoCache);
var swallow = _swallowUpdateLag > 0 && _initialized && (now - _lastUpdateTime) < _swallowUpdateLag && (!_heightAutoCache && !_widthAutoCache) && !preventSwallowing;
var displayIsHidden = _hostElement.is(':hidden');
var displayIsHiddenChanged = checkCacheSingle(displayIsHidden, _displayIsHiddenCache, force);
_displayIsHiddenCache = displayIsHidden;
clearTimeout(_swallowedUpdateTimeout);
if (swallow) {
_swallowedUpdateParams.h = hostSizeChanged;
_swallowedUpdateParams.c = contentSizeChanged;
@@ -3097,7 +3103,6 @@
freezeResizeObserver(_sizeObserverElement);
freezeResizeObserver(_sizeAutoObserverElement);
//save current scroll offset
var currScroll = {
l: _viewportElement[_strScrollLeft](),
@@ -3160,7 +3165,7 @@
//dynWidth:
var textareaDynWidth = currentPreparedOptionsTextarea.dynWidth;
var textareaDynWidthChanged = checkCacheSingle(_textareaDynWidthCache, textareaDynHeight);
var textareaDynWidthChanged = checkCacheSingle(_textareaDynWidthCache, textareaDynWidth);
//dynHeight:
var textareaDynHeight = currentPreparedOptionsTextarea.dynHeight;
@@ -3209,6 +3214,7 @@
_overflowBehaviorCache = extend(true, {}, overflowBehavior);
_textareaDynWidthCache = textareaDynWidth;
_textareaDynHeightCache = textareaDynHeight;
_hasOverflowCache = _hasOverflowCache || { x: false, y: false };
//set correct class name to the host element
if (classNameChanged) {
@@ -3382,8 +3388,10 @@
//set info for padding
_paddingX = padding.l + padding.r;
_paddingY = padding.t + padding.b;
padding.ax = paddingAbsolute ? _paddingX : 0;
padding.ay = paddingAbsolute ? _paddingY : 0;
padding.c = checkCacheTRBL(padding, _cssPaddingCache);
//set info for border
_borderX = border.l + border.r;
_borderY = border.t + border.b;
@@ -3451,22 +3459,24 @@
if (heightAuto && (heightAutoChanged || paddingAbsoluteChanged || boxSizingChanged || cssMaxValue.c || padding.c || border.c)) {
if (cssMaxValue.cw)
contentElementCSS[_strMaxMinus + _strHeight] =
(cssMaxValue.ch ? (cssMaxValue.ih - (paddingAbsolute ? _paddingY : 0) +
(_isBorderBox ? -_borderY : _paddingY)) : _strEmpty);
(cssMaxValue.ch ? (cssMaxValue.ih - padding.ay + (_isBorderBox ? -_borderY : _paddingY))
: _strEmpty);
contentElementCSS[_strHeight] = _strAuto;
} else if (heightAutoChanged || paddingAbsoluteChanged) {
}
else if (heightAutoChanged || paddingAbsoluteChanged) {
contentElementCSS[_strMaxMinus + _strHeight] = _strEmpty;
contentElementCSS[_strHeight] = _strHundredPercent;
}
if (widthAuto && (widthAutoChanged || paddingAbsoluteChanged || boxSizingChanged || cssMaxValue.c || padding.c || border.c || cssDirectionChanged)) {
if (cssMaxValue.cw)
contentElementCSS[_strMaxMinus + _strWidth] =
(cssMaxValue.cw ? (cssMaxValue.iw - (paddingAbsolute ? _paddingX : 0) +
(_isBorderBox ? -_borderX : _paddingX)) +
(_nativeScrollbarIsOverlaid.y /*&& _hasOverflowCache.y && widthAuto */ ? _overlayScrollbarDummySize.y : 0) : _strEmpty);
(cssMaxValue.cw ? (cssMaxValue.iw - padding.ax + (_isBorderBox ? -_borderX : _paddingX)) +
(_nativeScrollbarIsOverlaid.y /*&& _hasOverflowCache.y && widthAuto */ ? _overlayScrollbarDummySize.y : 0)
: _strEmpty);
contentElementCSS[_strWidth] = _strAuto;
contentGlueElementCSS[_strMaxMinus + _strWidth] = _strHundredPercent; //IE Fix
} else if (widthAutoChanged || paddingAbsoluteChanged) {
}
else if (widthAutoChanged || paddingAbsoluteChanged) {
contentElementCSS[_strMaxMinus + _strWidth] = _strEmpty;
contentElementCSS[_strWidth] = _strHundredPercent;
contentElementCSS[_strFloat] = _strEmpty;
@@ -3491,14 +3501,12 @@
_contentGlueElement.css(contentGlueElementCSS);
_contentElement.css(contentElementCSS);
//CHECKPOINT HERE ~
contentElementCSS = {};
contentGlueElementCSS = {};
_hasOverflowCache = _hasOverflowCache || {x: false, y: false};
//if [content(host) client / scroll size, or target element direction, or content(host) max-sizes] changed, or force is true
if (hostSizeChanged || contentSizeChanged || cssDirectionChanged || boxSizingChanged || paddingAbsoluteChanged || widthAutoChanged || widthAuto || heightAutoChanged || heightAuto || cssMaxValue.c || ignoreOverlayScrollbarHidingChanged || overflowBehaviorChanged || clipAlwaysChanged || resizeChanged || scrollbarsVisibilityChanged || textareaDynWidthChanged || textareaDynHeightChanged || textareaAutoWrappingChanged || paddingAbsoluteChanged || textareaDynWidthChanged || textareaDynHeightChanged || force) {
if (hostSizeChanged || contentSizeChanged || cssDirectionChanged || boxSizingChanged || paddingAbsoluteChanged || widthAutoChanged || widthAuto || heightAutoChanged || heightAuto || cssMaxValue.c || ignoreOverlayScrollbarHidingChanged || overflowBehaviorChanged || clipAlwaysChanged || resizeChanged || scrollbarsVisibilityChanged || textareaDynWidthChanged || textareaDynHeightChanged || textareaAutoWrappingChanged || force) {
var strOverflow = 'overflow';
var strOverflowX = strOverflow + '-x';
var strOverflowY = strOverflow + '-y';
@@ -3554,8 +3562,8 @@
h: hostElement[LEXICON.cH]
};
var contentGlueSize = {
w: Math.max(contentClientSize.w + (paddingAbsolute ? _paddingX : 0), hostSize.w - _paddingX) - (textareaDynWidth ? (_isTextarea && widthAuto ? _marginX + (!_isBorderBox ? _paddingX + _borderX : 0) : 0) : 0),
h: Math.max(contentClientSize.h + (paddingAbsolute ? _paddingY : 0), hostSize.h - _paddingY)
w: Math.max(contentClientSize.w + padding.ax, hostSize.w - _paddingX) - (textareaDynWidth ? (_isTextarea && widthAuto ? _marginX + (!_isBorderBox ? _paddingX + _borderX : 0) : 0) : 0),
h: Math.max(contentClientSize.h + padding.ay, hostSize.h - _paddingY)
};
contentGlueSize.c = checkCacheDouble(contentGlueSize, _contentGlueSizeCache, force);
_contentGlueSizeCache = contentGlueSize;
@@ -3661,8 +3669,8 @@
* };
*/
var overflowAmount = {
x: Math.max(0, Math.round((contentScrollSize.w - hostSize.w + (paddingAbsolute ? _paddingX : 0)) * 100) / 100),
y: Math.max(0, Math.round((contentScrollSize.h - hostSize.h + (paddingAbsolute ? _paddingY : 0)) * 100) / 100)
x: Math.max(0, Math.round((contentScrollSize.w - hostSize.w + padding.ax) * 100) / 100),
y: Math.max(0, Math.round((contentScrollSize.h - hostSize.h + padding.ay) * 100) / 100)
};
var hideOverflowForceTextarea = _isTextarea && (_viewportSize.w === 0 || _viewportSize.h === 0);
if (hideOverflowForceTextarea) {
@@ -4104,13 +4112,13 @@
}
//fix body min size
if (_isBody && (hasOverflow.c || _bodyMinSizeCache.c)) {
if (_isBody && (_hasOverflowCache.c || _bodyMinSizeCache.c)) {
//its possible that no min size was measured until now, because the content arrange element was just added now, in this case, measure now the min size.
if (!_bodyMinSizeCache.f)
bodyMinSizeChanged();
if (_nativeScrollbarIsOverlaid.y && hasOverflow.x)
if (_nativeScrollbarIsOverlaid.y && _hasOverflowCache.x)
_contentElement.css(_strMinMinus + _strWidth, _bodyMinSizeCache.w + _overlayScrollbarDummySize.y);
if (_nativeScrollbarIsOverlaid.x && hasOverflow.y)
if (_nativeScrollbarIsOverlaid.x && _hasOverflowCache.y)
_contentElement.css(_strMinMinus + _strHeight, _bodyMinSizeCache.h + _overlayScrollbarDummySize.x);
_bodyMinSizeCache.c = false;
}
@@ -4182,25 +4190,45 @@
*/
function initScrollbarInteractivity(isHorizontal) {
var scrollbarVars = getScrollbarVars(isHorizontal);
var insideIFrame = _windowElement.top !== _windowElement;
var mouseDownScroll;
var mouseDownOffset;
var xy = scrollbarVars.xy;
var XY = scrollbarVars.XY;
var scroll = _strScroll + scrollbarVars.LT;
var strActive = 'active';
var trackTimeout;
var scrollDurationFactor = 1;
var increaseDecreaseScrollAmountKeyCodes = [ 16, 17 ]; //shift, ctrl
var increaseTrackScrollAmount = function () {
function increaseTrackScrollAmount() {
scrollDurationFactor = 0.5;
};
var decreaseTrackScrollAmount = function () {
function decreaseTrackScrollAmount() {
scrollDurationFactor = 1;
};
var handleDragMove = function (event) {
function documentKeyDown(event) {
if (framework.inArray(event.keyCode, increaseDecreaseScrollAmountKeyCodes) > -1)
increaseTrackScrollAmount();
};
function documentKeyUp(event) {
if (framework.inArray(event.keyCode, increaseDecreaseScrollAmountKeyCodes) > -1)
decreaseTrackScrollAmount();
};
function onMouseTouchDownContinue(event) {
var originalEvent = event.originalEvent || event;
var isTouchEvent = originalEvent.touches !== undefined;
return _isSleeping || nativeOverlayScrollbarsAreActive() || !_scrollbarsDragScrollingCache || (isTouchEvent && !_scrollbarsTouchSupport) ? false : compatibility.mBtn(event) === 1 || isTouchEvent;
};
function handleDragMove(event) {
if(!onMouseTouchDownContinue(event)) {
documentMouseTouchUp(event);
return;
}
var trackLength = scrollbarVars.i.tl;
var handleLength = scrollbarVars.i.hl;
var scrollRange = scrollbarVars.i.ms;
var scrollRaw = compatibility.page(event)[xy] - mouseDownOffset;
var scrollRaw = (_msieVersion && insideIFrame ? event['screen' + XY] : compatibility.page(event)[xy]) - mouseDownOffset; //use screen coordinates in EDGE & IE because the page values are incorrect in frames.
var scrollDeltaPercent = scrollRaw / (trackLength - handleLength);
var scrollDelta = (scrollRange * scrollDeltaPercent);
scrollDelta = isFinite(scrollDelta) ? scrollDelta : 0;
@@ -4211,12 +4239,9 @@
if (!_supportPassiveEvents)
compatibility.prvD(event);
};
var documentMouseTouchUp = function (event) {
function documentMouseTouchUp(event) {
event = event || event.originalEvent;
var rect = _hostElement[0].getBoundingClientRect();
var mouseInsideHost = event.clientX >= rect.left && event.clientX <= rect.right && event.clientY >= rect.top && event.clientY <= rect.bottom;
removeClass(_bodyElement, _classNameDragging);
removeClass(scrollbarVars.h, strActive);
removeClass(scrollbarVars.t, strActive);
@@ -4236,32 +4261,23 @@
clearTimeout(trackTimeout);
trackTimeout = undefined;
}
var rect = _hostElement[0].getBoundingClientRect();
var mouseInsideHost = event.clientX >= rect.left && event.clientX <= rect.right && event.clientY >= rect.top && event.clientY <= rect.bottom;
//if mouse is outside host element
if (!mouseInsideHost)
hostOnMouseLeave();
//if mouse is outside host element
if (!mouseInsideHost)
hostOnMouseLeave();
if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove)
refreshScrollbarsAutoHide(false);
};
var documentKeyDown = function (event) {
if (framework.inArray(event.keyCode, increaseDecreaseScrollAmountKeyCodes) > -1)
increaseTrackScrollAmount();
};
var documentKeyUp = function (event) {
if (framework.inArray(event.keyCode, increaseDecreaseScrollAmountKeyCodes) > -1)
decreaseTrackScrollAmount();
};
var onMouseTouchDownContinue = function(event) {
var originalEvent = event.originalEvent || event;
var isTouchEvent = originalEvent.touches !== undefined;
return _isSleeping || nativeOverlayScrollbarsAreActive() || !_scrollbarsDragScrollingCache || (isTouchEvent && !_scrollbarsTouchSupport) ? false : compatibility.mBtn(event) === 1 || isTouchEvent;
};
var onHandleMouseTouchDown = function(event) {
function onHandleMouseTouchDown(event) {
mouseDownScroll = _viewportElement[scroll]();
mouseDownScroll = mouseDownScroll === undefined ? 0 : mouseDownScroll;
if (_isRTL && isHorizontal && !_rtlScrollBehavior.n || !_isRTL)
mouseDownScroll = mouseDownScroll < 0 ? 0 : mouseDownScroll;
mouseDownOffset = compatibility.page(event)[xy];
mouseDownOffset = _msieVersion && insideIFrame ? event['screen' + XY] : compatibility.page(event)[xy]; //use screen coordinates in EDGE & IE because the page values are incorrect in frames.
addClass(_bodyElement, _classNameDragging);
addClass(scrollbarVars.h, strActive);
@@ -4275,11 +4291,11 @@
compatibility.prvD(event);
compatibility.stpP(event);
};
scrollbarVars.h.on(_strMouseTouchDownEvent, function (event) {
scrollbarVars.h.on(_strMouseTouchDownEvent, function(event) {
if (onMouseTouchDownContinue(event))
onHandleMouseTouchDown(event);
});
scrollbarVars.t.on(_strMouseTouchDownEvent, function (event) {
scrollbarVars.t.on(_strMouseTouchDownEvent, function(event) {
if (onMouseTouchDownContinue(event)) {
var scrollDistance = _viewportSize[scrollbarVars._wh];
var trackOffset = scrollbarVars.t.offset()[scrollbarVars.lt];
@@ -4310,7 +4326,7 @@
instantScrollPosition = (scrollRange - instantScrollPosition);
if(instantScrollTransition) {
scrollObj.n = false;
scrollObj[scrollbarVars.xy] = instantScrollPosition;
scrollObj[xy] = instantScrollPosition;
_base.scroll(scrollObj, 130, easing, function() { onHandleMouseTouchDown(event); });
}
else {
@@ -4322,7 +4338,7 @@
decreaseScroll = isFirstIteration ? decreaseScrollCondition : decreaseScroll;
finishedCondition = rtlIsNormal ? decreaseScroll ? handleOffset + handleLength >= mouseOffset : handleOffset <= mouseOffset : decreaseScroll ? handleOffset <= mouseOffset : handleOffset + handleLength >= mouseOffset;
scrollObj[scrollbarVars.xy] = decreaseScroll ? '-=' + scrollDistance : '+=' + scrollDistance;
scrollObj[xy] = decreaseScroll ? '-=' + scrollDistance : '+=' + scrollDistance;
_base.scrollStop();
_base.scroll(scrollObj, scrollDuration, easing);
@@ -4354,18 +4370,18 @@
compatibility.prvD(event);
compatibility.stpP(event);
}
}).hover(function () { //make sure both scrollbars will stay visible if one scrollbar is hovered if autoHide is "scroll".
}).hover(function() { //make sure both scrollbars will stay visible if one scrollbar is hovered if autoHide is "scroll".
if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove) {
_scrollbarsAutoHideFlagScrollAndHovered = true;
refreshScrollbarsAutoHide(true);
}
}, function () {
}, function() {
if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove) {
_scrollbarsAutoHideFlagScrollAndHovered = false;
refreshScrollbarsAutoHide(false);
}
});
scrollbarVars.s.on(_strMouseTouchDownEvent, function (event) {
scrollbarVars.s.on(_strMouseTouchDownEvent, function(event) {
compatibility.stpP(event);
});
}
@@ -4852,21 +4868,21 @@
* jQuery addClass method shortcut.
*/
function addClass(el, classes) {
return framework.prototype.addClass.call(el, classes);
return _frameworkProto.addClass.call(el, classes);
}
/**
* jQuery removeClass method shortcut.
*/
function removeClass(el, classes) {
return framework.prototype.removeClass.call(el, classes);
return _frameworkProto.removeClass.call(el, classes);
}
/**
* jQuery remove method shortcut.
*/
function remove(el) {
return framework.prototype.remove.call(el);
return _frameworkProto.remove.call(el);
}
/**
@@ -4876,7 +4892,7 @@
* @returns {*} The first element which is a child of the given element and matches the givens selector.
*/
function findFirst(el, selector) {
return framework.prototype.find.call(el, selector).eq(0);
return _frameworkProto.find.call(el, selector).eq(0);
}
@@ -4894,36 +4910,35 @@
* Updates the plugin and DOM to the current options.
* This method should only be called if a update is 100% required.
* @param force True if every property shall be updated and the cache shall be ignored.
* !INTERNAL USAGE! : force can be a string "auto" or "zoom" too
* !INTERNAL USAGE! : force can be a string "auto", "auto+" or "zoom" too
* if this is the case then before a real update the content size and host element attributes gets checked, and if they changed only then the update method will be called.
*/
_base.update = function (force) {
var attrsChanged;
var contentSizeC;
var isZoom = force === 'zoom';
var isString = type(force) == TYPES.s;
var imgElementSelector = 'img';
var imgElementLoadEvent = 'load';
if (force === _strAuto) {
attrsChanged = meaningfulAttrsChanged();
contentSizeC = updateAutoContentSizeChanged();
if (attrsChanged || contentSizeC)
update(false, contentSizeC);
}
else if (isZoom) {
update(true, true);
}
if(isString) {
if (force.indexOf(_strAuto) === 0) {
attrsChanged = meaningfulAttrsChanged();
contentSizeC = updateAutoContentSizeChanged();
if (attrsChanged || contentSizeC)
update(false, contentSizeC, false, force.slice(-1) == "+");
}
else if (force === 'zoom')
update(true, true);
}
else {
force = _isSleeping || force;
_isSleeping = false;
update(false, false, force);
update(false, false, force, true);
}
if(!_isTextarea && !isZoom) {
if(!_isTextarea) {
_contentElement.find(imgElementSelector).each(function(i, el) {
var index = compatibility.inA(el, _imgs);
if (index === -1) {
el = framework(el);
el.off(imgElementLoadEvent, imgOnLoad).on(imgElementLoadEvent, imgOnLoad);
}
if (index === -1)
framework(el).off(imgElementLoadEvent, imgOnLoad).on(imgElementLoadEvent, imgOnLoad);
});
}
};
@@ -5119,7 +5134,7 @@
* }
*/
_base.scroll = function (coordinates, duration, easing, complete) {
if (arguments.length === 0 || coordinates === undefined) {
if (arguments.length === 0 || coordinates === undefined) {
var infoX = _scrollHorizontalInfo;
var infoY = _scrollVerticalInfo;
var normalizeInvert = _normalizeRTLCache && _isRTL && _rtlScrollBehavior.i;
@@ -5172,6 +5187,7 @@
var strAlways = 'always';
var strNever = 'never';
var strIfNeeded = 'ifneeded';
var strLength = LEXICON.l;
var settingsAxis;
var settingsScroll;
var settingsBlock;
@@ -5185,7 +5201,7 @@
var possibleElementIsJQuery = possibleElement instanceof framework || JQUERY ? possibleElement instanceof JQUERY : false;
var possibleElementIsHTMLElement = possibleElementIsJQuery ? false : isHTMLElement(possibleElement);
var checkSettingsStringValue = function (currValue, allowedValues) {
for (i = 0; i < allowedValues.length; i++) {
for (i = 0; i < allowedValues[strLength]; i++) {
if (currValue === allowedValues[i])
return true;
}
@@ -5193,7 +5209,7 @@
};
var getRawScroll = function (coordinates) {
var rawScroll = {};
if (type(coordinates) == TYPES.a && coordinates.length > 0) {
if (type(coordinates) == TYPES.a && coordinates[strLength] > 0) {
rawScroll.x = coordinates[0];
rawScroll.y = coordinates[1];
}
@@ -5214,7 +5230,7 @@
}
var getRawScrollValue = function (isX) {
var coordinateProps = isX ? coordinatesXAxisProps : coordinatesYAxisProps;
for (i = 0; i < coordinateProps.length; i++) {
for (i = 0; i < coordinateProps[strLength]; i++) {
if (coordinateProps[i] in coordinates) {
return coordinates[coordinateProps[i]];
}
@@ -5226,6 +5242,9 @@
return rawScroll;
};
var getFinalScroll = function (isX, rawScroll) {
var isString = type(rawScroll) == TYPES.s;
if(isString)
_base.update(_strAuto + "+");
var operator;
var amount;
var scrollInfo = isX ? _scrollHorizontalInfo : _scrollVerticalInfo;
@@ -5236,11 +5255,11 @@
var isRTLisX = _isRTL && isX;
var normalizeShortcuts = isRTLisX && _rtlScrollBehavior.n && !normalizeRTL;
var strReplace = 'replace';
if (type(rawScroll) == TYPES.s) {
if (isString) {
//check operator
if (rawScroll.length > 2) {
if (rawScroll[strLength] > 2) {
var possibleOperator = rawScroll.substr(0, 2);
for (i = 0; i < coordinatesOperators.length; i++) {
for (i = 0; i < coordinatesOperators[strLength]; i++) {
if (possibleOperator === coordinatesOperators[i]) {
operator = coordinatesOperators[i];
break;
@@ -5260,11 +5279,11 @@
rawScroll = rawScroll[strReplace](/vh/g, mult + _viewportSize.h);
amount = parseIntToZeroOrNumber(window.parseFloat(window.eval(rawScroll)).toFixed());
}
else if (type(rawScroll) == TYPES.n) {
else {
amount = rawScroll;
}
if (!isNaN(amount) && amount !== undefined && type(amount) == TYPES.n) {
if (amount !== undefined && !isNaN(amount) && type(amount) == TYPES.n) {
var normalizeIsRTLisX = normalizeRTL && isRTLisX;
var operatorCurrScroll = currScroll * (normalizeIsRTLisX && _rtlScrollBehavior.n ? -1 : 1);
var invert = normalizeIsRTLisX && _rtlScrollBehavior.i;
@@ -5287,23 +5306,11 @@
finalValue = amount;
break;
}
if (invert)
finalValue = maxScroll - finalValue;
if (negate)
finalValue *= -1;
if (isRTLisX && _rtlScrollBehavior.n) {
finalValue = Math.max(maxScroll, finalValue);
finalValue = Math.min(0, finalValue);
}
else {
finalValue = Math.min(maxScroll, finalValue);
finalValue = Math.max(0, finalValue);
}
if (finalValue === currScroll)
finalValue = undefined;
finalValue = invert ? maxScroll - finalValue : finalValue;
finalValue *= negate ? -1 : 1;
finalValue = isRTLisX && _rtlScrollBehavior.n ? Math.min(0, Math.max(maxScroll, finalValue)) : Math.max(0, Math.min(maxScroll, finalValue));
}
return finalValue;
return finalValue === currScroll ? undefined : finalValue;
};
var getPerAxisValue = function (value, valueInternalType, defaultValue, allowedValues) {
var resultDefault = [ defaultValue, defaultValue ];
@@ -5316,7 +5323,7 @@
value = [value, value];
}
else if (valueType == TYPES.a) {
valueArrLength = value.length;
valueArrLength = value[strLength];
if (valueArrLength > 2 || valueArrLength < 1)
value = resultDefault;
else {
@@ -5342,24 +5349,21 @@
var currValue;
var currValueType;
var valueDirections = [ _strTop, _strRight, _strBottom, _strLeft ];
for(i = 0; i < marginTopRightBottomLeftArray.length; i++) {
if(i === valueDirections.length)
for(i = 0; i < marginTopRightBottomLeftArray[strLength]; i++) {
if(i === valueDirections[strLength])
break;
currValue = marginTopRightBottomLeftArray[i];
currValueType = type(currValue);
if(currValueType == TYPES.b)
result.push(currValue ? parseIntToZeroOrNumber(finalElement.css(_strMarginMinus + valueDirections[i])) : 0);
else if(currValueType == TYPES.n)
result.push(currValue);
else
result.push(0);
result.push(currValueType == TYPES.n ? currValue : 0);
}
return result;
};
if (possibleElementIsJQuery || possibleElementIsHTMLElement) {
//get settings
//get settings
var margin = coordinatesIsElementObj ? coordinates.margin : 0;
var axis = coordinatesIsElementObj ? coordinates.axis : 0;
var scroll = coordinatesIsElementObj ? coordinates.scroll : 0;
@@ -5368,14 +5372,16 @@
var marginType = type(margin);
var marginLength;
finalElement = possibleElementIsJQuery ? possibleElement : framework(possibleElement);
if (finalElement.length === 0)
if (finalElement[strLength] === 0)
return;
_base.update(_strAuto + "+");
//margin can be [ boolean, number, array of 2, array of 4, object ]
if (marginType == TYPES.n || marginType == TYPES.b)
margin = generateMargin([margin, margin, margin, margin]);
else if (marginType == TYPES.a) {
marginLength = margin.length;
marginLength = margin[strLength];
if(marginLength === 2)
margin = generateMargin([margin[0], margin[1], margin[0], margin[1]]);
else if(marginLength >= 4)
@@ -5394,19 +5400,21 @@
settingsBlock = getPerAxisValue(block, TYPES.s, strBegin, elementObjSettingsBlockValues);
settingsMargin = margin;
//get coordinates
var elementOffset = finalElement.offset();
elementOffset[_strTop] -= settingsMargin[0];
elementOffset[_strLeft] -= settingsMargin[3];
var viewportOffset = _paddingElement.offset(); // use padding element instead of viewport element because padding element has never padding, margin or position applied.
var viewportScroll = {
var viewportScroll = {
l: _scrollHorizontalInfo.cs,
t: _scrollVerticalInfo.cs
};
var doNotScroll = {
// use padding element instead of viewport element because padding element has never padding, margin or position applied.
var viewportOffset = _paddingElement.offset();
//get coordinates
var elementOffset = finalElement.offset();
var doNotScroll = {
x : settingsScroll.x == strNever || settingsAxis == _strY,
y : settingsScroll.y == strNever || settingsAxis == _strX
};
elementOffset[_strTop] -= settingsMargin[0];
elementOffset[_strLeft] -= settingsMargin[3];
var elementScrollCoordinates = {
x: Math.round(elementOffset[_strLeft] - viewportOffset[_strLeft] + viewportScroll.l),
y: Math.round(elementOffset[_strTop] - viewportOffset[_strTop] + viewportScroll.t)
@@ -5422,25 +5430,14 @@
//measuring is required
if (settingsBlock.x != strBegin || settingsBlock.y != strBegin || settingsScroll.x == strIfNeeded || settingsScroll.y == strIfNeeded || _isRTL) {
var measuringElm = finalElement[0];
var rawElementSize = {};
var rect;
if (_supportTransform) {
rect = measuringElm.getBoundingClientRect();
rawElementSize = {
w: rect[_strWidth],
h: rect[_strHeight]
};
}
else {
rawElementSize = {
w: measuringElm[LEXICON.oW],
h: measuringElm[LEXICON.oH]
};
}
var measuringElm = finalElement[0];
var rawElementSize = _supportTransform ? measuringElm.getBoundingClientRect() : {
width : measuringElm[LEXICON.oW],
height : measuringElm[LEXICON.oH]
};
var elementSize = {
w: rawElementSize.w + settingsMargin[3] + settingsMargin[1],
h: rawElementSize.h + settingsMargin[0] + settingsMargin[2]
w: rawElementSize[_strWidth] + settingsMargin[3] + settingsMargin[1],
h: rawElementSize[_strHeight] + settingsMargin[0] + settingsMargin[2]
};
var finalizeBlock = function(isX) {
var vars = getScrollbarVars(isX);
@@ -5471,8 +5468,7 @@
doNotScroll[xy] = scrollIfNeeded ? isInView : false;
blockIsEnd = elSize < vpSize ? elementCenterOffset > viewportCenterOffset : elementCenterOffset < viewportCenterOffset;
}
if (blockIsEnd || blockIsCenter)
elementScrollCoordinates[xy] -= ((vpSize / divide) - (elSize / divide)) * (isX && _isRTL && normalizeRTL ? -1 : 1);
elementScrollCoordinates[xy] -= blockIsEnd || blockIsCenter ? ((vpSize / divide) - (elSize / divide)) * (isX && _isRTL && normalizeRTL ? -1 : 1) : 0;
}
};
finalizeBlock(true);
@@ -5486,14 +5482,14 @@
coordinates = elementScrollCoordinates;
}
finalScroll[_strScrollLeft] = getFinalScroll(true, getRawScroll(coordinates).x);
finalScroll[_strScrollTop] = getFinalScroll(false, getRawScroll(coordinates).y);
doScrollLeft = finalScroll[_strScrollLeft] !== undefined;
doScrollTop = finalScroll[_strScrollTop] !== undefined;
if ((doScrollLeft || doScrollTop) && (duration > 0 || durationIsObject)) {
if (durationIsObject)
if (durationIsObject)
_viewportElement.animate(finalScroll, duration);
else {
animationOptions = {
@@ -5861,7 +5857,7 @@
textareaUpdate();
if (sizeAuto)
_base.update();
update();
else
_base.update(_strAuto);
}
+3 -3
View File
File diff suppressed because one or more lines are too long
+196 -200
View File
@@ -2,13 +2,13 @@
* OverlayScrollbars
* https://github.com/KingSora/OverlayScrollbars
*
* Version: 1.5.1
* Version: 1.5.2
*
* Copyright KingSora.
* https://github.com/KingSora
*
* Released under the MIT license.
* Date: 13.07.2018
* Date: 09.09.2018
*/
(function (global, factory) {
@@ -41,6 +41,7 @@
s : 'style',
i : 'id',
l : 'length',
p : 'prototype',
oH : 'offsetHeight',
cH : 'clientHeight',
sH : 'scrollHeight',
@@ -159,6 +160,7 @@
// Calculate pageX/Y if not native supported
if (!event[strPage + strX] && event[strClient + strX] && event[strClient + strX] != null) {
return {
x : event[strClient + strX] +
(doc && doc.scrollLeft || body && body.scrollLeft || 0) -
@@ -211,14 +213,14 @@
// internal IsCallable function
//throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
}
var aArgs = Array.prototype.slice.call(arguments, 2);
var proto = LEXICON.p;
var aArgs = Array[proto].slice.call(arguments, 2);
var fNOP = function() {};
var fBound = function() { return func.apply(this instanceof fNOP ? this : thisObj, aArgs.concat(Array.prototype.slice.call(arguments))); };
var fBound = function() { return func.apply(this instanceof fNOP ? this : thisObj, aArgs.concat(Array[proto].slice.call(arguments))); };
if (func.prototype)
fNOP.prototype = func.prototype; // Function.prototype doesn't have a prototype property
fBound.prototype = new fNOP();
if (func[proto])
fNOP[proto] = func[proto]; // Function.prototype doesn't have a prototype property
fBound[proto] = new fNOP();
return fBound;
}
@@ -286,10 +288,11 @@
var restrictedStringsSplit = " ";
var restrictedStringsPossibilitiesSplit = ":";
var classNameAllowedValues = [TYPES.z, TYPES.s];
var booleanAllowedValues = TYPES.b;
var numberAllowedValues = TYPES.n;
var booleanNullAllowedValues = [TYPES.z, booleanAllowedValues];
var callbackAllowedValues = [TYPES.z, TYPES.f];
var booleanNullAllowedValues = [TYPES.z, TYPES.b];
var booleanTrueTemplate = [true, TYPES.b];
var booleanFalseTemplate = [false, TYPES.b];
var callbackTemplate = [null, [TYPES.z, TYPES.f]];
var resizeAllowedValues = 'n:none b:both h:horizontal v:vertical';
var overflowBehaviorAllowedValues = 'v-h:visible-hidden v-s:visible-scroll s:scroll h:hidden';
var scrollbarsVisibilityAllowedValues = 'v:visible h:hidden a:auto';
@@ -297,15 +300,15 @@
var optionsDefaultsAndTemplate = {
className: ['os-theme-dark', classNameAllowedValues], //null || string
resize: ['none', resizeAllowedValues], //none || both || horizontal || vertical || n || b || h || v
sizeAutoCapable: [true, booleanAllowedValues], //true || false
clipAlways: [true, booleanAllowedValues], //true || false
normalizeRTL: [true, booleanAllowedValues], //true || false
paddingAbsolute: [false, booleanAllowedValues], //true || false
sizeAutoCapable: booleanTrueTemplate, //true || false
clipAlways: booleanTrueTemplate, //true || false
normalizeRTL: booleanTrueTemplate, //true || false
paddingAbsolute: booleanFalseTemplate, //true || false
autoUpdate: [null, booleanNullAllowedValues], //true || false || null
autoUpdateInterval: [33, numberAllowedValues], //number
nativeScrollbarsOverlaid: {
showNativeScrollbars: [false, booleanAllowedValues], //true || false
initialize: [true, booleanAllowedValues] //true || false
showNativeScrollbars: booleanFalseTemplate, //true || false
initialize: booleanTrueTemplate //true || false
},
overflowBehavior: {
x: ['scroll', overflowBehaviorAllowedValues], //visible-hidden || visible-scroll || hidden || scroll || v-h || v-s || h || s
@@ -315,27 +318,27 @@
visibility: ['auto', scrollbarsVisibilityAllowedValues], //visible || hidden || auto || v || h || a
autoHide: ['never', scrollbarsAutoHideAllowedValues], //never || scroll || leave || move || n || s || l || m
autoHideDelay: [800, numberAllowedValues], //number
dragScrolling: [true, booleanAllowedValues], //true || false
clickScrolling: [false, booleanAllowedValues], //true || false
touchSupport: [true, booleanAllowedValues] //true || false
dragScrolling: booleanTrueTemplate, //true || false
clickScrolling: booleanFalseTemplate, //true || false
touchSupport: booleanTrueTemplate //true || false
},
textarea: {
dynWidth: [false, booleanAllowedValues], //true || false
dynHeight: [false, booleanAllowedValues] //true || false
dynWidth: booleanFalseTemplate, //true || false
dynHeight: booleanFalseTemplate //true || false
},
callbacks: {
onInitialized: [null, callbackAllowedValues], //null || function
onInitializationWithdrawn: [null, callbackAllowedValues], //null || function
onDestroyed: [null, callbackAllowedValues], //null || function
onScrollStart: [null, callbackAllowedValues], //null || function
onScroll: [null, callbackAllowedValues], //null || function
onScrollStop: [null, callbackAllowedValues], //null || function
onOverflowChanged: [null, callbackAllowedValues], //null || function
onOverflowAmountChanged: [null, callbackAllowedValues], //null || function
onDirectionChanged: [null, callbackAllowedValues], //null || function
onContentSizeChanged: [null, callbackAllowedValues], //null || function
onHostSizeChanged: [null, callbackAllowedValues], //null || function
onUpdated: [null, callbackAllowedValues] //null || function
onInitialized: callbackTemplate, //null || function
onInitializationWithdrawn: callbackTemplate, //null || function
onDestroyed: callbackTemplate, //null || function
onScrollStart: callbackTemplate, //null || function
onScroll: callbackTemplate, //null || function
onScrollStop: callbackTemplate, //null || function
onOverflowChanged: callbackTemplate, //null || function
onOverflowAmountChanged: callbackTemplate, //null || function
onDirectionChanged: callbackTemplate, //null || function
onContentSizeChanged: callbackTemplate, //null || function
onHostSizeChanged: callbackTemplate, //null || function
onUpdated: callbackTemplate //null || function
}
};
var convert = function(template) {
@@ -494,11 +497,8 @@
var scrollbarDummyElement = framework('<div id="hs-dummy-scrollbar-size"><div style="height: 200%; width: 200%; margin: 10px 0;"></div></div>');
var scrollbarDummyElement0 = scrollbarDummyElement[0];
var dummyContainerChild = framework(scrollbarDummyElement.children('div').eq(0));
var IEBUGFIX = scrollbarDummyElement0[LEXICON.oH]; //IE9 causes a bug where offsetHeight is zero for no reason
bodyElement.append(scrollbarDummyElement);
if(IEBUGFIX === 0)
scrollbarDummyElement.hide().show();
var nativeScrollbarSize = calcNativeScrollbarSize(scrollbarDummyElement0);
var nativeScrollbarIsOverlaid = {
@@ -617,18 +617,7 @@
if(nativeScrollbarIsOverlaid.x && nativeScrollbarIsOverlaid.y)
return;
function differenceIsBiggerThanOne(valOne, valTwo) {
var absValOne = Math.abs(valOne);
var absValTwo = Math.abs(valTwo);
return !(absValOne === absValTwo || absValOne + 1 === absValTwo || absValOne - 1 === absValTwo);
}
function getWindowDPR() {
var dDPI = window.screen.deviceXDPI || 0;
var sDPI = window.screen.logicalXDPI || 1;
return window.devicePixelRatio || (dDPI / sDPI);
}
var abs = Math.abs;
var windowWidth = compatibility.wW();
var windowHeight = compatibility.wH();
var windowDpr = getWindowDPR();
@@ -644,10 +633,10 @@
var deltaWRatio = Math.round(newW / (windowWidth / 100.0));
var deltaHRatio = Math.round(newH / (windowHeight / 100.0));
var absDeltaW = Math.abs(deltaW);
var absDeltaH = Math.abs(deltaH);
var absDeltaWRatio = Math.abs(deltaWRatio);
var absDeltaHRatio = Math.abs(deltaHRatio);
var absDeltaW = abs(deltaW);
var absDeltaH = abs(deltaH);
var absDeltaWRatio = abs(deltaWRatio);
var absDeltaHRatio = abs(deltaHRatio);
var newDPR = getWindowDPR();
var deltaIsBigger = absDeltaW > 2 && absDeltaH > 2;
@@ -674,6 +663,19 @@
windowDpr = newDPR;
}
};
function differenceIsBiggerThanOne(valOne, valTwo) {
var absValOne = abs(valOne);
var absValTwo = abs(valTwo);
return !(absValOne === absValTwo || absValOne + 1 === absValTwo || absValOne - 1 === absValTwo);
}
function getWindowDPR() {
var dDPI = window.screen.deviceXDPI || 0;
var sDPI = window.screen.logicalXDPI || 1;
return window.devicePixelRatio || (dDPI / sDPI);
}
framework(window).on('resize', onResize);
})();
@@ -717,6 +719,7 @@
var _base = this;
var _strAutoUpdate = 'autoUpdate';
var _strAutoUpdateInterval = _strAutoUpdate + 'Interval';
var _strLength = LEXICON.l;
var _loopingInstances = [ ];
var _loopingInstancesIntervalCache = [ ];
@@ -730,7 +733,7 @@
* The auto update loop which will run every 50 milliseconds or less if the update interval of a instance is lower than 50 milliseconds.
*/
var loop = function() {
if(_loopingInstances.length > 0 && _loopIsActive) {
if(_loopingInstances[_strLength] > 0 && _loopIsActive) {
_loopID = compatibility.rAF()(function () {
loop();
});
@@ -740,7 +743,7 @@
if (timeDelta > _loopInterval) {
_loopTimeOld = timeNew - (timeDelta % _loopInterval);
var lowestInterval = _loopIntervalDefault;
for(var i = 0; i < _loopingInstances.length; i++) {
for(var i = 0; i < _loopingInstances[_strLength]; i++) {
var instance = _loopingInstances[i];
if (instance !== undefined) {
var instanceOptions = instance.options();
@@ -769,7 +772,7 @@
if(framework.inArray(instance, _loopingInstances) === -1) {
_loopingInstances.push(instance);
_loopingInstancesIntervalCache.push(compatibility.now());
if (_loopingInstances.length > 0 && !_loopIsActive) {
if (_loopingInstances[_strLength] > 0 && !_loopIsActive) {
_loopIsActive = true;
globals.autoUpdateLoop = _loopIsActive;
loop();
@@ -789,7 +792,7 @@
_loopingInstances.splice(index, 1);
//correct update loop behavior
if (_loopingInstances.length === 0 && _loopIsActive) {
if (_loopingInstances[_strLength] === 0 && _loopIsActive) {
_loopIsActive = false;
globals.autoUpdateLoop = _loopIsActive;
if(_loopID !== undefined) {
@@ -825,6 +828,7 @@
//make correct instanceof
var _base = new window[PLUGINNAME]();
var _frameworkProto = framework[LEXICON.p];
//globals:
var _nativeScrollbarIsOverlaid;
@@ -1984,14 +1988,16 @@
* @param hostSizeChanged True if this method was called due to a host size change.
* @param contentSizeChanged True if this method was called due to a content size change.
* @param force True if every property shall be updated and the cache shall be ignored.
* @param preventSwallowing True if this method shall be executed event if it could be swallowed.
*/
function update(hostSizeChanged, contentSizeChanged, force) {
function update(hostSizeChanged, contentSizeChanged, force, preventSwallowing) {
var now = compatibility.now();
var swallow = _swallowUpdateLag > 0 && _initialized && (now - _lastUpdateTime) < _swallowUpdateLag && (!_heightAutoCache && !_widthAutoCache);
var swallow = _swallowUpdateLag > 0 && _initialized && (now - _lastUpdateTime) < _swallowUpdateLag && (!_heightAutoCache && !_widthAutoCache) && !preventSwallowing;
var displayIsHidden = _hostElement.is(':hidden');
var displayIsHiddenChanged = checkCacheSingle(displayIsHidden, _displayIsHiddenCache, force);
_displayIsHiddenCache = displayIsHidden;
clearTimeout(_swallowedUpdateTimeout);
if (swallow) {
_swallowedUpdateParams.h = hostSizeChanged;
_swallowedUpdateParams.c = contentSizeChanged;
@@ -2040,7 +2046,6 @@
freezeResizeObserver(_sizeObserverElement);
freezeResizeObserver(_sizeAutoObserverElement);
//save current scroll offset
var currScroll = {
l: _viewportElement[_strScrollLeft](),
@@ -2103,7 +2108,7 @@
//dynWidth:
var textareaDynWidth = currentPreparedOptionsTextarea.dynWidth;
var textareaDynWidthChanged = checkCacheSingle(_textareaDynWidthCache, textareaDynHeight);
var textareaDynWidthChanged = checkCacheSingle(_textareaDynWidthCache, textareaDynWidth);
//dynHeight:
var textareaDynHeight = currentPreparedOptionsTextarea.dynHeight;
@@ -2152,6 +2157,7 @@
_overflowBehaviorCache = extend(true, {}, overflowBehavior);
_textareaDynWidthCache = textareaDynWidth;
_textareaDynHeightCache = textareaDynHeight;
_hasOverflowCache = _hasOverflowCache || { x: false, y: false };
//set correct class name to the host element
if (classNameChanged) {
@@ -2325,8 +2331,10 @@
//set info for padding
_paddingX = padding.l + padding.r;
_paddingY = padding.t + padding.b;
padding.ax = paddingAbsolute ? _paddingX : 0;
padding.ay = paddingAbsolute ? _paddingY : 0;
padding.c = checkCacheTRBL(padding, _cssPaddingCache);
//set info for border
_borderX = border.l + border.r;
_borderY = border.t + border.b;
@@ -2394,22 +2402,24 @@
if (heightAuto && (heightAutoChanged || paddingAbsoluteChanged || boxSizingChanged || cssMaxValue.c || padding.c || border.c)) {
if (cssMaxValue.cw)
contentElementCSS[_strMaxMinus + _strHeight] =
(cssMaxValue.ch ? (cssMaxValue.ih - (paddingAbsolute ? _paddingY : 0) +
(_isBorderBox ? -_borderY : _paddingY)) : _strEmpty);
(cssMaxValue.ch ? (cssMaxValue.ih - padding.ay + (_isBorderBox ? -_borderY : _paddingY))
: _strEmpty);
contentElementCSS[_strHeight] = _strAuto;
} else if (heightAutoChanged || paddingAbsoluteChanged) {
}
else if (heightAutoChanged || paddingAbsoluteChanged) {
contentElementCSS[_strMaxMinus + _strHeight] = _strEmpty;
contentElementCSS[_strHeight] = _strHundredPercent;
}
if (widthAuto && (widthAutoChanged || paddingAbsoluteChanged || boxSizingChanged || cssMaxValue.c || padding.c || border.c || cssDirectionChanged)) {
if (cssMaxValue.cw)
contentElementCSS[_strMaxMinus + _strWidth] =
(cssMaxValue.cw ? (cssMaxValue.iw - (paddingAbsolute ? _paddingX : 0) +
(_isBorderBox ? -_borderX : _paddingX)) +
(_nativeScrollbarIsOverlaid.y /*&& _hasOverflowCache.y && widthAuto */ ? _overlayScrollbarDummySize.y : 0) : _strEmpty);
(cssMaxValue.cw ? (cssMaxValue.iw - padding.ax + (_isBorderBox ? -_borderX : _paddingX)) +
(_nativeScrollbarIsOverlaid.y /*&& _hasOverflowCache.y && widthAuto */ ? _overlayScrollbarDummySize.y : 0)
: _strEmpty);
contentElementCSS[_strWidth] = _strAuto;
contentGlueElementCSS[_strMaxMinus + _strWidth] = _strHundredPercent; //IE Fix
} else if (widthAutoChanged || paddingAbsoluteChanged) {
}
else if (widthAutoChanged || paddingAbsoluteChanged) {
contentElementCSS[_strMaxMinus + _strWidth] = _strEmpty;
contentElementCSS[_strWidth] = _strHundredPercent;
contentElementCSS[_strFloat] = _strEmpty;
@@ -2434,14 +2444,12 @@
_contentGlueElement.css(contentGlueElementCSS);
_contentElement.css(contentElementCSS);
//CHECKPOINT HERE ~
contentElementCSS = {};
contentGlueElementCSS = {};
_hasOverflowCache = _hasOverflowCache || {x: false, y: false};
//if [content(host) client / scroll size, or target element direction, or content(host) max-sizes] changed, or force is true
if (hostSizeChanged || contentSizeChanged || cssDirectionChanged || boxSizingChanged || paddingAbsoluteChanged || widthAutoChanged || widthAuto || heightAutoChanged || heightAuto || cssMaxValue.c || ignoreOverlayScrollbarHidingChanged || overflowBehaviorChanged || clipAlwaysChanged || resizeChanged || scrollbarsVisibilityChanged || textareaDynWidthChanged || textareaDynHeightChanged || textareaAutoWrappingChanged || paddingAbsoluteChanged || textareaDynWidthChanged || textareaDynHeightChanged || force) {
if (hostSizeChanged || contentSizeChanged || cssDirectionChanged || boxSizingChanged || paddingAbsoluteChanged || widthAutoChanged || widthAuto || heightAutoChanged || heightAuto || cssMaxValue.c || ignoreOverlayScrollbarHidingChanged || overflowBehaviorChanged || clipAlwaysChanged || resizeChanged || scrollbarsVisibilityChanged || textareaDynWidthChanged || textareaDynHeightChanged || textareaAutoWrappingChanged || force) {
var strOverflow = 'overflow';
var strOverflowX = strOverflow + '-x';
var strOverflowY = strOverflow + '-y';
@@ -2497,8 +2505,8 @@
h: hostElement[LEXICON.cH]
};
var contentGlueSize = {
w: Math.max(contentClientSize.w + (paddingAbsolute ? _paddingX : 0), hostSize.w - _paddingX) - (textareaDynWidth ? (_isTextarea && widthAuto ? _marginX + (!_isBorderBox ? _paddingX + _borderX : 0) : 0) : 0),
h: Math.max(contentClientSize.h + (paddingAbsolute ? _paddingY : 0), hostSize.h - _paddingY)
w: Math.max(contentClientSize.w + padding.ax, hostSize.w - _paddingX) - (textareaDynWidth ? (_isTextarea && widthAuto ? _marginX + (!_isBorderBox ? _paddingX + _borderX : 0) : 0) : 0),
h: Math.max(contentClientSize.h + padding.ay, hostSize.h - _paddingY)
};
contentGlueSize.c = checkCacheDouble(contentGlueSize, _contentGlueSizeCache, force);
_contentGlueSizeCache = contentGlueSize;
@@ -2604,8 +2612,8 @@
* };
*/
var overflowAmount = {
x: Math.max(0, Math.round((contentScrollSize.w - hostSize.w + (paddingAbsolute ? _paddingX : 0)) * 100) / 100),
y: Math.max(0, Math.round((contentScrollSize.h - hostSize.h + (paddingAbsolute ? _paddingY : 0)) * 100) / 100)
x: Math.max(0, Math.round((contentScrollSize.w - hostSize.w + padding.ax) * 100) / 100),
y: Math.max(0, Math.round((contentScrollSize.h - hostSize.h + padding.ay) * 100) / 100)
};
var hideOverflowForceTextarea = _isTextarea && (_viewportSize.w === 0 || _viewportSize.h === 0);
if (hideOverflowForceTextarea) {
@@ -3047,13 +3055,13 @@
}
//fix body min size
if (_isBody && (hasOverflow.c || _bodyMinSizeCache.c)) {
if (_isBody && (_hasOverflowCache.c || _bodyMinSizeCache.c)) {
//its possible that no min size was measured until now, because the content arrange element was just added now, in this case, measure now the min size.
if (!_bodyMinSizeCache.f)
bodyMinSizeChanged();
if (_nativeScrollbarIsOverlaid.y && hasOverflow.x)
if (_nativeScrollbarIsOverlaid.y && _hasOverflowCache.x)
_contentElement.css(_strMinMinus + _strWidth, _bodyMinSizeCache.w + _overlayScrollbarDummySize.y);
if (_nativeScrollbarIsOverlaid.x && hasOverflow.y)
if (_nativeScrollbarIsOverlaid.x && _hasOverflowCache.y)
_contentElement.css(_strMinMinus + _strHeight, _bodyMinSizeCache.h + _overlayScrollbarDummySize.x);
_bodyMinSizeCache.c = false;
}
@@ -3125,25 +3133,45 @@
*/
function initScrollbarInteractivity(isHorizontal) {
var scrollbarVars = getScrollbarVars(isHorizontal);
var insideIFrame = _windowElement.top !== _windowElement;
var mouseDownScroll;
var mouseDownOffset;
var xy = scrollbarVars.xy;
var XY = scrollbarVars.XY;
var scroll = _strScroll + scrollbarVars.LT;
var strActive = 'active';
var trackTimeout;
var scrollDurationFactor = 1;
var increaseDecreaseScrollAmountKeyCodes = [ 16, 17 ]; //shift, ctrl
var increaseTrackScrollAmount = function () {
function increaseTrackScrollAmount() {
scrollDurationFactor = 0.5;
};
var decreaseTrackScrollAmount = function () {
function decreaseTrackScrollAmount() {
scrollDurationFactor = 1;
};
var handleDragMove = function (event) {
function documentKeyDown(event) {
if (framework.inArray(event.keyCode, increaseDecreaseScrollAmountKeyCodes) > -1)
increaseTrackScrollAmount();
};
function documentKeyUp(event) {
if (framework.inArray(event.keyCode, increaseDecreaseScrollAmountKeyCodes) > -1)
decreaseTrackScrollAmount();
};
function onMouseTouchDownContinue(event) {
var originalEvent = event.originalEvent || event;
var isTouchEvent = originalEvent.touches !== undefined;
return _isSleeping || nativeOverlayScrollbarsAreActive() || !_scrollbarsDragScrollingCache || (isTouchEvent && !_scrollbarsTouchSupport) ? false : compatibility.mBtn(event) === 1 || isTouchEvent;
};
function handleDragMove(event) {
if(!onMouseTouchDownContinue(event)) {
documentMouseTouchUp(event);
return;
}
var trackLength = scrollbarVars.i.tl;
var handleLength = scrollbarVars.i.hl;
var scrollRange = scrollbarVars.i.ms;
var scrollRaw = compatibility.page(event)[xy] - mouseDownOffset;
var scrollRaw = (_msieVersion && insideIFrame ? event['screen' + XY] : compatibility.page(event)[xy]) - mouseDownOffset; //use screen coordinates in EDGE & IE because the page values are incorrect in frames.
var scrollDeltaPercent = scrollRaw / (trackLength - handleLength);
var scrollDelta = (scrollRange * scrollDeltaPercent);
scrollDelta = isFinite(scrollDelta) ? scrollDelta : 0;
@@ -3154,12 +3182,9 @@
if (!_supportPassiveEvents)
compatibility.prvD(event);
};
var documentMouseTouchUp = function (event) {
function documentMouseTouchUp(event) {
event = event || event.originalEvent;
var rect = _hostElement[0].getBoundingClientRect();
var mouseInsideHost = event.clientX >= rect.left && event.clientX <= rect.right && event.clientY >= rect.top && event.clientY <= rect.bottom;
removeClass(_bodyElement, _classNameDragging);
removeClass(scrollbarVars.h, strActive);
removeClass(scrollbarVars.t, strActive);
@@ -3179,32 +3204,23 @@
clearTimeout(trackTimeout);
trackTimeout = undefined;
}
var rect = _hostElement[0].getBoundingClientRect();
var mouseInsideHost = event.clientX >= rect.left && event.clientX <= rect.right && event.clientY >= rect.top && event.clientY <= rect.bottom;
//if mouse is outside host element
if (!mouseInsideHost)
hostOnMouseLeave();
//if mouse is outside host element
if (!mouseInsideHost)
hostOnMouseLeave();
if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove)
refreshScrollbarsAutoHide(false);
};
var documentKeyDown = function (event) {
if (framework.inArray(event.keyCode, increaseDecreaseScrollAmountKeyCodes) > -1)
increaseTrackScrollAmount();
};
var documentKeyUp = function (event) {
if (framework.inArray(event.keyCode, increaseDecreaseScrollAmountKeyCodes) > -1)
decreaseTrackScrollAmount();
};
var onMouseTouchDownContinue = function(event) {
var originalEvent = event.originalEvent || event;
var isTouchEvent = originalEvent.touches !== undefined;
return _isSleeping || nativeOverlayScrollbarsAreActive() || !_scrollbarsDragScrollingCache || (isTouchEvent && !_scrollbarsTouchSupport) ? false : compatibility.mBtn(event) === 1 || isTouchEvent;
};
var onHandleMouseTouchDown = function(event) {
function onHandleMouseTouchDown(event) {
mouseDownScroll = _viewportElement[scroll]();
mouseDownScroll = mouseDownScroll === undefined ? 0 : mouseDownScroll;
if (_isRTL && isHorizontal && !_rtlScrollBehavior.n || !_isRTL)
mouseDownScroll = mouseDownScroll < 0 ? 0 : mouseDownScroll;
mouseDownOffset = compatibility.page(event)[xy];
mouseDownOffset = _msieVersion && insideIFrame ? event['screen' + XY] : compatibility.page(event)[xy]; //use screen coordinates in EDGE & IE because the page values are incorrect in frames.
addClass(_bodyElement, _classNameDragging);
addClass(scrollbarVars.h, strActive);
@@ -3218,11 +3234,11 @@
compatibility.prvD(event);
compatibility.stpP(event);
};
scrollbarVars.h.on(_strMouseTouchDownEvent, function (event) {
scrollbarVars.h.on(_strMouseTouchDownEvent, function(event) {
if (onMouseTouchDownContinue(event))
onHandleMouseTouchDown(event);
});
scrollbarVars.t.on(_strMouseTouchDownEvent, function (event) {
scrollbarVars.t.on(_strMouseTouchDownEvent, function(event) {
if (onMouseTouchDownContinue(event)) {
var scrollDistance = _viewportSize[scrollbarVars._wh];
var trackOffset = scrollbarVars.t.offset()[scrollbarVars.lt];
@@ -3253,7 +3269,7 @@
instantScrollPosition = (scrollRange - instantScrollPosition);
if(instantScrollTransition) {
scrollObj.n = false;
scrollObj[scrollbarVars.xy] = instantScrollPosition;
scrollObj[xy] = instantScrollPosition;
_base.scroll(scrollObj, 130, easing, function() { onHandleMouseTouchDown(event); });
}
else {
@@ -3265,7 +3281,7 @@
decreaseScroll = isFirstIteration ? decreaseScrollCondition : decreaseScroll;
finishedCondition = rtlIsNormal ? decreaseScroll ? handleOffset + handleLength >= mouseOffset : handleOffset <= mouseOffset : decreaseScroll ? handleOffset <= mouseOffset : handleOffset + handleLength >= mouseOffset;
scrollObj[scrollbarVars.xy] = decreaseScroll ? '-=' + scrollDistance : '+=' + scrollDistance;
scrollObj[xy] = decreaseScroll ? '-=' + scrollDistance : '+=' + scrollDistance;
_base.scrollStop();
_base.scroll(scrollObj, scrollDuration, easing);
@@ -3297,18 +3313,18 @@
compatibility.prvD(event);
compatibility.stpP(event);
}
}).hover(function () { //make sure both scrollbars will stay visible if one scrollbar is hovered if autoHide is "scroll".
}).hover(function() { //make sure both scrollbars will stay visible if one scrollbar is hovered if autoHide is "scroll".
if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove) {
_scrollbarsAutoHideFlagScrollAndHovered = true;
refreshScrollbarsAutoHide(true);
}
}, function () {
}, function() {
if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove) {
_scrollbarsAutoHideFlagScrollAndHovered = false;
refreshScrollbarsAutoHide(false);
}
});
scrollbarVars.s.on(_strMouseTouchDownEvent, function (event) {
scrollbarVars.s.on(_strMouseTouchDownEvent, function(event) {
compatibility.stpP(event);
});
}
@@ -3795,21 +3811,21 @@
* jQuery addClass method shortcut.
*/
function addClass(el, classes) {
return framework.prototype.addClass.call(el, classes);
return _frameworkProto.addClass.call(el, classes);
}
/**
* jQuery removeClass method shortcut.
*/
function removeClass(el, classes) {
return framework.prototype.removeClass.call(el, classes);
return _frameworkProto.removeClass.call(el, classes);
}
/**
* jQuery remove method shortcut.
*/
function remove(el) {
return framework.prototype.remove.call(el);
return _frameworkProto.remove.call(el);
}
/**
@@ -3819,7 +3835,7 @@
* @returns {*} The first element which is a child of the given element and matches the givens selector.
*/
function findFirst(el, selector) {
return framework.prototype.find.call(el, selector).eq(0);
return _frameworkProto.find.call(el, selector).eq(0);
}
@@ -3837,36 +3853,35 @@
* Updates the plugin and DOM to the current options.
* This method should only be called if a update is 100% required.
* @param force True if every property shall be updated and the cache shall be ignored.
* !INTERNAL USAGE! : force can be a string "auto" or "zoom" too
* !INTERNAL USAGE! : force can be a string "auto", "auto+" or "zoom" too
* if this is the case then before a real update the content size and host element attributes gets checked, and if they changed only then the update method will be called.
*/
_base.update = function (force) {
var attrsChanged;
var contentSizeC;
var isZoom = force === 'zoom';
var isString = type(force) == TYPES.s;
var imgElementSelector = 'img';
var imgElementLoadEvent = 'load';
if (force === _strAuto) {
attrsChanged = meaningfulAttrsChanged();
contentSizeC = updateAutoContentSizeChanged();
if (attrsChanged || contentSizeC)
update(false, contentSizeC);
}
else if (isZoom) {
update(true, true);
}
if(isString) {
if (force.indexOf(_strAuto) === 0) {
attrsChanged = meaningfulAttrsChanged();
contentSizeC = updateAutoContentSizeChanged();
if (attrsChanged || contentSizeC)
update(false, contentSizeC, false, force.slice(-1) == "+");
}
else if (force === 'zoom')
update(true, true);
}
else {
force = _isSleeping || force;
_isSleeping = false;
update(false, false, force);
update(false, false, force, true);
}
if(!_isTextarea && !isZoom) {
if(!_isTextarea) {
_contentElement.find(imgElementSelector).each(function(i, el) {
var index = compatibility.inA(el, _imgs);
if (index === -1) {
el = framework(el);
el.off(imgElementLoadEvent, imgOnLoad).on(imgElementLoadEvent, imgOnLoad);
}
if (index === -1)
framework(el).off(imgElementLoadEvent, imgOnLoad).on(imgElementLoadEvent, imgOnLoad);
});
}
};
@@ -4062,7 +4077,7 @@
* }
*/
_base.scroll = function (coordinates, duration, easing, complete) {
if (arguments.length === 0 || coordinates === undefined) {
if (arguments.length === 0 || coordinates === undefined) {
var infoX = _scrollHorizontalInfo;
var infoY = _scrollVerticalInfo;
var normalizeInvert = _normalizeRTLCache && _isRTL && _rtlScrollBehavior.i;
@@ -4115,6 +4130,7 @@
var strAlways = 'always';
var strNever = 'never';
var strIfNeeded = 'ifneeded';
var strLength = LEXICON.l;
var settingsAxis;
var settingsScroll;
var settingsBlock;
@@ -4128,7 +4144,7 @@
var possibleElementIsJQuery = possibleElement instanceof framework || JQUERY ? possibleElement instanceof JQUERY : false;
var possibleElementIsHTMLElement = possibleElementIsJQuery ? false : isHTMLElement(possibleElement);
var checkSettingsStringValue = function (currValue, allowedValues) {
for (i = 0; i < allowedValues.length; i++) {
for (i = 0; i < allowedValues[strLength]; i++) {
if (currValue === allowedValues[i])
return true;
}
@@ -4136,7 +4152,7 @@
};
var getRawScroll = function (coordinates) {
var rawScroll = {};
if (type(coordinates) == TYPES.a && coordinates.length > 0) {
if (type(coordinates) == TYPES.a && coordinates[strLength] > 0) {
rawScroll.x = coordinates[0];
rawScroll.y = coordinates[1];
}
@@ -4157,7 +4173,7 @@
}
var getRawScrollValue = function (isX) {
var coordinateProps = isX ? coordinatesXAxisProps : coordinatesYAxisProps;
for (i = 0; i < coordinateProps.length; i++) {
for (i = 0; i < coordinateProps[strLength]; i++) {
if (coordinateProps[i] in coordinates) {
return coordinates[coordinateProps[i]];
}
@@ -4169,6 +4185,9 @@
return rawScroll;
};
var getFinalScroll = function (isX, rawScroll) {
var isString = type(rawScroll) == TYPES.s;
if(isString)
_base.update(_strAuto + "+");
var operator;
var amount;
var scrollInfo = isX ? _scrollHorizontalInfo : _scrollVerticalInfo;
@@ -4179,11 +4198,11 @@
var isRTLisX = _isRTL && isX;
var normalizeShortcuts = isRTLisX && _rtlScrollBehavior.n && !normalizeRTL;
var strReplace = 'replace';
if (type(rawScroll) == TYPES.s) {
if (isString) {
//check operator
if (rawScroll.length > 2) {
if (rawScroll[strLength] > 2) {
var possibleOperator = rawScroll.substr(0, 2);
for (i = 0; i < coordinatesOperators.length; i++) {
for (i = 0; i < coordinatesOperators[strLength]; i++) {
if (possibleOperator === coordinatesOperators[i]) {
operator = coordinatesOperators[i];
break;
@@ -4203,11 +4222,11 @@
rawScroll = rawScroll[strReplace](/vh/g, mult + _viewportSize.h);
amount = parseIntToZeroOrNumber(window.parseFloat(window.eval(rawScroll)).toFixed());
}
else if (type(rawScroll) == TYPES.n) {
else {
amount = rawScroll;
}
if (!isNaN(amount) && amount !== undefined && type(amount) == TYPES.n) {
if (amount !== undefined && !isNaN(amount) && type(amount) == TYPES.n) {
var normalizeIsRTLisX = normalizeRTL && isRTLisX;
var operatorCurrScroll = currScroll * (normalizeIsRTLisX && _rtlScrollBehavior.n ? -1 : 1);
var invert = normalizeIsRTLisX && _rtlScrollBehavior.i;
@@ -4230,23 +4249,11 @@
finalValue = amount;
break;
}
if (invert)
finalValue = maxScroll - finalValue;
if (negate)
finalValue *= -1;
if (isRTLisX && _rtlScrollBehavior.n) {
finalValue = Math.max(maxScroll, finalValue);
finalValue = Math.min(0, finalValue);
}
else {
finalValue = Math.min(maxScroll, finalValue);
finalValue = Math.max(0, finalValue);
}
if (finalValue === currScroll)
finalValue = undefined;
finalValue = invert ? maxScroll - finalValue : finalValue;
finalValue *= negate ? -1 : 1;
finalValue = isRTLisX && _rtlScrollBehavior.n ? Math.min(0, Math.max(maxScroll, finalValue)) : Math.max(0, Math.min(maxScroll, finalValue));
}
return finalValue;
return finalValue === currScroll ? undefined : finalValue;
};
var getPerAxisValue = function (value, valueInternalType, defaultValue, allowedValues) {
var resultDefault = [ defaultValue, defaultValue ];
@@ -4259,7 +4266,7 @@
value = [value, value];
}
else if (valueType == TYPES.a) {
valueArrLength = value.length;
valueArrLength = value[strLength];
if (valueArrLength > 2 || valueArrLength < 1)
value = resultDefault;
else {
@@ -4285,24 +4292,21 @@
var currValue;
var currValueType;
var valueDirections = [ _strTop, _strRight, _strBottom, _strLeft ];
for(i = 0; i < marginTopRightBottomLeftArray.length; i++) {
if(i === valueDirections.length)
for(i = 0; i < marginTopRightBottomLeftArray[strLength]; i++) {
if(i === valueDirections[strLength])
break;
currValue = marginTopRightBottomLeftArray[i];
currValueType = type(currValue);
if(currValueType == TYPES.b)
result.push(currValue ? parseIntToZeroOrNumber(finalElement.css(_strMarginMinus + valueDirections[i])) : 0);
else if(currValueType == TYPES.n)
result.push(currValue);
else
result.push(0);
result.push(currValueType == TYPES.n ? currValue : 0);
}
return result;
};
if (possibleElementIsJQuery || possibleElementIsHTMLElement) {
//get settings
//get settings
var margin = coordinatesIsElementObj ? coordinates.margin : 0;
var axis = coordinatesIsElementObj ? coordinates.axis : 0;
var scroll = coordinatesIsElementObj ? coordinates.scroll : 0;
@@ -4311,14 +4315,16 @@
var marginType = type(margin);
var marginLength;
finalElement = possibleElementIsJQuery ? possibleElement : framework(possibleElement);
if (finalElement.length === 0)
if (finalElement[strLength] === 0)
return;
_base.update(_strAuto + "+");
//margin can be [ boolean, number, array of 2, array of 4, object ]
if (marginType == TYPES.n || marginType == TYPES.b)
margin = generateMargin([margin, margin, margin, margin]);
else if (marginType == TYPES.a) {
marginLength = margin.length;
marginLength = margin[strLength];
if(marginLength === 2)
margin = generateMargin([margin[0], margin[1], margin[0], margin[1]]);
else if(marginLength >= 4)
@@ -4337,19 +4343,21 @@
settingsBlock = getPerAxisValue(block, TYPES.s, strBegin, elementObjSettingsBlockValues);
settingsMargin = margin;
//get coordinates
var elementOffset = finalElement.offset();
elementOffset[_strTop] -= settingsMargin[0];
elementOffset[_strLeft] -= settingsMargin[3];
var viewportOffset = _paddingElement.offset(); // use padding element instead of viewport element because padding element has never padding, margin or position applied.
var viewportScroll = {
var viewportScroll = {
l: _scrollHorizontalInfo.cs,
t: _scrollVerticalInfo.cs
};
var doNotScroll = {
// use padding element instead of viewport element because padding element has never padding, margin or position applied.
var viewportOffset = _paddingElement.offset();
//get coordinates
var elementOffset = finalElement.offset();
var doNotScroll = {
x : settingsScroll.x == strNever || settingsAxis == _strY,
y : settingsScroll.y == strNever || settingsAxis == _strX
};
elementOffset[_strTop] -= settingsMargin[0];
elementOffset[_strLeft] -= settingsMargin[3];
var elementScrollCoordinates = {
x: Math.round(elementOffset[_strLeft] - viewportOffset[_strLeft] + viewportScroll.l),
y: Math.round(elementOffset[_strTop] - viewportOffset[_strTop] + viewportScroll.t)
@@ -4365,25 +4373,14 @@
//measuring is required
if (settingsBlock.x != strBegin || settingsBlock.y != strBegin || settingsScroll.x == strIfNeeded || settingsScroll.y == strIfNeeded || _isRTL) {
var measuringElm = finalElement[0];
var rawElementSize = {};
var rect;
if (_supportTransform) {
rect = measuringElm.getBoundingClientRect();
rawElementSize = {
w: rect[_strWidth],
h: rect[_strHeight]
};
}
else {
rawElementSize = {
w: measuringElm[LEXICON.oW],
h: measuringElm[LEXICON.oH]
};
}
var measuringElm = finalElement[0];
var rawElementSize = _supportTransform ? measuringElm.getBoundingClientRect() : {
width : measuringElm[LEXICON.oW],
height : measuringElm[LEXICON.oH]
};
var elementSize = {
w: rawElementSize.w + settingsMargin[3] + settingsMargin[1],
h: rawElementSize.h + settingsMargin[0] + settingsMargin[2]
w: rawElementSize[_strWidth] + settingsMargin[3] + settingsMargin[1],
h: rawElementSize[_strHeight] + settingsMargin[0] + settingsMargin[2]
};
var finalizeBlock = function(isX) {
var vars = getScrollbarVars(isX);
@@ -4414,8 +4411,7 @@
doNotScroll[xy] = scrollIfNeeded ? isInView : false;
blockIsEnd = elSize < vpSize ? elementCenterOffset > viewportCenterOffset : elementCenterOffset < viewportCenterOffset;
}
if (blockIsEnd || blockIsCenter)
elementScrollCoordinates[xy] -= ((vpSize / divide) - (elSize / divide)) * (isX && _isRTL && normalizeRTL ? -1 : 1);
elementScrollCoordinates[xy] -= blockIsEnd || blockIsCenter ? ((vpSize / divide) - (elSize / divide)) * (isX && _isRTL && normalizeRTL ? -1 : 1) : 0;
}
};
finalizeBlock(true);
@@ -4429,14 +4425,14 @@
coordinates = elementScrollCoordinates;
}
finalScroll[_strScrollLeft] = getFinalScroll(true, getRawScroll(coordinates).x);
finalScroll[_strScrollTop] = getFinalScroll(false, getRawScroll(coordinates).y);
doScrollLeft = finalScroll[_strScrollLeft] !== undefined;
doScrollTop = finalScroll[_strScrollTop] !== undefined;
if ((doScrollLeft || doScrollTop) && (duration > 0 || durationIsObject)) {
if (durationIsObject)
if (durationIsObject)
_viewportElement.animate(finalScroll, duration);
else {
animationOptions = {
@@ -4804,7 +4800,7 @@
textareaUpdate();
if (sizeAuto)
_base.update();
update();
else
_base.update(_strAuto);
}
+3 -3
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "overlayscrollbars",
"version": "1.5.1",
"version": "1.5.2",
"description": "A javascript scrollbar plugin which hides the native scrollbars and provides custom styleable overlay scrollbars, but keeps the native functionality and feeling.",
"keywords" : [
"overlayscrollbars",