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). Download OverlayScrollbars manually from [Releases](https://github.com/KingSora/OverlayScrollbars/releases).
#### cdn #### 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 #### 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 npm install overlayscrollbars
@@ -97,7 +97,7 @@ $(function() {
## Options ## 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. Take the table below only as a overview of all options.
[Please read the much more detailed documentation](https://kingsora.github.io/OverlayScrollbars/#!documentation). [Please read the much more detailed documentation](https://kingsora.github.io/OverlayScrollbars/#!documentation).
@@ -594,7 +594,8 @@ var extensionObjects = OverlayScrollbars.extension();</pre>
## Future Plans ## Future Plans
- Minimize the code as much as possible. - 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 ## License
+2 -2
View File
@@ -2,13 +2,13 @@
* OverlayScrollbars * OverlayScrollbars
* https://github.com/KingSora/OverlayScrollbars * https://github.com/KingSora/OverlayScrollbars
* *
* Version: 1.5.1 * Version: 1.5.2
* *
* Copyright KingSora. * Copyright KingSora.
* https://github.com/KingSora * https://github.com/KingSora
* *
* Released under the MIT license. * 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
+180 -184
View File
@@ -2,13 +2,13 @@
* OverlayScrollbars * OverlayScrollbars
* https://github.com/KingSora/OverlayScrollbars * https://github.com/KingSora/OverlayScrollbars
* *
* Version: 1.5.1 * Version: 1.5.2
* *
* Copyright KingSora. * Copyright KingSora.
* https://github.com/KingSora * https://github.com/KingSora
* *
* Released under the MIT license. * Released under the MIT license.
* Date: 13.07.2018 * Date: 09.09.2018
*/ */
(function (global, factory) { (function (global, factory) {
@@ -41,6 +41,7 @@
s : 'style', s : 'style',
i : 'id', i : 'id',
l : 'length', l : 'length',
p : 'prototype',
oH : 'offsetHeight', oH : 'offsetHeight',
cH : 'clientHeight', cH : 'clientHeight',
sH : 'scrollHeight', sH : 'scrollHeight',
@@ -212,14 +213,14 @@
// internal IsCallable function // internal IsCallable function
//throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable'); //throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
} }
var proto = LEXICON.p;
var aArgs = Array.prototype.slice.call(arguments, 2); var aArgs = Array[proto].slice.call(arguments, 2);
var fNOP = function() {}; 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) if (func[proto])
fNOP.prototype = func.prototype; // Function.prototype doesn't have a prototype property fNOP[proto] = func[proto]; // Function.prototype doesn't have a prototype property
fBound.prototype = new fNOP(); fBound[proto] = new fNOP();
return fBound; return fBound;
} }
@@ -228,7 +229,7 @@
var JQUERY = window.jQuery; var JQUERY = window.jQuery;
var FRAMEWORK = (function(compatibility) { var FRAMEWORK = (function(compatibility) {
var _rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); var _rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
var _toStr = Object.prototype.toString; var _toStr = Object[LEXICON.p].toString;
var _strSpace = ' '; var _strSpace = ' ';
var _strEmpty = ''; var _strEmpty = '';
var _strScrollLeft = 'scrollLeft'; var _strScrollLeft = 'scrollLeft';
@@ -482,9 +483,10 @@
return false; return false;
var key; var key;
var hasOwnProperty = Object.prototype.hasOwnProperty; var proto = LEXICON.p;
var hasOwnProperty = Object[proto].hasOwnProperty;
var hasOwnConstructor = hasOwnProperty.call(obj, 'constructor'); 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) { if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {
return false; return false;
@@ -797,7 +799,7 @@
} }
} }
FakejQuery.prototype = { FakejQuery[LEXICON.p] = {
//EVENTS: //EVENTS:
@@ -1343,10 +1345,11 @@
var restrictedStringsSplit = " "; var restrictedStringsSplit = " ";
var restrictedStringsPossibilitiesSplit = ":"; var restrictedStringsPossibilitiesSplit = ":";
var classNameAllowedValues = [TYPES.z, TYPES.s]; var classNameAllowedValues = [TYPES.z, TYPES.s];
var booleanAllowedValues = TYPES.b;
var numberAllowedValues = TYPES.n; var numberAllowedValues = TYPES.n;
var booleanNullAllowedValues = [TYPES.z, booleanAllowedValues]; var booleanNullAllowedValues = [TYPES.z, TYPES.b];
var callbackAllowedValues = [TYPES.z, TYPES.f]; 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 resizeAllowedValues = 'n:none b:both h:horizontal v:vertical';
var overflowBehaviorAllowedValues = 'v-h:visible-hidden v-s:visible-scroll s:scroll h:hidden'; var overflowBehaviorAllowedValues = 'v-h:visible-hidden v-s:visible-scroll s:scroll h:hidden';
var scrollbarsVisibilityAllowedValues = 'v:visible h:hidden a:auto'; var scrollbarsVisibilityAllowedValues = 'v:visible h:hidden a:auto';
@@ -1354,15 +1357,15 @@
var optionsDefaultsAndTemplate = { var optionsDefaultsAndTemplate = {
className: ['os-theme-dark', classNameAllowedValues], //null || string className: ['os-theme-dark', classNameAllowedValues], //null || string
resize: ['none', resizeAllowedValues], //none || both || horizontal || vertical || n || b || h || v resize: ['none', resizeAllowedValues], //none || both || horizontal || vertical || n || b || h || v
sizeAutoCapable: [true, booleanAllowedValues], //true || false sizeAutoCapable: booleanTrueTemplate, //true || false
clipAlways: [true, booleanAllowedValues], //true || false clipAlways: booleanTrueTemplate, //true || false
normalizeRTL: [true, booleanAllowedValues], //true || false normalizeRTL: booleanTrueTemplate, //true || false
paddingAbsolute: [false, booleanAllowedValues], //true || false paddingAbsolute: booleanFalseTemplate, //true || false
autoUpdate: [null, booleanNullAllowedValues], //true || false || null autoUpdate: [null, booleanNullAllowedValues], //true || false || null
autoUpdateInterval: [33, numberAllowedValues], //number autoUpdateInterval: [33, numberAllowedValues], //number
nativeScrollbarsOverlaid: { nativeScrollbarsOverlaid: {
showNativeScrollbars: [false, booleanAllowedValues], //true || false showNativeScrollbars: booleanFalseTemplate, //true || false
initialize: [true, booleanAllowedValues] //true || false initialize: booleanTrueTemplate //true || false
}, },
overflowBehavior: { overflowBehavior: {
x: ['scroll', overflowBehaviorAllowedValues], //visible-hidden || visible-scroll || hidden || scroll || v-h || v-s || h || s 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 visibility: ['auto', scrollbarsVisibilityAllowedValues], //visible || hidden || auto || v || h || a
autoHide: ['never', scrollbarsAutoHideAllowedValues], //never || scroll || leave || move || n || s || l || m autoHide: ['never', scrollbarsAutoHideAllowedValues], //never || scroll || leave || move || n || s || l || m
autoHideDelay: [800, numberAllowedValues], //number autoHideDelay: [800, numberAllowedValues], //number
dragScrolling: [true, booleanAllowedValues], //true || false dragScrolling: booleanTrueTemplate, //true || false
clickScrolling: [false, booleanAllowedValues], //true || false clickScrolling: booleanFalseTemplate, //true || false
touchSupport: [true, booleanAllowedValues] //true || false touchSupport: booleanTrueTemplate //true || false
}, },
textarea: { textarea: {
dynWidth: [false, booleanAllowedValues], //true || false dynWidth: booleanFalseTemplate, //true || false
dynHeight: [false, booleanAllowedValues] //true || false dynHeight: booleanFalseTemplate //true || false
}, },
callbacks: { callbacks: {
onInitialized: [null, callbackAllowedValues], //null || function onInitialized: callbackTemplate, //null || function
onInitializationWithdrawn: [null, callbackAllowedValues], //null || function onInitializationWithdrawn: callbackTemplate, //null || function
onDestroyed: [null, callbackAllowedValues], //null || function onDestroyed: callbackTemplate, //null || function
onScrollStart: [null, callbackAllowedValues], //null || function onScrollStart: callbackTemplate, //null || function
onScroll: [null, callbackAllowedValues], //null || function onScroll: callbackTemplate, //null || function
onScrollStop: [null, callbackAllowedValues], //null || function onScrollStop: callbackTemplate, //null || function
onOverflowChanged: [null, callbackAllowedValues], //null || function onOverflowChanged: callbackTemplate, //null || function
onOverflowAmountChanged: [null, callbackAllowedValues], //null || function onOverflowAmountChanged: callbackTemplate, //null || function
onDirectionChanged: [null, callbackAllowedValues], //null || function onDirectionChanged: callbackTemplate, //null || function
onContentSizeChanged: [null, callbackAllowedValues], //null || function onContentSizeChanged: callbackTemplate, //null || function
onHostSizeChanged: [null, callbackAllowedValues], //null || function onHostSizeChanged: callbackTemplate, //null || function
onUpdated: [null, callbackAllowedValues] //null || function onUpdated: callbackTemplate //null || function
} }
}; };
var convert = function(template) { 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 scrollbarDummyElement = framework('<div id="hs-dummy-scrollbar-size"><div style="height: 200%; width: 200%; margin: 10px 0;"></div></div>');
var scrollbarDummyElement0 = scrollbarDummyElement[0]; var scrollbarDummyElement0 = scrollbarDummyElement[0];
var dummyContainerChild = framework(scrollbarDummyElement.children('div').eq(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); bodyElement.append(scrollbarDummyElement);
if(IEBUGFIX === 0)
scrollbarDummyElement.hide().show();
var nativeScrollbarSize = calcNativeScrollbarSize(scrollbarDummyElement0); var nativeScrollbarSize = calcNativeScrollbarSize(scrollbarDummyElement0);
var nativeScrollbarIsOverlaid = { var nativeScrollbarIsOverlaid = {
@@ -1674,18 +1674,7 @@
if(nativeScrollbarIsOverlaid.x && nativeScrollbarIsOverlaid.y) if(nativeScrollbarIsOverlaid.x && nativeScrollbarIsOverlaid.y)
return; return;
function differenceIsBiggerThanOne(valOne, valTwo) { var abs = Math.abs;
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 windowWidth = compatibility.wW(); var windowWidth = compatibility.wW();
var windowHeight = compatibility.wH(); var windowHeight = compatibility.wH();
var windowDpr = getWindowDPR(); var windowDpr = getWindowDPR();
@@ -1701,10 +1690,10 @@
var deltaWRatio = Math.round(newW / (windowWidth / 100.0)); var deltaWRatio = Math.round(newW / (windowWidth / 100.0));
var deltaHRatio = Math.round(newH / (windowHeight / 100.0)); var deltaHRatio = Math.round(newH / (windowHeight / 100.0));
var absDeltaW = Math.abs(deltaW); var absDeltaW = abs(deltaW);
var absDeltaH = Math.abs(deltaH); var absDeltaH = abs(deltaH);
var absDeltaWRatio = Math.abs(deltaWRatio); var absDeltaWRatio = abs(deltaWRatio);
var absDeltaHRatio = Math.abs(deltaHRatio); var absDeltaHRatio = abs(deltaHRatio);
var newDPR = getWindowDPR(); var newDPR = getWindowDPR();
var deltaIsBigger = absDeltaW > 2 && absDeltaH > 2; var deltaIsBigger = absDeltaW > 2 && absDeltaH > 2;
@@ -1731,6 +1720,19 @@
windowDpr = newDPR; 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); framework(window).on('resize', onResize);
})(); })();
@@ -1774,6 +1776,7 @@
var _base = this; var _base = this;
var _strAutoUpdate = 'autoUpdate'; var _strAutoUpdate = 'autoUpdate';
var _strAutoUpdateInterval = _strAutoUpdate + 'Interval'; var _strAutoUpdateInterval = _strAutoUpdate + 'Interval';
var _strLength = LEXICON.l;
var _loopingInstances = [ ]; var _loopingInstances = [ ];
var _loopingInstancesIntervalCache = [ ]; 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. * 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() { var loop = function() {
if(_loopingInstances.length > 0 && _loopIsActive) { if(_loopingInstances[_strLength] > 0 && _loopIsActive) {
_loopID = compatibility.rAF()(function () { _loopID = compatibility.rAF()(function () {
loop(); loop();
}); });
@@ -1797,7 +1800,7 @@
if (timeDelta > _loopInterval) { if (timeDelta > _loopInterval) {
_loopTimeOld = timeNew - (timeDelta % _loopInterval); _loopTimeOld = timeNew - (timeDelta % _loopInterval);
var lowestInterval = _loopIntervalDefault; var lowestInterval = _loopIntervalDefault;
for(var i = 0; i < _loopingInstances.length; i++) { for(var i = 0; i < _loopingInstances[_strLength]; i++) {
var instance = _loopingInstances[i]; var instance = _loopingInstances[i];
if (instance !== undefined) { if (instance !== undefined) {
var instanceOptions = instance.options(); var instanceOptions = instance.options();
@@ -1826,7 +1829,7 @@
if(framework.inArray(instance, _loopingInstances) === -1) { if(framework.inArray(instance, _loopingInstances) === -1) {
_loopingInstances.push(instance); _loopingInstances.push(instance);
_loopingInstancesIntervalCache.push(compatibility.now()); _loopingInstancesIntervalCache.push(compatibility.now());
if (_loopingInstances.length > 0 && !_loopIsActive) { if (_loopingInstances[_strLength] > 0 && !_loopIsActive) {
_loopIsActive = true; _loopIsActive = true;
globals.autoUpdateLoop = _loopIsActive; globals.autoUpdateLoop = _loopIsActive;
loop(); loop();
@@ -1846,7 +1849,7 @@
_loopingInstances.splice(index, 1); _loopingInstances.splice(index, 1);
//correct update loop behavior //correct update loop behavior
if (_loopingInstances.length === 0 && _loopIsActive) { if (_loopingInstances[_strLength] === 0 && _loopIsActive) {
_loopIsActive = false; _loopIsActive = false;
globals.autoUpdateLoop = _loopIsActive; globals.autoUpdateLoop = _loopIsActive;
if(_loopID !== undefined) { if(_loopID !== undefined) {
@@ -1882,6 +1885,7 @@
//make correct instanceof //make correct instanceof
var _base = new window[PLUGINNAME](); var _base = new window[PLUGINNAME]();
var _frameworkProto = framework[LEXICON.p];
//globals: //globals:
var _nativeScrollbarIsOverlaid; var _nativeScrollbarIsOverlaid;
@@ -3041,14 +3045,16 @@
* @param hostSizeChanged True if this method was called due to a host size change. * @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 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 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 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 displayIsHidden = _hostElement.is(':hidden');
var displayIsHiddenChanged = checkCacheSingle(displayIsHidden, _displayIsHiddenCache, force); var displayIsHiddenChanged = checkCacheSingle(displayIsHidden, _displayIsHiddenCache, force);
_displayIsHiddenCache = displayIsHidden; _displayIsHiddenCache = displayIsHidden;
clearTimeout(_swallowedUpdateTimeout); clearTimeout(_swallowedUpdateTimeout);
if (swallow) { if (swallow) {
_swallowedUpdateParams.h = hostSizeChanged; _swallowedUpdateParams.h = hostSizeChanged;
_swallowedUpdateParams.c = contentSizeChanged; _swallowedUpdateParams.c = contentSizeChanged;
@@ -3097,7 +3103,6 @@
freezeResizeObserver(_sizeObserverElement); freezeResizeObserver(_sizeObserverElement);
freezeResizeObserver(_sizeAutoObserverElement); freezeResizeObserver(_sizeAutoObserverElement);
//save current scroll offset //save current scroll offset
var currScroll = { var currScroll = {
l: _viewportElement[_strScrollLeft](), l: _viewportElement[_strScrollLeft](),
@@ -3160,7 +3165,7 @@
//dynWidth: //dynWidth:
var textareaDynWidth = currentPreparedOptionsTextarea.dynWidth; var textareaDynWidth = currentPreparedOptionsTextarea.dynWidth;
var textareaDynWidthChanged = checkCacheSingle(_textareaDynWidthCache, textareaDynHeight); var textareaDynWidthChanged = checkCacheSingle(_textareaDynWidthCache, textareaDynWidth);
//dynHeight: //dynHeight:
var textareaDynHeight = currentPreparedOptionsTextarea.dynHeight; var textareaDynHeight = currentPreparedOptionsTextarea.dynHeight;
@@ -3209,6 +3214,7 @@
_overflowBehaviorCache = extend(true, {}, overflowBehavior); _overflowBehaviorCache = extend(true, {}, overflowBehavior);
_textareaDynWidthCache = textareaDynWidth; _textareaDynWidthCache = textareaDynWidth;
_textareaDynHeightCache = textareaDynHeight; _textareaDynHeightCache = textareaDynHeight;
_hasOverflowCache = _hasOverflowCache || { x: false, y: false };
//set correct class name to the host element //set correct class name to the host element
if (classNameChanged) { if (classNameChanged) {
@@ -3382,6 +3388,8 @@
//set info for padding //set info for padding
_paddingX = padding.l + padding.r; _paddingX = padding.l + padding.r;
_paddingY = padding.t + padding.b; _paddingY = padding.t + padding.b;
padding.ax = paddingAbsolute ? _paddingX : 0;
padding.ay = paddingAbsolute ? _paddingY : 0;
padding.c = checkCacheTRBL(padding, _cssPaddingCache); padding.c = checkCacheTRBL(padding, _cssPaddingCache);
//set info for border //set info for border
@@ -3451,22 +3459,24 @@
if (heightAuto && (heightAutoChanged || paddingAbsoluteChanged || boxSizingChanged || cssMaxValue.c || padding.c || border.c)) { if (heightAuto && (heightAutoChanged || paddingAbsoluteChanged || boxSizingChanged || cssMaxValue.c || padding.c || border.c)) {
if (cssMaxValue.cw) if (cssMaxValue.cw)
contentElementCSS[_strMaxMinus + _strHeight] = contentElementCSS[_strMaxMinus + _strHeight] =
(cssMaxValue.ch ? (cssMaxValue.ih - (paddingAbsolute ? _paddingY : 0) + (cssMaxValue.ch ? (cssMaxValue.ih - padding.ay + (_isBorderBox ? -_borderY : _paddingY))
(_isBorderBox ? -_borderY : _paddingY)) : _strEmpty); : _strEmpty);
contentElementCSS[_strHeight] = _strAuto; contentElementCSS[_strHeight] = _strAuto;
} else if (heightAutoChanged || paddingAbsoluteChanged) { }
else if (heightAutoChanged || paddingAbsoluteChanged) {
contentElementCSS[_strMaxMinus + _strHeight] = _strEmpty; contentElementCSS[_strMaxMinus + _strHeight] = _strEmpty;
contentElementCSS[_strHeight] = _strHundredPercent; contentElementCSS[_strHeight] = _strHundredPercent;
} }
if (widthAuto && (widthAutoChanged || paddingAbsoluteChanged || boxSizingChanged || cssMaxValue.c || padding.c || border.c || cssDirectionChanged)) { if (widthAuto && (widthAutoChanged || paddingAbsoluteChanged || boxSizingChanged || cssMaxValue.c || padding.c || border.c || cssDirectionChanged)) {
if (cssMaxValue.cw) if (cssMaxValue.cw)
contentElementCSS[_strMaxMinus + _strWidth] = contentElementCSS[_strMaxMinus + _strWidth] =
(cssMaxValue.cw ? (cssMaxValue.iw - (paddingAbsolute ? _paddingX : 0) + (cssMaxValue.cw ? (cssMaxValue.iw - padding.ax + (_isBorderBox ? -_borderX : _paddingX)) +
(_isBorderBox ? -_borderX : _paddingX)) + (_nativeScrollbarIsOverlaid.y /*&& _hasOverflowCache.y && widthAuto */ ? _overlayScrollbarDummySize.y : 0)
(_nativeScrollbarIsOverlaid.y /*&& _hasOverflowCache.y && widthAuto */ ? _overlayScrollbarDummySize.y : 0) : _strEmpty); : _strEmpty);
contentElementCSS[_strWidth] = _strAuto; contentElementCSS[_strWidth] = _strAuto;
contentGlueElementCSS[_strMaxMinus + _strWidth] = _strHundredPercent; //IE Fix contentGlueElementCSS[_strMaxMinus + _strWidth] = _strHundredPercent; //IE Fix
} else if (widthAutoChanged || paddingAbsoluteChanged) { }
else if (widthAutoChanged || paddingAbsoluteChanged) {
contentElementCSS[_strMaxMinus + _strWidth] = _strEmpty; contentElementCSS[_strMaxMinus + _strWidth] = _strEmpty;
contentElementCSS[_strWidth] = _strHundredPercent; contentElementCSS[_strWidth] = _strHundredPercent;
contentElementCSS[_strFloat] = _strEmpty; contentElementCSS[_strFloat] = _strEmpty;
@@ -3491,14 +3501,12 @@
_contentGlueElement.css(contentGlueElementCSS); _contentGlueElement.css(contentGlueElementCSS);
_contentElement.css(contentElementCSS); _contentElement.css(contentElementCSS);
//CHECKPOINT HERE ~ //CHECKPOINT HERE ~
contentElementCSS = {}; contentElementCSS = {};
contentGlueElementCSS = {}; 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 [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 strOverflow = 'overflow';
var strOverflowX = strOverflow + '-x'; var strOverflowX = strOverflow + '-x';
var strOverflowY = strOverflow + '-y'; var strOverflowY = strOverflow + '-y';
@@ -3554,8 +3562,8 @@
h: hostElement[LEXICON.cH] h: hostElement[LEXICON.cH]
}; };
var contentGlueSize = { var contentGlueSize = {
w: Math.max(contentClientSize.w + (paddingAbsolute ? _paddingX : 0), hostSize.w - _paddingX) - (textareaDynWidth ? (_isTextarea && widthAuto ? _marginX + (!_isBorderBox ? _paddingX + _borderX : 0) : 0) : 0), 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 + (paddingAbsolute ? _paddingY : 0), hostSize.h - _paddingY) h: Math.max(contentClientSize.h + padding.ay, hostSize.h - _paddingY)
}; };
contentGlueSize.c = checkCacheDouble(contentGlueSize, _contentGlueSizeCache, force); contentGlueSize.c = checkCacheDouble(contentGlueSize, _contentGlueSizeCache, force);
_contentGlueSizeCache = contentGlueSize; _contentGlueSizeCache = contentGlueSize;
@@ -3661,8 +3669,8 @@
* }; * };
*/ */
var overflowAmount = { var overflowAmount = {
x: Math.max(0, Math.round((contentScrollSize.w - hostSize.w + (paddingAbsolute ? _paddingX : 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 + (paddingAbsolute ? _paddingY : 0)) * 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); var hideOverflowForceTextarea = _isTextarea && (_viewportSize.w === 0 || _viewportSize.h === 0);
if (hideOverflowForceTextarea) { if (hideOverflowForceTextarea) {
@@ -4104,13 +4112,13 @@
} }
//fix body min size //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. //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) if (!_bodyMinSizeCache.f)
bodyMinSizeChanged(); bodyMinSizeChanged();
if (_nativeScrollbarIsOverlaid.y && hasOverflow.x) if (_nativeScrollbarIsOverlaid.y && _hasOverflowCache.x)
_contentElement.css(_strMinMinus + _strWidth, _bodyMinSizeCache.w + _overlayScrollbarDummySize.y); _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); _contentElement.css(_strMinMinus + _strHeight, _bodyMinSizeCache.h + _overlayScrollbarDummySize.x);
_bodyMinSizeCache.c = false; _bodyMinSizeCache.c = false;
} }
@@ -4182,25 +4190,45 @@
*/ */
function initScrollbarInteractivity(isHorizontal) { function initScrollbarInteractivity(isHorizontal) {
var scrollbarVars = getScrollbarVars(isHorizontal); var scrollbarVars = getScrollbarVars(isHorizontal);
var insideIFrame = _windowElement.top !== _windowElement;
var mouseDownScroll; var mouseDownScroll;
var mouseDownOffset; var mouseDownOffset;
var xy = scrollbarVars.xy; var xy = scrollbarVars.xy;
var XY = scrollbarVars.XY;
var scroll = _strScroll + scrollbarVars.LT; var scroll = _strScroll + scrollbarVars.LT;
var strActive = 'active'; var strActive = 'active';
var trackTimeout; var trackTimeout;
var scrollDurationFactor = 1; var scrollDurationFactor = 1;
var increaseDecreaseScrollAmountKeyCodes = [ 16, 17 ]; //shift, ctrl var increaseDecreaseScrollAmountKeyCodes = [ 16, 17 ]; //shift, ctrl
var increaseTrackScrollAmount = function () { function increaseTrackScrollAmount() {
scrollDurationFactor = 0.5; scrollDurationFactor = 0.5;
}; };
var decreaseTrackScrollAmount = function () { function decreaseTrackScrollAmount() {
scrollDurationFactor = 1; 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 trackLength = scrollbarVars.i.tl;
var handleLength = scrollbarVars.i.hl; var handleLength = scrollbarVars.i.hl;
var scrollRange = scrollbarVars.i.ms; 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 scrollDeltaPercent = scrollRaw / (trackLength - handleLength);
var scrollDelta = (scrollRange * scrollDeltaPercent); var scrollDelta = (scrollRange * scrollDeltaPercent);
scrollDelta = isFinite(scrollDelta) ? scrollDelta : 0; scrollDelta = isFinite(scrollDelta) ? scrollDelta : 0;
@@ -4211,12 +4239,9 @@
if (!_supportPassiveEvents) if (!_supportPassiveEvents)
compatibility.prvD(event); compatibility.prvD(event);
}; };
var documentMouseTouchUp = function (event) { function documentMouseTouchUp(event) {
event = event || event.originalEvent; 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(_bodyElement, _classNameDragging);
removeClass(scrollbarVars.h, strActive); removeClass(scrollbarVars.h, strActive);
removeClass(scrollbarVars.t, strActive); removeClass(scrollbarVars.t, strActive);
@@ -4237,31 +4262,22 @@
trackTimeout = undefined; 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 mouse is outside host element
if (!mouseInsideHost) if (!mouseInsideHost)
hostOnMouseLeave(); hostOnMouseLeave();
if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove) if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove)
refreshScrollbarsAutoHide(false); refreshScrollbarsAutoHide(false);
}; };
var documentKeyDown = function (event) { function onHandleMouseTouchDown(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) {
mouseDownScroll = _viewportElement[scroll](); mouseDownScroll = _viewportElement[scroll]();
mouseDownScroll = mouseDownScroll === undefined ? 0 : mouseDownScroll; mouseDownScroll = mouseDownScroll === undefined ? 0 : mouseDownScroll;
if (_isRTL && isHorizontal && !_rtlScrollBehavior.n || !_isRTL) if (_isRTL && isHorizontal && !_rtlScrollBehavior.n || !_isRTL)
mouseDownScroll = mouseDownScroll < 0 ? 0 : mouseDownScroll; 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(_bodyElement, _classNameDragging);
addClass(scrollbarVars.h, strActive); addClass(scrollbarVars.h, strActive);
@@ -4275,11 +4291,11 @@
compatibility.prvD(event); compatibility.prvD(event);
compatibility.stpP(event); compatibility.stpP(event);
}; };
scrollbarVars.h.on(_strMouseTouchDownEvent, function (event) { scrollbarVars.h.on(_strMouseTouchDownEvent, function(event) {
if (onMouseTouchDownContinue(event)) if (onMouseTouchDownContinue(event))
onHandleMouseTouchDown(event); onHandleMouseTouchDown(event);
}); });
scrollbarVars.t.on(_strMouseTouchDownEvent, function (event) { scrollbarVars.t.on(_strMouseTouchDownEvent, function(event) {
if (onMouseTouchDownContinue(event)) { if (onMouseTouchDownContinue(event)) {
var scrollDistance = _viewportSize[scrollbarVars._wh]; var scrollDistance = _viewportSize[scrollbarVars._wh];
var trackOffset = scrollbarVars.t.offset()[scrollbarVars.lt]; var trackOffset = scrollbarVars.t.offset()[scrollbarVars.lt];
@@ -4310,7 +4326,7 @@
instantScrollPosition = (scrollRange - instantScrollPosition); instantScrollPosition = (scrollRange - instantScrollPosition);
if(instantScrollTransition) { if(instantScrollTransition) {
scrollObj.n = false; scrollObj.n = false;
scrollObj[scrollbarVars.xy] = instantScrollPosition; scrollObj[xy] = instantScrollPosition;
_base.scroll(scrollObj, 130, easing, function() { onHandleMouseTouchDown(event); }); _base.scroll(scrollObj, 130, easing, function() { onHandleMouseTouchDown(event); });
} }
else { else {
@@ -4322,7 +4338,7 @@
decreaseScroll = isFirstIteration ? decreaseScrollCondition : decreaseScroll; decreaseScroll = isFirstIteration ? decreaseScrollCondition : decreaseScroll;
finishedCondition = rtlIsNormal ? decreaseScroll ? handleOffset + handleLength >= mouseOffset : handleOffset <= mouseOffset : decreaseScroll ? handleOffset <= mouseOffset : handleOffset + handleLength >= mouseOffset; 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.scrollStop();
_base.scroll(scrollObj, scrollDuration, easing); _base.scroll(scrollObj, scrollDuration, easing);
@@ -4354,18 +4370,18 @@
compatibility.prvD(event); compatibility.prvD(event);
compatibility.stpP(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) { if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove) {
_scrollbarsAutoHideFlagScrollAndHovered = true; _scrollbarsAutoHideFlagScrollAndHovered = true;
refreshScrollbarsAutoHide(true); refreshScrollbarsAutoHide(true);
} }
}, function () { }, function() {
if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove) { if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove) {
_scrollbarsAutoHideFlagScrollAndHovered = false; _scrollbarsAutoHideFlagScrollAndHovered = false;
refreshScrollbarsAutoHide(false); refreshScrollbarsAutoHide(false);
} }
}); });
scrollbarVars.s.on(_strMouseTouchDownEvent, function (event) { scrollbarVars.s.on(_strMouseTouchDownEvent, function(event) {
compatibility.stpP(event); compatibility.stpP(event);
}); });
} }
@@ -4852,21 +4868,21 @@
* jQuery addClass method shortcut. * jQuery addClass method shortcut.
*/ */
function addClass(el, classes) { function addClass(el, classes) {
return framework.prototype.addClass.call(el, classes); return _frameworkProto.addClass.call(el, classes);
} }
/** /**
* jQuery removeClass method shortcut. * jQuery removeClass method shortcut.
*/ */
function removeClass(el, classes) { function removeClass(el, classes) {
return framework.prototype.removeClass.call(el, classes); return _frameworkProto.removeClass.call(el, classes);
} }
/** /**
* jQuery remove method shortcut. * jQuery remove method shortcut.
*/ */
function remove(el) { 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. * @returns {*} The first element which is a child of the given element and matches the givens selector.
*/ */
function findFirst(el, 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. * Updates the plugin and DOM to the current options.
* This method should only be called if a update is 100% required. * 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. * @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. * 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) { _base.update = function (force) {
var attrsChanged; var attrsChanged;
var contentSizeC; var contentSizeC;
var isZoom = force === 'zoom'; var isString = type(force) == TYPES.s;
var imgElementSelector = 'img'; var imgElementSelector = 'img';
var imgElementLoadEvent = 'load'; var imgElementLoadEvent = 'load';
if (force === _strAuto) { if(isString) {
if (force.indexOf(_strAuto) === 0) {
attrsChanged = meaningfulAttrsChanged(); attrsChanged = meaningfulAttrsChanged();
contentSizeC = updateAutoContentSizeChanged(); contentSizeC = updateAutoContentSizeChanged();
if (attrsChanged || contentSizeC) if (attrsChanged || contentSizeC)
update(false, contentSizeC); update(false, contentSizeC, false, force.slice(-1) == "+");
} }
else if (isZoom) { else if (force === 'zoom')
update(true, true); update(true, true);
} }
else { else {
force = _isSleeping || force; force = _isSleeping || force;
_isSleeping = false; _isSleeping = false;
update(false, false, force); update(false, false, force, true);
} }
if(!_isTextarea && !isZoom) { if(!_isTextarea) {
_contentElement.find(imgElementSelector).each(function(i, el) { _contentElement.find(imgElementSelector).each(function(i, el) {
var index = compatibility.inA(el, _imgs); var index = compatibility.inA(el, _imgs);
if (index === -1) { if (index === -1)
el = framework(el); framework(el).off(imgElementLoadEvent, imgOnLoad).on(imgElementLoadEvent, imgOnLoad);
el.off(imgElementLoadEvent, imgOnLoad).on(imgElementLoadEvent, imgOnLoad);
}
}); });
} }
}; };
@@ -5172,6 +5187,7 @@
var strAlways = 'always'; var strAlways = 'always';
var strNever = 'never'; var strNever = 'never';
var strIfNeeded = 'ifneeded'; var strIfNeeded = 'ifneeded';
var strLength = LEXICON.l;
var settingsAxis; var settingsAxis;
var settingsScroll; var settingsScroll;
var settingsBlock; var settingsBlock;
@@ -5185,7 +5201,7 @@
var possibleElementIsJQuery = possibleElement instanceof framework || JQUERY ? possibleElement instanceof JQUERY : false; var possibleElementIsJQuery = possibleElement instanceof framework || JQUERY ? possibleElement instanceof JQUERY : false;
var possibleElementIsHTMLElement = possibleElementIsJQuery ? false : isHTMLElement(possibleElement); var possibleElementIsHTMLElement = possibleElementIsJQuery ? false : isHTMLElement(possibleElement);
var checkSettingsStringValue = function (currValue, allowedValues) { var checkSettingsStringValue = function (currValue, allowedValues) {
for (i = 0; i < allowedValues.length; i++) { for (i = 0; i < allowedValues[strLength]; i++) {
if (currValue === allowedValues[i]) if (currValue === allowedValues[i])
return true; return true;
} }
@@ -5193,7 +5209,7 @@
}; };
var getRawScroll = function (coordinates) { var getRawScroll = function (coordinates) {
var rawScroll = {}; var rawScroll = {};
if (type(coordinates) == TYPES.a && coordinates.length > 0) { if (type(coordinates) == TYPES.a && coordinates[strLength] > 0) {
rawScroll.x = coordinates[0]; rawScroll.x = coordinates[0];
rawScroll.y = coordinates[1]; rawScroll.y = coordinates[1];
} }
@@ -5214,7 +5230,7 @@
} }
var getRawScrollValue = function (isX) { var getRawScrollValue = function (isX) {
var coordinateProps = isX ? coordinatesXAxisProps : coordinatesYAxisProps; var coordinateProps = isX ? coordinatesXAxisProps : coordinatesYAxisProps;
for (i = 0; i < coordinateProps.length; i++) { for (i = 0; i < coordinateProps[strLength]; i++) {
if (coordinateProps[i] in coordinates) { if (coordinateProps[i] in coordinates) {
return coordinates[coordinateProps[i]]; return coordinates[coordinateProps[i]];
} }
@@ -5226,6 +5242,9 @@
return rawScroll; return rawScroll;
}; };
var getFinalScroll = function (isX, rawScroll) { var getFinalScroll = function (isX, rawScroll) {
var isString = type(rawScroll) == TYPES.s;
if(isString)
_base.update(_strAuto + "+");
var operator; var operator;
var amount; var amount;
var scrollInfo = isX ? _scrollHorizontalInfo : _scrollVerticalInfo; var scrollInfo = isX ? _scrollHorizontalInfo : _scrollVerticalInfo;
@@ -5236,11 +5255,11 @@
var isRTLisX = _isRTL && isX; var isRTLisX = _isRTL && isX;
var normalizeShortcuts = isRTLisX && _rtlScrollBehavior.n && !normalizeRTL; var normalizeShortcuts = isRTLisX && _rtlScrollBehavior.n && !normalizeRTL;
var strReplace = 'replace'; var strReplace = 'replace';
if (type(rawScroll) == TYPES.s) { if (isString) {
//check operator //check operator
if (rawScroll.length > 2) { if (rawScroll[strLength] > 2) {
var possibleOperator = rawScroll.substr(0, 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]) { if (possibleOperator === coordinatesOperators[i]) {
operator = coordinatesOperators[i]; operator = coordinatesOperators[i];
break; break;
@@ -5260,11 +5279,11 @@
rawScroll = rawScroll[strReplace](/vh/g, mult + _viewportSize.h); rawScroll = rawScroll[strReplace](/vh/g, mult + _viewportSize.h);
amount = parseIntToZeroOrNumber(window.parseFloat(window.eval(rawScroll)).toFixed()); amount = parseIntToZeroOrNumber(window.parseFloat(window.eval(rawScroll)).toFixed());
} }
else if (type(rawScroll) == TYPES.n) { else {
amount = rawScroll; 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 normalizeIsRTLisX = normalizeRTL && isRTLisX;
var operatorCurrScroll = currScroll * (normalizeIsRTLisX && _rtlScrollBehavior.n ? -1 : 1); var operatorCurrScroll = currScroll * (normalizeIsRTLisX && _rtlScrollBehavior.n ? -1 : 1);
var invert = normalizeIsRTLisX && _rtlScrollBehavior.i; var invert = normalizeIsRTLisX && _rtlScrollBehavior.i;
@@ -5287,23 +5306,11 @@
finalValue = amount; finalValue = amount;
break; break;
} }
if (invert) finalValue = invert ? maxScroll - finalValue : finalValue;
finalValue = maxScroll - finalValue; finalValue *= negate ? -1 : 1;
if (negate) finalValue = isRTLisX && _rtlScrollBehavior.n ? Math.min(0, Math.max(maxScroll, finalValue)) : Math.max(0, Math.min(maxScroll, finalValue));
finalValue *= -1;
if (isRTLisX && _rtlScrollBehavior.n) {
finalValue = Math.max(maxScroll, finalValue);
finalValue = Math.min(0, finalValue);
} }
else { return finalValue === currScroll ? undefined : finalValue;
finalValue = Math.min(maxScroll, finalValue);
finalValue = Math.max(0, finalValue);
}
if (finalValue === currScroll)
finalValue = undefined;
}
return finalValue;
}; };
var getPerAxisValue = function (value, valueInternalType, defaultValue, allowedValues) { var getPerAxisValue = function (value, valueInternalType, defaultValue, allowedValues) {
var resultDefault = [ defaultValue, defaultValue ]; var resultDefault = [ defaultValue, defaultValue ];
@@ -5316,7 +5323,7 @@
value = [value, value]; value = [value, value];
} }
else if (valueType == TYPES.a) { else if (valueType == TYPES.a) {
valueArrLength = value.length; valueArrLength = value[strLength];
if (valueArrLength > 2 || valueArrLength < 1) if (valueArrLength > 2 || valueArrLength < 1)
value = resultDefault; value = resultDefault;
else { else {
@@ -5342,24 +5349,21 @@
var currValue; var currValue;
var currValueType; var currValueType;
var valueDirections = [ _strTop, _strRight, _strBottom, _strLeft ]; var valueDirections = [ _strTop, _strRight, _strBottom, _strLeft ];
for(i = 0; i < marginTopRightBottomLeftArray.length; i++) { for(i = 0; i < marginTopRightBottomLeftArray[strLength]; i++) {
if(i === valueDirections.length) if(i === valueDirections[strLength])
break; break;
currValue = marginTopRightBottomLeftArray[i]; currValue = marginTopRightBottomLeftArray[i];
currValueType = type(currValue); currValueType = type(currValue);
if(currValueType == TYPES.b) if(currValueType == TYPES.b)
result.push(currValue ? parseIntToZeroOrNumber(finalElement.css(_strMarginMinus + valueDirections[i])) : 0); result.push(currValue ? parseIntToZeroOrNumber(finalElement.css(_strMarginMinus + valueDirections[i])) : 0);
else if(currValueType == TYPES.n)
result.push(currValue);
else else
result.push(0); result.push(currValueType == TYPES.n ? currValue : 0);
} }
return result; return result;
}; };
if (possibleElementIsJQuery || possibleElementIsHTMLElement) { if (possibleElementIsJQuery || possibleElementIsHTMLElement) {
//get settings //get settings
var margin = coordinatesIsElementObj ? coordinates.margin : 0; var margin = coordinatesIsElementObj ? coordinates.margin : 0;
var axis = coordinatesIsElementObj ? coordinates.axis : 0; var axis = coordinatesIsElementObj ? coordinates.axis : 0;
var scroll = coordinatesIsElementObj ? coordinates.scroll : 0; var scroll = coordinatesIsElementObj ? coordinates.scroll : 0;
@@ -5368,14 +5372,16 @@
var marginType = type(margin); var marginType = type(margin);
var marginLength; var marginLength;
finalElement = possibleElementIsJQuery ? possibleElement : framework(possibleElement); finalElement = possibleElementIsJQuery ? possibleElement : framework(possibleElement);
if (finalElement.length === 0) if (finalElement[strLength] === 0)
return; return;
_base.update(_strAuto + "+");
//margin can be [ boolean, number, array of 2, array of 4, object ] //margin can be [ boolean, number, array of 2, array of 4, object ]
if (marginType == TYPES.n || marginType == TYPES.b) if (marginType == TYPES.n || marginType == TYPES.b)
margin = generateMargin([margin, margin, margin, margin]); margin = generateMargin([margin, margin, margin, margin]);
else if (marginType == TYPES.a) { else if (marginType == TYPES.a) {
marginLength = margin.length; marginLength = margin[strLength];
if(marginLength === 2) if(marginLength === 2)
margin = generateMargin([margin[0], margin[1], margin[0], margin[1]]); margin = generateMargin([margin[0], margin[1], margin[0], margin[1]]);
else if(marginLength >= 4) else if(marginLength >= 4)
@@ -5394,19 +5400,21 @@
settingsBlock = getPerAxisValue(block, TYPES.s, strBegin, elementObjSettingsBlockValues); settingsBlock = getPerAxisValue(block, TYPES.s, strBegin, elementObjSettingsBlockValues);
settingsMargin = margin; 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, l: _scrollHorizontalInfo.cs,
t: _scrollVerticalInfo.cs t: _scrollVerticalInfo.cs
}; };
// 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 = { var doNotScroll = {
x : settingsScroll.x == strNever || settingsAxis == _strY, x : settingsScroll.x == strNever || settingsAxis == _strY,
y : settingsScroll.y == strNever || settingsAxis == _strX y : settingsScroll.y == strNever || settingsAxis == _strX
}; };
elementOffset[_strTop] -= settingsMargin[0];
elementOffset[_strLeft] -= settingsMargin[3];
var elementScrollCoordinates = { var elementScrollCoordinates = {
x: Math.round(elementOffset[_strLeft] - viewportOffset[_strLeft] + viewportScroll.l), x: Math.round(elementOffset[_strLeft] - viewportOffset[_strLeft] + viewportScroll.l),
y: Math.round(elementOffset[_strTop] - viewportOffset[_strTop] + viewportScroll.t) y: Math.round(elementOffset[_strTop] - viewportOffset[_strTop] + viewportScroll.t)
@@ -5423,24 +5431,13 @@
//measuring is required //measuring is required
if (settingsBlock.x != strBegin || settingsBlock.y != strBegin || settingsScroll.x == strIfNeeded || settingsScroll.y == strIfNeeded || _isRTL) { if (settingsBlock.x != strBegin || settingsBlock.y != strBegin || settingsScroll.x == strIfNeeded || settingsScroll.y == strIfNeeded || _isRTL) {
var measuringElm = finalElement[0]; var measuringElm = finalElement[0];
var rawElementSize = {}; var rawElementSize = _supportTransform ? measuringElm.getBoundingClientRect() : {
var rect; width : measuringElm[LEXICON.oW],
if (_supportTransform) { height : measuringElm[LEXICON.oH]
rect = measuringElm.getBoundingClientRect();
rawElementSize = {
w: rect[_strWidth],
h: rect[_strHeight]
}; };
}
else {
rawElementSize = {
w: measuringElm[LEXICON.oW],
h: measuringElm[LEXICON.oH]
};
}
var elementSize = { var elementSize = {
w: rawElementSize.w + settingsMargin[3] + settingsMargin[1], w: rawElementSize[_strWidth] + settingsMargin[3] + settingsMargin[1],
h: rawElementSize.h + settingsMargin[0] + settingsMargin[2] h: rawElementSize[_strHeight] + settingsMargin[0] + settingsMargin[2]
}; };
var finalizeBlock = function(isX) { var finalizeBlock = function(isX) {
var vars = getScrollbarVars(isX); var vars = getScrollbarVars(isX);
@@ -5471,8 +5468,7 @@
doNotScroll[xy] = scrollIfNeeded ? isInView : false; doNotScroll[xy] = scrollIfNeeded ? isInView : false;
blockIsEnd = elSize < vpSize ? elementCenterOffset > viewportCenterOffset : elementCenterOffset < viewportCenterOffset; blockIsEnd = elSize < vpSize ? elementCenterOffset > viewportCenterOffset : elementCenterOffset < viewportCenterOffset;
} }
if (blockIsEnd || blockIsCenter) elementScrollCoordinates[xy] -= blockIsEnd || blockIsCenter ? ((vpSize / divide) - (elSize / divide)) * (isX && _isRTL && normalizeRTL ? -1 : 1) : 0;
elementScrollCoordinates[xy] -= ((vpSize / divide) - (elSize / divide)) * (isX && _isRTL && normalizeRTL ? -1 : 1);
} }
}; };
finalizeBlock(true); finalizeBlock(true);
@@ -5861,7 +5857,7 @@
textareaUpdate(); textareaUpdate();
if (sizeAuto) if (sizeAuto)
_base.update(); update();
else else
_base.update(_strAuto); _base.update(_strAuto);
} }
+3 -3
View File
File diff suppressed because one or more lines are too long
+176 -180
View File
@@ -2,13 +2,13 @@
* OverlayScrollbars * OverlayScrollbars
* https://github.com/KingSora/OverlayScrollbars * https://github.com/KingSora/OverlayScrollbars
* *
* Version: 1.5.1 * Version: 1.5.2
* *
* Copyright KingSora. * Copyright KingSora.
* https://github.com/KingSora * https://github.com/KingSora
* *
* Released under the MIT license. * Released under the MIT license.
* Date: 13.07.2018 * Date: 09.09.2018
*/ */
(function (global, factory) { (function (global, factory) {
@@ -41,6 +41,7 @@
s : 'style', s : 'style',
i : 'id', i : 'id',
l : 'length', l : 'length',
p : 'prototype',
oH : 'offsetHeight', oH : 'offsetHeight',
cH : 'clientHeight', cH : 'clientHeight',
sH : 'scrollHeight', sH : 'scrollHeight',
@@ -159,6 +160,7 @@
// Calculate pageX/Y if not native supported // Calculate pageX/Y if not native supported
if (!event[strPage + strX] && event[strClient + strX] && event[strClient + strX] != null) { if (!event[strPage + strX] && event[strClient + strX] && event[strClient + strX] != null) {
return { return {
x : event[strClient + strX] + x : event[strClient + strX] +
(doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.scrollLeft || body && body.scrollLeft || 0) -
@@ -211,14 +213,14 @@
// internal IsCallable function // internal IsCallable function
//throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable'); //throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
} }
var proto = LEXICON.p;
var aArgs = Array.prototype.slice.call(arguments, 2); var aArgs = Array[proto].slice.call(arguments, 2);
var fNOP = function() {}; 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) if (func[proto])
fNOP.prototype = func.prototype; // Function.prototype doesn't have a prototype property fNOP[proto] = func[proto]; // Function.prototype doesn't have a prototype property
fBound.prototype = new fNOP(); fBound[proto] = new fNOP();
return fBound; return fBound;
} }
@@ -286,10 +288,11 @@
var restrictedStringsSplit = " "; var restrictedStringsSplit = " ";
var restrictedStringsPossibilitiesSplit = ":"; var restrictedStringsPossibilitiesSplit = ":";
var classNameAllowedValues = [TYPES.z, TYPES.s]; var classNameAllowedValues = [TYPES.z, TYPES.s];
var booleanAllowedValues = TYPES.b;
var numberAllowedValues = TYPES.n; var numberAllowedValues = TYPES.n;
var booleanNullAllowedValues = [TYPES.z, booleanAllowedValues]; var booleanNullAllowedValues = [TYPES.z, TYPES.b];
var callbackAllowedValues = [TYPES.z, TYPES.f]; 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 resizeAllowedValues = 'n:none b:both h:horizontal v:vertical';
var overflowBehaviorAllowedValues = 'v-h:visible-hidden v-s:visible-scroll s:scroll h:hidden'; var overflowBehaviorAllowedValues = 'v-h:visible-hidden v-s:visible-scroll s:scroll h:hidden';
var scrollbarsVisibilityAllowedValues = 'v:visible h:hidden a:auto'; var scrollbarsVisibilityAllowedValues = 'v:visible h:hidden a:auto';
@@ -297,15 +300,15 @@
var optionsDefaultsAndTemplate = { var optionsDefaultsAndTemplate = {
className: ['os-theme-dark', classNameAllowedValues], //null || string className: ['os-theme-dark', classNameAllowedValues], //null || string
resize: ['none', resizeAllowedValues], //none || both || horizontal || vertical || n || b || h || v resize: ['none', resizeAllowedValues], //none || both || horizontal || vertical || n || b || h || v
sizeAutoCapable: [true, booleanAllowedValues], //true || false sizeAutoCapable: booleanTrueTemplate, //true || false
clipAlways: [true, booleanAllowedValues], //true || false clipAlways: booleanTrueTemplate, //true || false
normalizeRTL: [true, booleanAllowedValues], //true || false normalizeRTL: booleanTrueTemplate, //true || false
paddingAbsolute: [false, booleanAllowedValues], //true || false paddingAbsolute: booleanFalseTemplate, //true || false
autoUpdate: [null, booleanNullAllowedValues], //true || false || null autoUpdate: [null, booleanNullAllowedValues], //true || false || null
autoUpdateInterval: [33, numberAllowedValues], //number autoUpdateInterval: [33, numberAllowedValues], //number
nativeScrollbarsOverlaid: { nativeScrollbarsOverlaid: {
showNativeScrollbars: [false, booleanAllowedValues], //true || false showNativeScrollbars: booleanFalseTemplate, //true || false
initialize: [true, booleanAllowedValues] //true || false initialize: booleanTrueTemplate //true || false
}, },
overflowBehavior: { overflowBehavior: {
x: ['scroll', overflowBehaviorAllowedValues], //visible-hidden || visible-scroll || hidden || scroll || v-h || v-s || h || s 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 visibility: ['auto', scrollbarsVisibilityAllowedValues], //visible || hidden || auto || v || h || a
autoHide: ['never', scrollbarsAutoHideAllowedValues], //never || scroll || leave || move || n || s || l || m autoHide: ['never', scrollbarsAutoHideAllowedValues], //never || scroll || leave || move || n || s || l || m
autoHideDelay: [800, numberAllowedValues], //number autoHideDelay: [800, numberAllowedValues], //number
dragScrolling: [true, booleanAllowedValues], //true || false dragScrolling: booleanTrueTemplate, //true || false
clickScrolling: [false, booleanAllowedValues], //true || false clickScrolling: booleanFalseTemplate, //true || false
touchSupport: [true, booleanAllowedValues] //true || false touchSupport: booleanTrueTemplate //true || false
}, },
textarea: { textarea: {
dynWidth: [false, booleanAllowedValues], //true || false dynWidth: booleanFalseTemplate, //true || false
dynHeight: [false, booleanAllowedValues] //true || false dynHeight: booleanFalseTemplate //true || false
}, },
callbacks: { callbacks: {
onInitialized: [null, callbackAllowedValues], //null || function onInitialized: callbackTemplate, //null || function
onInitializationWithdrawn: [null, callbackAllowedValues], //null || function onInitializationWithdrawn: callbackTemplate, //null || function
onDestroyed: [null, callbackAllowedValues], //null || function onDestroyed: callbackTemplate, //null || function
onScrollStart: [null, callbackAllowedValues], //null || function onScrollStart: callbackTemplate, //null || function
onScroll: [null, callbackAllowedValues], //null || function onScroll: callbackTemplate, //null || function
onScrollStop: [null, callbackAllowedValues], //null || function onScrollStop: callbackTemplate, //null || function
onOverflowChanged: [null, callbackAllowedValues], //null || function onOverflowChanged: callbackTemplate, //null || function
onOverflowAmountChanged: [null, callbackAllowedValues], //null || function onOverflowAmountChanged: callbackTemplate, //null || function
onDirectionChanged: [null, callbackAllowedValues], //null || function onDirectionChanged: callbackTemplate, //null || function
onContentSizeChanged: [null, callbackAllowedValues], //null || function onContentSizeChanged: callbackTemplate, //null || function
onHostSizeChanged: [null, callbackAllowedValues], //null || function onHostSizeChanged: callbackTemplate, //null || function
onUpdated: [null, callbackAllowedValues] //null || function onUpdated: callbackTemplate //null || function
} }
}; };
var convert = function(template) { 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 scrollbarDummyElement = framework('<div id="hs-dummy-scrollbar-size"><div style="height: 200%; width: 200%; margin: 10px 0;"></div></div>');
var scrollbarDummyElement0 = scrollbarDummyElement[0]; var scrollbarDummyElement0 = scrollbarDummyElement[0];
var dummyContainerChild = framework(scrollbarDummyElement.children('div').eq(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); bodyElement.append(scrollbarDummyElement);
if(IEBUGFIX === 0)
scrollbarDummyElement.hide().show();
var nativeScrollbarSize = calcNativeScrollbarSize(scrollbarDummyElement0); var nativeScrollbarSize = calcNativeScrollbarSize(scrollbarDummyElement0);
var nativeScrollbarIsOverlaid = { var nativeScrollbarIsOverlaid = {
@@ -617,18 +617,7 @@
if(nativeScrollbarIsOverlaid.x && nativeScrollbarIsOverlaid.y) if(nativeScrollbarIsOverlaid.x && nativeScrollbarIsOverlaid.y)
return; return;
function differenceIsBiggerThanOne(valOne, valTwo) { var abs = Math.abs;
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 windowWidth = compatibility.wW(); var windowWidth = compatibility.wW();
var windowHeight = compatibility.wH(); var windowHeight = compatibility.wH();
var windowDpr = getWindowDPR(); var windowDpr = getWindowDPR();
@@ -644,10 +633,10 @@
var deltaWRatio = Math.round(newW / (windowWidth / 100.0)); var deltaWRatio = Math.round(newW / (windowWidth / 100.0));
var deltaHRatio = Math.round(newH / (windowHeight / 100.0)); var deltaHRatio = Math.round(newH / (windowHeight / 100.0));
var absDeltaW = Math.abs(deltaW); var absDeltaW = abs(deltaW);
var absDeltaH = Math.abs(deltaH); var absDeltaH = abs(deltaH);
var absDeltaWRatio = Math.abs(deltaWRatio); var absDeltaWRatio = abs(deltaWRatio);
var absDeltaHRatio = Math.abs(deltaHRatio); var absDeltaHRatio = abs(deltaHRatio);
var newDPR = getWindowDPR(); var newDPR = getWindowDPR();
var deltaIsBigger = absDeltaW > 2 && absDeltaH > 2; var deltaIsBigger = absDeltaW > 2 && absDeltaH > 2;
@@ -674,6 +663,19 @@
windowDpr = newDPR; 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); framework(window).on('resize', onResize);
})(); })();
@@ -717,6 +719,7 @@
var _base = this; var _base = this;
var _strAutoUpdate = 'autoUpdate'; var _strAutoUpdate = 'autoUpdate';
var _strAutoUpdateInterval = _strAutoUpdate + 'Interval'; var _strAutoUpdateInterval = _strAutoUpdate + 'Interval';
var _strLength = LEXICON.l;
var _loopingInstances = [ ]; var _loopingInstances = [ ];
var _loopingInstancesIntervalCache = [ ]; 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. * 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() { var loop = function() {
if(_loopingInstances.length > 0 && _loopIsActive) { if(_loopingInstances[_strLength] > 0 && _loopIsActive) {
_loopID = compatibility.rAF()(function () { _loopID = compatibility.rAF()(function () {
loop(); loop();
}); });
@@ -740,7 +743,7 @@
if (timeDelta > _loopInterval) { if (timeDelta > _loopInterval) {
_loopTimeOld = timeNew - (timeDelta % _loopInterval); _loopTimeOld = timeNew - (timeDelta % _loopInterval);
var lowestInterval = _loopIntervalDefault; var lowestInterval = _loopIntervalDefault;
for(var i = 0; i < _loopingInstances.length; i++) { for(var i = 0; i < _loopingInstances[_strLength]; i++) {
var instance = _loopingInstances[i]; var instance = _loopingInstances[i];
if (instance !== undefined) { if (instance !== undefined) {
var instanceOptions = instance.options(); var instanceOptions = instance.options();
@@ -769,7 +772,7 @@
if(framework.inArray(instance, _loopingInstances) === -1) { if(framework.inArray(instance, _loopingInstances) === -1) {
_loopingInstances.push(instance); _loopingInstances.push(instance);
_loopingInstancesIntervalCache.push(compatibility.now()); _loopingInstancesIntervalCache.push(compatibility.now());
if (_loopingInstances.length > 0 && !_loopIsActive) { if (_loopingInstances[_strLength] > 0 && !_loopIsActive) {
_loopIsActive = true; _loopIsActive = true;
globals.autoUpdateLoop = _loopIsActive; globals.autoUpdateLoop = _loopIsActive;
loop(); loop();
@@ -789,7 +792,7 @@
_loopingInstances.splice(index, 1); _loopingInstances.splice(index, 1);
//correct update loop behavior //correct update loop behavior
if (_loopingInstances.length === 0 && _loopIsActive) { if (_loopingInstances[_strLength] === 0 && _loopIsActive) {
_loopIsActive = false; _loopIsActive = false;
globals.autoUpdateLoop = _loopIsActive; globals.autoUpdateLoop = _loopIsActive;
if(_loopID !== undefined) { if(_loopID !== undefined) {
@@ -825,6 +828,7 @@
//make correct instanceof //make correct instanceof
var _base = new window[PLUGINNAME](); var _base = new window[PLUGINNAME]();
var _frameworkProto = framework[LEXICON.p];
//globals: //globals:
var _nativeScrollbarIsOverlaid; var _nativeScrollbarIsOverlaid;
@@ -1984,14 +1988,16 @@
* @param hostSizeChanged True if this method was called due to a host size change. * @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 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 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 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 displayIsHidden = _hostElement.is(':hidden');
var displayIsHiddenChanged = checkCacheSingle(displayIsHidden, _displayIsHiddenCache, force); var displayIsHiddenChanged = checkCacheSingle(displayIsHidden, _displayIsHiddenCache, force);
_displayIsHiddenCache = displayIsHidden; _displayIsHiddenCache = displayIsHidden;
clearTimeout(_swallowedUpdateTimeout); clearTimeout(_swallowedUpdateTimeout);
if (swallow) { if (swallow) {
_swallowedUpdateParams.h = hostSizeChanged; _swallowedUpdateParams.h = hostSizeChanged;
_swallowedUpdateParams.c = contentSizeChanged; _swallowedUpdateParams.c = contentSizeChanged;
@@ -2040,7 +2046,6 @@
freezeResizeObserver(_sizeObserverElement); freezeResizeObserver(_sizeObserverElement);
freezeResizeObserver(_sizeAutoObserverElement); freezeResizeObserver(_sizeAutoObserverElement);
//save current scroll offset //save current scroll offset
var currScroll = { var currScroll = {
l: _viewportElement[_strScrollLeft](), l: _viewportElement[_strScrollLeft](),
@@ -2103,7 +2108,7 @@
//dynWidth: //dynWidth:
var textareaDynWidth = currentPreparedOptionsTextarea.dynWidth; var textareaDynWidth = currentPreparedOptionsTextarea.dynWidth;
var textareaDynWidthChanged = checkCacheSingle(_textareaDynWidthCache, textareaDynHeight); var textareaDynWidthChanged = checkCacheSingle(_textareaDynWidthCache, textareaDynWidth);
//dynHeight: //dynHeight:
var textareaDynHeight = currentPreparedOptionsTextarea.dynHeight; var textareaDynHeight = currentPreparedOptionsTextarea.dynHeight;
@@ -2152,6 +2157,7 @@
_overflowBehaviorCache = extend(true, {}, overflowBehavior); _overflowBehaviorCache = extend(true, {}, overflowBehavior);
_textareaDynWidthCache = textareaDynWidth; _textareaDynWidthCache = textareaDynWidth;
_textareaDynHeightCache = textareaDynHeight; _textareaDynHeightCache = textareaDynHeight;
_hasOverflowCache = _hasOverflowCache || { x: false, y: false };
//set correct class name to the host element //set correct class name to the host element
if (classNameChanged) { if (classNameChanged) {
@@ -2325,6 +2331,8 @@
//set info for padding //set info for padding
_paddingX = padding.l + padding.r; _paddingX = padding.l + padding.r;
_paddingY = padding.t + padding.b; _paddingY = padding.t + padding.b;
padding.ax = paddingAbsolute ? _paddingX : 0;
padding.ay = paddingAbsolute ? _paddingY : 0;
padding.c = checkCacheTRBL(padding, _cssPaddingCache); padding.c = checkCacheTRBL(padding, _cssPaddingCache);
//set info for border //set info for border
@@ -2394,22 +2402,24 @@
if (heightAuto && (heightAutoChanged || paddingAbsoluteChanged || boxSizingChanged || cssMaxValue.c || padding.c || border.c)) { if (heightAuto && (heightAutoChanged || paddingAbsoluteChanged || boxSizingChanged || cssMaxValue.c || padding.c || border.c)) {
if (cssMaxValue.cw) if (cssMaxValue.cw)
contentElementCSS[_strMaxMinus + _strHeight] = contentElementCSS[_strMaxMinus + _strHeight] =
(cssMaxValue.ch ? (cssMaxValue.ih - (paddingAbsolute ? _paddingY : 0) + (cssMaxValue.ch ? (cssMaxValue.ih - padding.ay + (_isBorderBox ? -_borderY : _paddingY))
(_isBorderBox ? -_borderY : _paddingY)) : _strEmpty); : _strEmpty);
contentElementCSS[_strHeight] = _strAuto; contentElementCSS[_strHeight] = _strAuto;
} else if (heightAutoChanged || paddingAbsoluteChanged) { }
else if (heightAutoChanged || paddingAbsoluteChanged) {
contentElementCSS[_strMaxMinus + _strHeight] = _strEmpty; contentElementCSS[_strMaxMinus + _strHeight] = _strEmpty;
contentElementCSS[_strHeight] = _strHundredPercent; contentElementCSS[_strHeight] = _strHundredPercent;
} }
if (widthAuto && (widthAutoChanged || paddingAbsoluteChanged || boxSizingChanged || cssMaxValue.c || padding.c || border.c || cssDirectionChanged)) { if (widthAuto && (widthAutoChanged || paddingAbsoluteChanged || boxSizingChanged || cssMaxValue.c || padding.c || border.c || cssDirectionChanged)) {
if (cssMaxValue.cw) if (cssMaxValue.cw)
contentElementCSS[_strMaxMinus + _strWidth] = contentElementCSS[_strMaxMinus + _strWidth] =
(cssMaxValue.cw ? (cssMaxValue.iw - (paddingAbsolute ? _paddingX : 0) + (cssMaxValue.cw ? (cssMaxValue.iw - padding.ax + (_isBorderBox ? -_borderX : _paddingX)) +
(_isBorderBox ? -_borderX : _paddingX)) + (_nativeScrollbarIsOverlaid.y /*&& _hasOverflowCache.y && widthAuto */ ? _overlayScrollbarDummySize.y : 0)
(_nativeScrollbarIsOverlaid.y /*&& _hasOverflowCache.y && widthAuto */ ? _overlayScrollbarDummySize.y : 0) : _strEmpty); : _strEmpty);
contentElementCSS[_strWidth] = _strAuto; contentElementCSS[_strWidth] = _strAuto;
contentGlueElementCSS[_strMaxMinus + _strWidth] = _strHundredPercent; //IE Fix contentGlueElementCSS[_strMaxMinus + _strWidth] = _strHundredPercent; //IE Fix
} else if (widthAutoChanged || paddingAbsoluteChanged) { }
else if (widthAutoChanged || paddingAbsoluteChanged) {
contentElementCSS[_strMaxMinus + _strWidth] = _strEmpty; contentElementCSS[_strMaxMinus + _strWidth] = _strEmpty;
contentElementCSS[_strWidth] = _strHundredPercent; contentElementCSS[_strWidth] = _strHundredPercent;
contentElementCSS[_strFloat] = _strEmpty; contentElementCSS[_strFloat] = _strEmpty;
@@ -2434,14 +2444,12 @@
_contentGlueElement.css(contentGlueElementCSS); _contentGlueElement.css(contentGlueElementCSS);
_contentElement.css(contentElementCSS); _contentElement.css(contentElementCSS);
//CHECKPOINT HERE ~ //CHECKPOINT HERE ~
contentElementCSS = {}; contentElementCSS = {};
contentGlueElementCSS = {}; 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 [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 strOverflow = 'overflow';
var strOverflowX = strOverflow + '-x'; var strOverflowX = strOverflow + '-x';
var strOverflowY = strOverflow + '-y'; var strOverflowY = strOverflow + '-y';
@@ -2497,8 +2505,8 @@
h: hostElement[LEXICON.cH] h: hostElement[LEXICON.cH]
}; };
var contentGlueSize = { var contentGlueSize = {
w: Math.max(contentClientSize.w + (paddingAbsolute ? _paddingX : 0), hostSize.w - _paddingX) - (textareaDynWidth ? (_isTextarea && widthAuto ? _marginX + (!_isBorderBox ? _paddingX + _borderX : 0) : 0) : 0), 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 + (paddingAbsolute ? _paddingY : 0), hostSize.h - _paddingY) h: Math.max(contentClientSize.h + padding.ay, hostSize.h - _paddingY)
}; };
contentGlueSize.c = checkCacheDouble(contentGlueSize, _contentGlueSizeCache, force); contentGlueSize.c = checkCacheDouble(contentGlueSize, _contentGlueSizeCache, force);
_contentGlueSizeCache = contentGlueSize; _contentGlueSizeCache = contentGlueSize;
@@ -2604,8 +2612,8 @@
* }; * };
*/ */
var overflowAmount = { var overflowAmount = {
x: Math.max(0, Math.round((contentScrollSize.w - hostSize.w + (paddingAbsolute ? _paddingX : 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 + (paddingAbsolute ? _paddingY : 0)) * 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); var hideOverflowForceTextarea = _isTextarea && (_viewportSize.w === 0 || _viewportSize.h === 0);
if (hideOverflowForceTextarea) { if (hideOverflowForceTextarea) {
@@ -3047,13 +3055,13 @@
} }
//fix body min size //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. //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) if (!_bodyMinSizeCache.f)
bodyMinSizeChanged(); bodyMinSizeChanged();
if (_nativeScrollbarIsOverlaid.y && hasOverflow.x) if (_nativeScrollbarIsOverlaid.y && _hasOverflowCache.x)
_contentElement.css(_strMinMinus + _strWidth, _bodyMinSizeCache.w + _overlayScrollbarDummySize.y); _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); _contentElement.css(_strMinMinus + _strHeight, _bodyMinSizeCache.h + _overlayScrollbarDummySize.x);
_bodyMinSizeCache.c = false; _bodyMinSizeCache.c = false;
} }
@@ -3125,25 +3133,45 @@
*/ */
function initScrollbarInteractivity(isHorizontal) { function initScrollbarInteractivity(isHorizontal) {
var scrollbarVars = getScrollbarVars(isHorizontal); var scrollbarVars = getScrollbarVars(isHorizontal);
var insideIFrame = _windowElement.top !== _windowElement;
var mouseDownScroll; var mouseDownScroll;
var mouseDownOffset; var mouseDownOffset;
var xy = scrollbarVars.xy; var xy = scrollbarVars.xy;
var XY = scrollbarVars.XY;
var scroll = _strScroll + scrollbarVars.LT; var scroll = _strScroll + scrollbarVars.LT;
var strActive = 'active'; var strActive = 'active';
var trackTimeout; var trackTimeout;
var scrollDurationFactor = 1; var scrollDurationFactor = 1;
var increaseDecreaseScrollAmountKeyCodes = [ 16, 17 ]; //shift, ctrl var increaseDecreaseScrollAmountKeyCodes = [ 16, 17 ]; //shift, ctrl
var increaseTrackScrollAmount = function () { function increaseTrackScrollAmount() {
scrollDurationFactor = 0.5; scrollDurationFactor = 0.5;
}; };
var decreaseTrackScrollAmount = function () { function decreaseTrackScrollAmount() {
scrollDurationFactor = 1; 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 trackLength = scrollbarVars.i.tl;
var handleLength = scrollbarVars.i.hl; var handleLength = scrollbarVars.i.hl;
var scrollRange = scrollbarVars.i.ms; 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 scrollDeltaPercent = scrollRaw / (trackLength - handleLength);
var scrollDelta = (scrollRange * scrollDeltaPercent); var scrollDelta = (scrollRange * scrollDeltaPercent);
scrollDelta = isFinite(scrollDelta) ? scrollDelta : 0; scrollDelta = isFinite(scrollDelta) ? scrollDelta : 0;
@@ -3154,12 +3182,9 @@
if (!_supportPassiveEvents) if (!_supportPassiveEvents)
compatibility.prvD(event); compatibility.prvD(event);
}; };
var documentMouseTouchUp = function (event) { function documentMouseTouchUp(event) {
event = event || event.originalEvent; 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(_bodyElement, _classNameDragging);
removeClass(scrollbarVars.h, strActive); removeClass(scrollbarVars.h, strActive);
removeClass(scrollbarVars.t, strActive); removeClass(scrollbarVars.t, strActive);
@@ -3180,31 +3205,22 @@
trackTimeout = undefined; 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 mouse is outside host element
if (!mouseInsideHost) if (!mouseInsideHost)
hostOnMouseLeave(); hostOnMouseLeave();
if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove) if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove)
refreshScrollbarsAutoHide(false); refreshScrollbarsAutoHide(false);
}; };
var documentKeyDown = function (event) { function onHandleMouseTouchDown(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) {
mouseDownScroll = _viewportElement[scroll](); mouseDownScroll = _viewportElement[scroll]();
mouseDownScroll = mouseDownScroll === undefined ? 0 : mouseDownScroll; mouseDownScroll = mouseDownScroll === undefined ? 0 : mouseDownScroll;
if (_isRTL && isHorizontal && !_rtlScrollBehavior.n || !_isRTL) if (_isRTL && isHorizontal && !_rtlScrollBehavior.n || !_isRTL)
mouseDownScroll = mouseDownScroll < 0 ? 0 : mouseDownScroll; 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(_bodyElement, _classNameDragging);
addClass(scrollbarVars.h, strActive); addClass(scrollbarVars.h, strActive);
@@ -3218,11 +3234,11 @@
compatibility.prvD(event); compatibility.prvD(event);
compatibility.stpP(event); compatibility.stpP(event);
}; };
scrollbarVars.h.on(_strMouseTouchDownEvent, function (event) { scrollbarVars.h.on(_strMouseTouchDownEvent, function(event) {
if (onMouseTouchDownContinue(event)) if (onMouseTouchDownContinue(event))
onHandleMouseTouchDown(event); onHandleMouseTouchDown(event);
}); });
scrollbarVars.t.on(_strMouseTouchDownEvent, function (event) { scrollbarVars.t.on(_strMouseTouchDownEvent, function(event) {
if (onMouseTouchDownContinue(event)) { if (onMouseTouchDownContinue(event)) {
var scrollDistance = _viewportSize[scrollbarVars._wh]; var scrollDistance = _viewportSize[scrollbarVars._wh];
var trackOffset = scrollbarVars.t.offset()[scrollbarVars.lt]; var trackOffset = scrollbarVars.t.offset()[scrollbarVars.lt];
@@ -3253,7 +3269,7 @@
instantScrollPosition = (scrollRange - instantScrollPosition); instantScrollPosition = (scrollRange - instantScrollPosition);
if(instantScrollTransition) { if(instantScrollTransition) {
scrollObj.n = false; scrollObj.n = false;
scrollObj[scrollbarVars.xy] = instantScrollPosition; scrollObj[xy] = instantScrollPosition;
_base.scroll(scrollObj, 130, easing, function() { onHandleMouseTouchDown(event); }); _base.scroll(scrollObj, 130, easing, function() { onHandleMouseTouchDown(event); });
} }
else { else {
@@ -3265,7 +3281,7 @@
decreaseScroll = isFirstIteration ? decreaseScrollCondition : decreaseScroll; decreaseScroll = isFirstIteration ? decreaseScrollCondition : decreaseScroll;
finishedCondition = rtlIsNormal ? decreaseScroll ? handleOffset + handleLength >= mouseOffset : handleOffset <= mouseOffset : decreaseScroll ? handleOffset <= mouseOffset : handleOffset + handleLength >= mouseOffset; 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.scrollStop();
_base.scroll(scrollObj, scrollDuration, easing); _base.scroll(scrollObj, scrollDuration, easing);
@@ -3297,18 +3313,18 @@
compatibility.prvD(event); compatibility.prvD(event);
compatibility.stpP(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) { if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove) {
_scrollbarsAutoHideFlagScrollAndHovered = true; _scrollbarsAutoHideFlagScrollAndHovered = true;
refreshScrollbarsAutoHide(true); refreshScrollbarsAutoHide(true);
} }
}, function () { }, function() {
if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove) { if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove) {
_scrollbarsAutoHideFlagScrollAndHovered = false; _scrollbarsAutoHideFlagScrollAndHovered = false;
refreshScrollbarsAutoHide(false); refreshScrollbarsAutoHide(false);
} }
}); });
scrollbarVars.s.on(_strMouseTouchDownEvent, function (event) { scrollbarVars.s.on(_strMouseTouchDownEvent, function(event) {
compatibility.stpP(event); compatibility.stpP(event);
}); });
} }
@@ -3795,21 +3811,21 @@
* jQuery addClass method shortcut. * jQuery addClass method shortcut.
*/ */
function addClass(el, classes) { function addClass(el, classes) {
return framework.prototype.addClass.call(el, classes); return _frameworkProto.addClass.call(el, classes);
} }
/** /**
* jQuery removeClass method shortcut. * jQuery removeClass method shortcut.
*/ */
function removeClass(el, classes) { function removeClass(el, classes) {
return framework.prototype.removeClass.call(el, classes); return _frameworkProto.removeClass.call(el, classes);
} }
/** /**
* jQuery remove method shortcut. * jQuery remove method shortcut.
*/ */
function remove(el) { 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. * @returns {*} The first element which is a child of the given element and matches the givens selector.
*/ */
function findFirst(el, 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. * Updates the plugin and DOM to the current options.
* This method should only be called if a update is 100% required. * 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. * @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. * 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) { _base.update = function (force) {
var attrsChanged; var attrsChanged;
var contentSizeC; var contentSizeC;
var isZoom = force === 'zoom'; var isString = type(force) == TYPES.s;
var imgElementSelector = 'img'; var imgElementSelector = 'img';
var imgElementLoadEvent = 'load'; var imgElementLoadEvent = 'load';
if (force === _strAuto) { if(isString) {
if (force.indexOf(_strAuto) === 0) {
attrsChanged = meaningfulAttrsChanged(); attrsChanged = meaningfulAttrsChanged();
contentSizeC = updateAutoContentSizeChanged(); contentSizeC = updateAutoContentSizeChanged();
if (attrsChanged || contentSizeC) if (attrsChanged || contentSizeC)
update(false, contentSizeC); update(false, contentSizeC, false, force.slice(-1) == "+");
} }
else if (isZoom) { else if (force === 'zoom')
update(true, true); update(true, true);
} }
else { else {
force = _isSleeping || force; force = _isSleeping || force;
_isSleeping = false; _isSleeping = false;
update(false, false, force); update(false, false, force, true);
} }
if(!_isTextarea && !isZoom) { if(!_isTextarea) {
_contentElement.find(imgElementSelector).each(function(i, el) { _contentElement.find(imgElementSelector).each(function(i, el) {
var index = compatibility.inA(el, _imgs); var index = compatibility.inA(el, _imgs);
if (index === -1) { if (index === -1)
el = framework(el); framework(el).off(imgElementLoadEvent, imgOnLoad).on(imgElementLoadEvent, imgOnLoad);
el.off(imgElementLoadEvent, imgOnLoad).on(imgElementLoadEvent, imgOnLoad);
}
}); });
} }
}; };
@@ -4115,6 +4130,7 @@
var strAlways = 'always'; var strAlways = 'always';
var strNever = 'never'; var strNever = 'never';
var strIfNeeded = 'ifneeded'; var strIfNeeded = 'ifneeded';
var strLength = LEXICON.l;
var settingsAxis; var settingsAxis;
var settingsScroll; var settingsScroll;
var settingsBlock; var settingsBlock;
@@ -4128,7 +4144,7 @@
var possibleElementIsJQuery = possibleElement instanceof framework || JQUERY ? possibleElement instanceof JQUERY : false; var possibleElementIsJQuery = possibleElement instanceof framework || JQUERY ? possibleElement instanceof JQUERY : false;
var possibleElementIsHTMLElement = possibleElementIsJQuery ? false : isHTMLElement(possibleElement); var possibleElementIsHTMLElement = possibleElementIsJQuery ? false : isHTMLElement(possibleElement);
var checkSettingsStringValue = function (currValue, allowedValues) { var checkSettingsStringValue = function (currValue, allowedValues) {
for (i = 0; i < allowedValues.length; i++) { for (i = 0; i < allowedValues[strLength]; i++) {
if (currValue === allowedValues[i]) if (currValue === allowedValues[i])
return true; return true;
} }
@@ -4136,7 +4152,7 @@
}; };
var getRawScroll = function (coordinates) { var getRawScroll = function (coordinates) {
var rawScroll = {}; var rawScroll = {};
if (type(coordinates) == TYPES.a && coordinates.length > 0) { if (type(coordinates) == TYPES.a && coordinates[strLength] > 0) {
rawScroll.x = coordinates[0]; rawScroll.x = coordinates[0];
rawScroll.y = coordinates[1]; rawScroll.y = coordinates[1];
} }
@@ -4157,7 +4173,7 @@
} }
var getRawScrollValue = function (isX) { var getRawScrollValue = function (isX) {
var coordinateProps = isX ? coordinatesXAxisProps : coordinatesYAxisProps; var coordinateProps = isX ? coordinatesXAxisProps : coordinatesYAxisProps;
for (i = 0; i < coordinateProps.length; i++) { for (i = 0; i < coordinateProps[strLength]; i++) {
if (coordinateProps[i] in coordinates) { if (coordinateProps[i] in coordinates) {
return coordinates[coordinateProps[i]]; return coordinates[coordinateProps[i]];
} }
@@ -4169,6 +4185,9 @@
return rawScroll; return rawScroll;
}; };
var getFinalScroll = function (isX, rawScroll) { var getFinalScroll = function (isX, rawScroll) {
var isString = type(rawScroll) == TYPES.s;
if(isString)
_base.update(_strAuto + "+");
var operator; var operator;
var amount; var amount;
var scrollInfo = isX ? _scrollHorizontalInfo : _scrollVerticalInfo; var scrollInfo = isX ? _scrollHorizontalInfo : _scrollVerticalInfo;
@@ -4179,11 +4198,11 @@
var isRTLisX = _isRTL && isX; var isRTLisX = _isRTL && isX;
var normalizeShortcuts = isRTLisX && _rtlScrollBehavior.n && !normalizeRTL; var normalizeShortcuts = isRTLisX && _rtlScrollBehavior.n && !normalizeRTL;
var strReplace = 'replace'; var strReplace = 'replace';
if (type(rawScroll) == TYPES.s) { if (isString) {
//check operator //check operator
if (rawScroll.length > 2) { if (rawScroll[strLength] > 2) {
var possibleOperator = rawScroll.substr(0, 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]) { if (possibleOperator === coordinatesOperators[i]) {
operator = coordinatesOperators[i]; operator = coordinatesOperators[i];
break; break;
@@ -4203,11 +4222,11 @@
rawScroll = rawScroll[strReplace](/vh/g, mult + _viewportSize.h); rawScroll = rawScroll[strReplace](/vh/g, mult + _viewportSize.h);
amount = parseIntToZeroOrNumber(window.parseFloat(window.eval(rawScroll)).toFixed()); amount = parseIntToZeroOrNumber(window.parseFloat(window.eval(rawScroll)).toFixed());
} }
else if (type(rawScroll) == TYPES.n) { else {
amount = rawScroll; 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 normalizeIsRTLisX = normalizeRTL && isRTLisX;
var operatorCurrScroll = currScroll * (normalizeIsRTLisX && _rtlScrollBehavior.n ? -1 : 1); var operatorCurrScroll = currScroll * (normalizeIsRTLisX && _rtlScrollBehavior.n ? -1 : 1);
var invert = normalizeIsRTLisX && _rtlScrollBehavior.i; var invert = normalizeIsRTLisX && _rtlScrollBehavior.i;
@@ -4230,23 +4249,11 @@
finalValue = amount; finalValue = amount;
break; break;
} }
if (invert) finalValue = invert ? maxScroll - finalValue : finalValue;
finalValue = maxScroll - finalValue; finalValue *= negate ? -1 : 1;
if (negate) finalValue = isRTLisX && _rtlScrollBehavior.n ? Math.min(0, Math.max(maxScroll, finalValue)) : Math.max(0, Math.min(maxScroll, finalValue));
finalValue *= -1;
if (isRTLisX && _rtlScrollBehavior.n) {
finalValue = Math.max(maxScroll, finalValue);
finalValue = Math.min(0, finalValue);
} }
else { return finalValue === currScroll ? undefined : finalValue;
finalValue = Math.min(maxScroll, finalValue);
finalValue = Math.max(0, finalValue);
}
if (finalValue === currScroll)
finalValue = undefined;
}
return finalValue;
}; };
var getPerAxisValue = function (value, valueInternalType, defaultValue, allowedValues) { var getPerAxisValue = function (value, valueInternalType, defaultValue, allowedValues) {
var resultDefault = [ defaultValue, defaultValue ]; var resultDefault = [ defaultValue, defaultValue ];
@@ -4259,7 +4266,7 @@
value = [value, value]; value = [value, value];
} }
else if (valueType == TYPES.a) { else if (valueType == TYPES.a) {
valueArrLength = value.length; valueArrLength = value[strLength];
if (valueArrLength > 2 || valueArrLength < 1) if (valueArrLength > 2 || valueArrLength < 1)
value = resultDefault; value = resultDefault;
else { else {
@@ -4285,24 +4292,21 @@
var currValue; var currValue;
var currValueType; var currValueType;
var valueDirections = [ _strTop, _strRight, _strBottom, _strLeft ]; var valueDirections = [ _strTop, _strRight, _strBottom, _strLeft ];
for(i = 0; i < marginTopRightBottomLeftArray.length; i++) { for(i = 0; i < marginTopRightBottomLeftArray[strLength]; i++) {
if(i === valueDirections.length) if(i === valueDirections[strLength])
break; break;
currValue = marginTopRightBottomLeftArray[i]; currValue = marginTopRightBottomLeftArray[i];
currValueType = type(currValue); currValueType = type(currValue);
if(currValueType == TYPES.b) if(currValueType == TYPES.b)
result.push(currValue ? parseIntToZeroOrNumber(finalElement.css(_strMarginMinus + valueDirections[i])) : 0); result.push(currValue ? parseIntToZeroOrNumber(finalElement.css(_strMarginMinus + valueDirections[i])) : 0);
else if(currValueType == TYPES.n)
result.push(currValue);
else else
result.push(0); result.push(currValueType == TYPES.n ? currValue : 0);
} }
return result; return result;
}; };
if (possibleElementIsJQuery || possibleElementIsHTMLElement) { if (possibleElementIsJQuery || possibleElementIsHTMLElement) {
//get settings //get settings
var margin = coordinatesIsElementObj ? coordinates.margin : 0; var margin = coordinatesIsElementObj ? coordinates.margin : 0;
var axis = coordinatesIsElementObj ? coordinates.axis : 0; var axis = coordinatesIsElementObj ? coordinates.axis : 0;
var scroll = coordinatesIsElementObj ? coordinates.scroll : 0; var scroll = coordinatesIsElementObj ? coordinates.scroll : 0;
@@ -4311,14 +4315,16 @@
var marginType = type(margin); var marginType = type(margin);
var marginLength; var marginLength;
finalElement = possibleElementIsJQuery ? possibleElement : framework(possibleElement); finalElement = possibleElementIsJQuery ? possibleElement : framework(possibleElement);
if (finalElement.length === 0) if (finalElement[strLength] === 0)
return; return;
_base.update(_strAuto + "+");
//margin can be [ boolean, number, array of 2, array of 4, object ] //margin can be [ boolean, number, array of 2, array of 4, object ]
if (marginType == TYPES.n || marginType == TYPES.b) if (marginType == TYPES.n || marginType == TYPES.b)
margin = generateMargin([margin, margin, margin, margin]); margin = generateMargin([margin, margin, margin, margin]);
else if (marginType == TYPES.a) { else if (marginType == TYPES.a) {
marginLength = margin.length; marginLength = margin[strLength];
if(marginLength === 2) if(marginLength === 2)
margin = generateMargin([margin[0], margin[1], margin[0], margin[1]]); margin = generateMargin([margin[0], margin[1], margin[0], margin[1]]);
else if(marginLength >= 4) else if(marginLength >= 4)
@@ -4337,19 +4343,21 @@
settingsBlock = getPerAxisValue(block, TYPES.s, strBegin, elementObjSettingsBlockValues); settingsBlock = getPerAxisValue(block, TYPES.s, strBegin, elementObjSettingsBlockValues);
settingsMargin = margin; 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, l: _scrollHorizontalInfo.cs,
t: _scrollVerticalInfo.cs t: _scrollVerticalInfo.cs
}; };
// 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 = { var doNotScroll = {
x : settingsScroll.x == strNever || settingsAxis == _strY, x : settingsScroll.x == strNever || settingsAxis == _strY,
y : settingsScroll.y == strNever || settingsAxis == _strX y : settingsScroll.y == strNever || settingsAxis == _strX
}; };
elementOffset[_strTop] -= settingsMargin[0];
elementOffset[_strLeft] -= settingsMargin[3];
var elementScrollCoordinates = { var elementScrollCoordinates = {
x: Math.round(elementOffset[_strLeft] - viewportOffset[_strLeft] + viewportScroll.l), x: Math.round(elementOffset[_strLeft] - viewportOffset[_strLeft] + viewportScroll.l),
y: Math.round(elementOffset[_strTop] - viewportOffset[_strTop] + viewportScroll.t) y: Math.round(elementOffset[_strTop] - viewportOffset[_strTop] + viewportScroll.t)
@@ -4366,24 +4374,13 @@
//measuring is required //measuring is required
if (settingsBlock.x != strBegin || settingsBlock.y != strBegin || settingsScroll.x == strIfNeeded || settingsScroll.y == strIfNeeded || _isRTL) { if (settingsBlock.x != strBegin || settingsBlock.y != strBegin || settingsScroll.x == strIfNeeded || settingsScroll.y == strIfNeeded || _isRTL) {
var measuringElm = finalElement[0]; var measuringElm = finalElement[0];
var rawElementSize = {}; var rawElementSize = _supportTransform ? measuringElm.getBoundingClientRect() : {
var rect; width : measuringElm[LEXICON.oW],
if (_supportTransform) { height : measuringElm[LEXICON.oH]
rect = measuringElm.getBoundingClientRect();
rawElementSize = {
w: rect[_strWidth],
h: rect[_strHeight]
}; };
}
else {
rawElementSize = {
w: measuringElm[LEXICON.oW],
h: measuringElm[LEXICON.oH]
};
}
var elementSize = { var elementSize = {
w: rawElementSize.w + settingsMargin[3] + settingsMargin[1], w: rawElementSize[_strWidth] + settingsMargin[3] + settingsMargin[1],
h: rawElementSize.h + settingsMargin[0] + settingsMargin[2] h: rawElementSize[_strHeight] + settingsMargin[0] + settingsMargin[2]
}; };
var finalizeBlock = function(isX) { var finalizeBlock = function(isX) {
var vars = getScrollbarVars(isX); var vars = getScrollbarVars(isX);
@@ -4414,8 +4411,7 @@
doNotScroll[xy] = scrollIfNeeded ? isInView : false; doNotScroll[xy] = scrollIfNeeded ? isInView : false;
blockIsEnd = elSize < vpSize ? elementCenterOffset > viewportCenterOffset : elementCenterOffset < viewportCenterOffset; blockIsEnd = elSize < vpSize ? elementCenterOffset > viewportCenterOffset : elementCenterOffset < viewportCenterOffset;
} }
if (blockIsEnd || blockIsCenter) elementScrollCoordinates[xy] -= blockIsEnd || blockIsCenter ? ((vpSize / divide) - (elSize / divide)) * (isX && _isRTL && normalizeRTL ? -1 : 1) : 0;
elementScrollCoordinates[xy] -= ((vpSize / divide) - (elSize / divide)) * (isX && _isRTL && normalizeRTL ? -1 : 1);
} }
}; };
finalizeBlock(true); finalizeBlock(true);
@@ -4804,7 +4800,7 @@
textareaUpdate(); textareaUpdate();
if (sizeAuto) if (sizeAuto)
_base.update(); update();
else else
_base.update(_strAuto); _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", "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.", "description": "A javascript scrollbar plugin which hides the native scrollbars and provides custom styleable overlay scrollbars, but keeps the native functionality and feeling.",
"keywords" : [ "keywords" : [
"overlayscrollbars", "overlayscrollbars",