Comparing version 3.0.0 to 3.1.0
{ | ||
"name": "optiscroll", | ||
"version": "3.0.0", | ||
"version": "3.1.0", | ||
"homepage": "https://github.com/albertogasparin/Optiscroll", | ||
@@ -5,0 +5,0 @@ "authors": [ |
/*! | ||
* Optiscroll.js v3.0.0 | ||
* Optiscroll.js v3.1.0 | ||
* https://github.com/wilsonfletcher/Optiscroll/ | ||
@@ -13,2 +13,3 @@ * | ||
/** | ||
@@ -25,3 +26,3 @@ * Optiscroll, use this to create instances | ||
var GS = Optiscroll.globalSettings = { | ||
@@ -50,3 +51,3 @@ scrollMinUpdateInterval: 1000 / 40, // 40 FPS | ||
// instance variables | ||
this.element = element; | ||
this.element = element; | ||
this.settings = _extend(_extend({}, Optiscroll.defaults), options || {}); | ||
@@ -57,3 +58,3 @@ if (typeof options.rtl !== 'boolean') { | ||
this.cache = {}; | ||
this.init(); | ||
@@ -71,5 +72,5 @@ }; | ||
shouldCreateScrollbars = false; | ||
var scrollEl = this.scrollEl = settings.wrapContent | ||
? Utils.createWrapper(element) | ||
var scrollEl = this.scrollEl = settings.wrapContent | ||
? Utils.createWrapper(element) | ||
: element.firstElementChild; | ||
@@ -81,3 +82,3 @@ | ||
// initialize scrollbars | ||
this.scrollbars = { | ||
this.scrollbars = { | ||
v: Scrollbar('v', this), | ||
@@ -90,3 +91,3 @@ h: Scrollbar('h', this), | ||
shouldCreateScrollbars = Utils.hideNativeScrollbars(scrollEl, settings.rtl); | ||
} | ||
} | ||
@@ -119,4 +120,4 @@ if(shouldCreateScrollbars) { | ||
bind: function () { | ||
@@ -154,6 +155,6 @@ var listeners = this.listeners = {}, | ||
cW = scrollEl.clientWidth; | ||
if(sH !== cache.scrollH || cH !== cache.clientH || | ||
if(sH !== cache.scrollH || cH !== cache.clientH || | ||
sW !== cache.scrollW || cW !== cache.clientW) { | ||
cache.scrollH = sH; | ||
@@ -198,3 +199,3 @@ cache.clientH = cH; | ||
startY = this.scrollEl.scrollTop; | ||
endX = +destX; | ||
@@ -212,3 +213,3 @@ if(destX === 'left') { endX = 0; } | ||
this.animateScroll(startX, endX, startY, endY, +duration); | ||
}, | ||
@@ -252,3 +253,3 @@ | ||
bottomEdge = offsetY + eDim.height - this.cache.clientH + (delta.bottom || 0); | ||
if(leftEdge < startX) { endX = leftEdge; } | ||
@@ -286,7 +287,7 @@ if(rightEdge > startX) { endX = rightEdge; } | ||
} | ||
(function animate () { | ||
var time = Math.min(1, ((Date.now() - startTime) / duration)), | ||
easedTime = Utils.easingFunction(time); | ||
if(endY !== startY) { | ||
@@ -300,3 +301,3 @@ scrollEl.scrollTop = ~~(easedTime * (endY - startY)) + startY; | ||
self.scrollAnimation = time < 1 ? window.requestAnimationFrame(animate) : null; | ||
}(this)); | ||
}()); | ||
}, | ||
@@ -354,3 +355,3 @@ | ||
eventData; | ||
eventData = { | ||
@@ -375,3 +376,3 @@ // scrollbars data | ||
var event; | ||
if (CustomEvent === 'function') { | ||
if (typeof CustomEvent === 'function') { | ||
event = new CustomEvent(eventName, { detail: eventData }); | ||
@@ -393,3 +394,3 @@ } else { // IE does not support CustomEvent | ||
scroll: function (ev) { | ||
if (!G.pauseCheck) { | ||
@@ -399,3 +400,3 @@ this.fireCustomEvent('scrollstart'); | ||
G.pauseCheck = true; | ||
this.scrollbars.v.update(); | ||
@@ -405,3 +406,3 @@ this.scrollbars.h.update(); | ||
this.fireCustomEvent('scroll'); | ||
clearTimeout(this.cache.timerStop); | ||
@@ -416,3 +417,3 @@ this.cache.timerStop = setTimeout(Events.scrollStop.bind(this), this.settings.scrollStopDelay); | ||
this.scrollbars.h.update(); | ||
Events.wheel.call(this, ev); | ||
@@ -437,3 +438,3 @@ }, | ||
var cache = this.cache, | ||
cacheV = cache.v, | ||
cacheV = cache.v, | ||
cacheH = cache.h, | ||
@@ -443,3 +444,3 @@ preventScroll = this.settings.preventParentScroll && G.isTouch; | ||
window.cancelAnimationFrame(this.scrollAnimation); | ||
if(preventScroll && cacheV.enabled && cacheV.percent % 100 === 0) { | ||
@@ -470,3 +471,4 @@ this.scrollEl.scrollTop = cacheV.percent ? (cache.scrollH - cache.clientH - 1) : 1; | ||
scrollProp = isVertical ? 'scrollTop' : 'scrollLeft', | ||
evNames = isVertical ? ['top','bottom'] : ['left','right'], | ||
evSuffixes = isVertical ? ['top','bottom'] : ['left','right'], | ||
evTypesMatcher = /^(mouse|touch|pointer)/, | ||
@@ -482,5 +484,6 @@ rtlMode = G.scrollbarSpec.rtl, | ||
dragStart: function (ev) { | ||
ev.preventDefault(); | ||
var evData = ev.touches ? ev.touches[0] : ev; | ||
events.dragData = { x: evData.pageX, y: evData.pageY, scroll: scrollEl[scrollProp] }; | ||
events.bind(true); | ||
events.bind(true, ev.type.match(evTypesMatcher)[1]); | ||
}, | ||
@@ -492,25 +495,27 @@ | ||
delta, deltaRatio; | ||
ev.preventDefault(); | ||
delta = isVertical ? evData.pageY - events.dragData.y : evData.pageX - events.dragData.x; | ||
deltaRatio = delta / cache[clientSize]; | ||
scrollEl[scrollProp] = events.dragData.scroll + deltaRatio * cache[scrollSize] * dragMode; | ||
}, | ||
dragEnd: function () { | ||
dragEnd: function (ev) { | ||
events.dragData = null; | ||
events.bind(false); | ||
events.bind(false, ev.type.match(evTypesMatcher)[1]); | ||
}, | ||
bind: function (on) { | ||
bind: function (on, type) { | ||
var method = (on ? 'add' : 'remove') + 'EventListener', | ||
type = G.isTouch ? ['touchmove', 'touchend'] : ['mousemove', 'mouseup']; | ||
moveEv = type + 'move', | ||
upEv = type + (type === 'touch' ? 'end' : 'up'); | ||
document[method](type[0], events.dragMove); | ||
document[method](type[1], events.dragEnd); | ||
document[method](moveEv, events.dragMove); | ||
document[method](upEv, events.dragEnd); | ||
document[method](type + 'cancel', events.dragEnd); | ||
}, | ||
}; | ||
return { | ||
@@ -532,3 +537,2 @@ | ||
create: function () { | ||
var evType = G.isTouch ? 'touchstart' : 'mousedown'; | ||
scrollbarEl = document.createElement('div'); | ||
@@ -543,3 +547,6 @@ trackEl = document.createElement('b'); | ||
if(settings.draggableTracks) { | ||
trackEl.addEventListener(evType, events.dragStart); | ||
var evTypes = window.PointerEvent ? ['pointerdown'] : ['touchstart', 'mousedown']; | ||
evTypes.forEach(function (evType) { | ||
trackEl.addEventListener(evType, events.dragStart); | ||
}); | ||
} | ||
@@ -582,3 +589,3 @@ }, | ||
} | ||
}, | ||
@@ -594,4 +601,4 @@ | ||
} | ||
trackEl.style[G.cssTransform] = 'translate(' + | ||
(isVertical ? '0%,' + newRelPos + '%' : newRelPos + '%' + ',0%') | ||
trackEl.style[G.cssTransform] = 'translate(' + | ||
(isVertical ? '0%,' + newRelPos + '%' : newRelPos + '%' + ',0%') | ||
+ ')'; | ||
@@ -603,8 +610,8 @@ }, | ||
var position = scrollEl[scrollProp], | ||
viewS = cache[clientSize], | ||
scrollS = cache[scrollSize], | ||
viewS = cache[clientSize], | ||
scrollS = cache[scrollSize], | ||
sizeRatio = viewS / scrollS, | ||
sizeDiff = scrollS - viewS, | ||
positionRatio, percent; | ||
if(sizeRatio >= 1 || !scrollS) { // no scrollbars needed | ||
@@ -619,8 +626,8 @@ return { position: 0, size: 1, percent: 0 }; | ||
// prevent overscroll effetcs (negative percent) | ||
// prevent overscroll effetcs (negative percent) | ||
// and keep 1px tolerance near the edges | ||
if(position <= 1) { percent = 0; } | ||
if(position >= sizeDiff - 1) { percent = 100; } | ||
// Capped size based on min/max track percentage | ||
// Capped size based on min/max track percentage | ||
sizeRatio = Math.max(sizeRatio, settings.minTrackSize / 100); | ||
@@ -640,3 +647,3 @@ sizeRatio = Math.min(sizeRatio, settings.maxTrackSize / 100); | ||
instance.fireCustomEvent('scrollreachedge'); | ||
instance.fireCustomEvent('scrollreach' + evNames[percent / 100]); | ||
instance.fireCustomEvent('scrollreach' + evSuffixes[percent / 100]); | ||
} | ||
@@ -688,3 +695,3 @@ | ||
document.head.appendChild(styleSheet); | ||
} | ||
} | ||
try { | ||
@@ -710,3 +717,3 @@ styleSheet.sheet.insertRule(selector + ' {' + rules + '}', 0); | ||
checkLoop: function () { | ||
if(!G.instances.length) { | ||
@@ -720,3 +727,3 @@ G.checkTimer = null; | ||
} | ||
if(GS.checkFrequency) { | ||
@@ -731,4 +738,4 @@ G.checkTimer = setTimeout(function () { | ||
// easeOutCubic function | ||
easingFunction: function (t) { | ||
return (--t) * t * t + 1; | ||
easingFunction: function (t) { | ||
return (--t) * t * t + 1; | ||
}, | ||
@@ -769,7 +776,7 @@ | ||
width = outerEl.offsetWidth - outerEl.clientWidth; | ||
if (outerEl.scrollLeft > 0) { | ||
if (outerEl.scrollLeft > 0) { | ||
rtl = 0; // webkit is default | ||
} else { | ||
outerEl.scrollLeft = 1; | ||
if (outerEl.scrollLeft === 0) { | ||
if (outerEl.scrollLeft === 0) { | ||
rtl = -1; // firefox is negative | ||
@@ -779,3 +786,3 @@ } | ||
htmlEl.removeChild(outerEl); | ||
return { width: width, rtl: rtl }; | ||
@@ -800,3 +807,3 @@ } | ||
props = [prop, 'Webkit' + ucProp]; | ||
for (var i in props) { | ||
@@ -813,3 +820,3 @@ if(el.style[props[i]] !== undefined) { return props[i]; } | ||
index = classes.indexOf(value); | ||
if(bool) { | ||
@@ -879,3 +886,3 @@ ~index || classes.push(value); | ||
} | ||
// commonjs export | ||
@@ -885,3 +892,3 @@ if(typeof module !== 'undefined' && module.exports) { | ||
} | ||
window.Optiscroll = Optiscroll; | ||
@@ -891,2 +898,3 @@ | ||
/** | ||
@@ -905,3 +913,3 @@ * jQuery plugin | ||
(function ($) { | ||
var pluginName = 'optiscroll'; | ||
@@ -911,3 +919,3 @@ | ||
var method, args; | ||
if(typeof options === 'string') { | ||
@@ -927,3 +935,3 @@ args = Array.prototype.slice.call(arguments); | ||
} | ||
// allow exec method on instance | ||
// allow exec method on instance | ||
else if(inst && typeof method === 'string') { | ||
@@ -930,0 +938,0 @@ inst[method].apply(inst, args); |
/*! | ||
* Optiscroll.js v3.0.0 | ||
* Optiscroll.js v3.1.0 | ||
* https://github.com/wilsonfletcher/Optiscroll/ | ||
@@ -8,2 +8,2 @@ * | ||
*/ | ||
!function(a,b,c,d){"use strict";function e(){var a,c,d=b.documentElement,e=0,f=1;return a=b.createElement("div"),a.style.cssText="overflow:scroll;width:50px;height:50px;position:absolute;left:-100px;direction:rtl",c=b.createElement("div"),c.style.cssText="width:100px;height:100px",a.appendChild(c),d.appendChild(a),e=a.offsetWidth-a.clientWidth,a.scrollLeft>0?f=0:(a.scrollLeft=1,0===a.scrollLeft&&(f=-1)),d.removeChild(a),{width:e,rtl:f}}function f(){var b=!1,c=Object.defineProperty({},"passive",{get:function(){b=!0}});return a.addEventListener("test",null,c),!!b&&{capture:!1,passive:!0}}function g(a){var c=a.charAt(0).toUpperCase()+a.slice(1),e=b.createElement("test"),f=[a,"Webkit"+c];for(var g in f)if(e.style[f[g]]!==d)return f[g];return""}function h(a,b,c){var d=a.className.split(/\s+/),e=d.indexOf(b);c?~e||d.push(b):~e&&d.splice(e,1),a.className=d.join(" ")}function i(a,b,c){for(var e in b)!b.hasOwnProperty(e)||a[e]!==d&&c||(a[e]=b[e]);return a}function j(a,b,c){var d,e;if(a.length)for(d=0,e=a.length;d<e;d++)a[d][b].apply(a[d],c);else for(d in a)a[d][b].apply(a[d],c)}function k(a,b){var c,d;return function(){var e=this,f=Date.now(),g=arguments;c&&f<c+b?(clearTimeout(d),d=setTimeout(function(){c=f,a.apply(e,g)},b)):(c=f,a.apply(e,g))}}var l=function a(b,c){return new a.Instance(b,c||{})},m=l.globalSettings={scrollMinUpdateInterval:25,checkFrequency:1e3,pauseCheck:!1};l.defaults={preventParentScroll:!1,forceScrollbars:!1,scrollStopDelay:300,maxTrackSize:95,minTrackSize:5,draggableTracks:!0,autoUpdate:!0,classPrefix:"optiscroll-",wrapContent:!0,rtl:!1},l.Instance=function(b,c){this.element=b,this.settings=i(i({},l.defaults),c||{}),"boolean"!=typeof c.rtl&&(this.settings.rtl="rtl"===a.getComputedStyle(b).direction),this.cache={},this.init()},l.Instance.prototype={init:function(){var a=this.element,b=this.settings,c=!1,d=this.scrollEl=b.wrapContent?p.createWrapper(a):a.firstElementChild;h(d,b.classPrefix+"content",!0),h(a,"is-enabled"+(b.rtl?" is-rtl":""),!0),this.scrollbars={v:o("v",this),h:o("h",this)},(q.scrollbarSpec.width||b.forceScrollbars)&&(c=p.hideNativeScrollbars(d,b.rtl)),c&&j(this.scrollbars,"create"),q.isTouch&&b.preventParentScroll&&h(a,b.classPrefix+"prevent",!0),this.update(),this.bind(),b.autoUpdate&&q.instances.push(this),b.autoUpdate&&!q.checkTimer&&p.checkLoop()},bind:function(){var a=this.listeners={},b=this.scrollEl;a.scroll=k(n.scroll.bind(this),m.scrollMinUpdateInterval),q.isTouch&&(a.touchstart=n.touchstart.bind(this),a.touchend=n.touchend.bind(this)),a.mousewheel=a.wheel=n.wheel.bind(this);for(var c in a)b.addEventListener(c,a[c],q.passiveEvent)},update:function(){var a=this.scrollEl,c=this.cache,e=c.clientH,f=a.scrollHeight,g=a.clientHeight,h=a.scrollWidth,i=a.clientWidth;if(f!==c.scrollH||g!==c.clientH||h!==c.scrollW||i!==c.clientW){if(c.scrollH=f,c.clientH=g,c.scrollW=h,c.clientW=i,e!==d){if(0===f&&0===g&&!b.body.contains(this.element))return this.destroy(),!1;this.fireCustomEvent("sizechange")}j(this.scrollbars,"update")}},scrollTo:function(a,b,c){var d,e,f,g,h=this.cache;q.pauseCheck=!0,this.update(),d=this.scrollEl.scrollLeft,e=this.scrollEl.scrollTop,f=+a,"left"===a&&(f=0),"right"===a&&(f=h.scrollW-h.clientW),a===!1&&(f=d),g=+b,"top"===b&&(g=0),"bottom"===b&&(g=h.scrollH-h.clientH),b===!1&&(g=e),this.animateScroll(d,f,e,g,+c)},scrollIntoView:function(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p=this.scrollEl;q.pauseCheck=!0,this.update(),"string"==typeof a?a=p.querySelector(a):a.length&&a.jquery&&(a=a[0]),"number"==typeof c&&(c={top:c,right:c,bottom:c,left:c}),c=c||{},d=a.getBoundingClientRect(),e=p.getBoundingClientRect(),l=n=p.scrollLeft,m=o=p.scrollTop,j=l+d.left-e.left,k=m+d.top-e.top,f=j-(c.left||0),g=k-(c.top||0),h=j+d.width-this.cache.clientW+(c.right||0),i=k+d.height-this.cache.clientH+(c.bottom||0),f<l&&(n=f),h>l&&(n=h),g<m&&(o=g),i>m&&(o=i),this.animateScroll(l,n,m,o,+b)},animateScroll:function(b,d,e,f,g){var h=this,i=this.scrollEl,j=Date.now();if(d!==b||f!==e){if(0===g)return i.scrollLeft=d,void(i.scrollTop=f);isNaN(g)&&(g=15*c.pow(c.max(c.abs(d-b),c.abs(f-e)),.54)),function k(){var l=c.min(1,(Date.now()-j)/g),m=p.easingFunction(l);f!==e&&(i.scrollTop=~~(m*(f-e))+e),d!==b&&(i.scrollLeft=~~(m*(d-b))+b),h.scrollAnimation=l<1?a.requestAnimationFrame(k):null}()}},destroy:function(){var b,c=this,d=this.element,e=this.scrollEl,f=this.listeners;if(this.scrollEl){for(var g in f)e.removeEventListener(g,f[g]);if(j(this.scrollbars,"remove"),!this.settings.contentElement){for(;b=e.childNodes[0];)d.insertBefore(b,e);d.removeChild(e),this.scrollEl=null}h(d,this.settings.classPrefix+"prevent",!1),h(d,"is-enabled",!1),a.requestAnimationFrame(function(){var a=q.instances.indexOf(c);a>-1&&q.instances.splice(a,1)})}},fireCustomEvent:function(a){var c,d=this.cache,e=d.scrollH,f=d.scrollW;c={scrollbarV:i({},d.v),scrollbarH:i({},d.h),scrollTop:d.v.position*e,scrollLeft:d.h.position*f,scrollBottom:(1-d.v.position-d.v.size)*e,scrollRight:(1-d.h.position-d.h.size)*f,scrollWidth:f,scrollHeight:e,clientWidth:d.clientW,clientHeight:d.clientH};var g;"function"===CustomEvent?g=new CustomEvent(a,{detail:c}):(g=b.createEvent("CustomEvent"),g.initCustomEvent(a,!1,!1,c)),this.element.dispatchEvent(g)}};var n={scroll:function(a){q.pauseCheck||this.fireCustomEvent("scrollstart"),q.pauseCheck=!0,this.scrollbars.v.update(),this.scrollbars.h.update(),this.fireCustomEvent("scroll"),clearTimeout(this.cache.timerStop),this.cache.timerStop=setTimeout(n.scrollStop.bind(this),this.settings.scrollStopDelay)},touchstart:function(a){q.pauseCheck=!1,this.scrollbars.v.update(),this.scrollbars.h.update(),n.wheel.call(this,a)},touchend:function(a){clearTimeout(this.cache.timerStop)},scrollStop:function(){this.fireCustomEvent("scrollstop"),q.pauseCheck=!1},wheel:function(b){var c=this.cache,d=c.v,e=c.h,f=this.settings.preventParentScroll&&q.isTouch;a.cancelAnimationFrame(this.scrollAnimation),f&&d.enabled&&d.percent%100==0&&(this.scrollEl.scrollTop=d.percent?c.scrollH-c.clientH-1:1),f&&e.enabled&&e.percent%100==0&&(this.scrollEl.scrollLeft=e.percent?c.scrollW-c.clientW-1:1)}},o=function(a,d){var e="v"===a,f=d.element,g=d.scrollEl,j=d.settings,k=d.cache,l=k[a]={},m=e?"H":"W",n="client"+m,o="scroll"+m,p=e?"scrollTop":"scrollLeft",r=e?["top","bottom"]:["left","right"],s=q.scrollbarSpec.rtl,t=!1,u=null,v=null,w={dragData:null,dragStart:function(a){var b=a.touches?a.touches[0]:a;w.dragData={x:b.pageX,y:b.pageY,scroll:g[p]},w.bind(!0)},dragMove:function(a){var b,c,d=a.touches?a.touches[0]:a,f=j.rtl&&1===s&&!e?-1:1;a.preventDefault(),b=e?d.pageY-w.dragData.y:d.pageX-w.dragData.x,c=b/k[n],g[p]=w.dragData.scroll+c*k[o]*f},dragEnd:function(){w.dragData=null,w.bind(!1)},bind:function(a){var c=(a?"add":"remove")+"EventListener",d=q.isTouch?["touchmove","touchend"]:["mousemove","mouseup"];b[c](d[0],w.dragMove),b[c](d[1],w.dragEnd)}};return{toggle:function(b){t=b,v&&h(f,"has-"+a+"track",t),l.enabled=t},create:function(){var c=q.isTouch?"touchstart":"mousedown";u=b.createElement("div"),v=b.createElement("b"),u.className=j.classPrefix+a,v.className=j.classPrefix+a+"track",u.appendChild(v),f.appendChild(u),j.draggableTracks&&v.addEventListener(c,w.dragStart)},update:function(){var a,b,d,e,f;(t||k[n]!==k[o])&&(d=this.calc(),a=d.size,b=l.size,e=1/a*d.position*100,f=c.abs(d.position-(l.position||0))*k[n],1===a&&t&&this.toggle(!1),a<1&&!t&&this.toggle(!0),v&&t&&this.style(e,f,a,b),l=i(l,d),t&&this.fireEdgeEv())},style:function(a,b,c,d){c!==d&&(v.style[e?"height":"width"]=100*c+"%",j.rtl&&!e&&(v.style.marginRight=100*(1-c)+"%")),v.style[q.cssTransform]="translate("+(e?"0%,"+a+"%":a+"%,0%")+")"},calc:function(){var a,b,d=g[p],f=k[n],h=k[o],i=f/h,l=h-f;return i>=1||!h?{position:0,size:1,percent:0}:(!e&&j.rtl&&s&&(d=l-d*s),b=100*d/l,d<=1&&(b=0),d>=l-1&&(b=100),i=c.max(i,j.minTrackSize/100),i=c.min(i,j.maxTrackSize/100),a=b/100*(1-i),{position:a,size:i,percent:b})},fireEdgeEv:function(){var a=l.percent;l.was!==a&&a%100==0&&(d.fireCustomEvent("scrollreachedge"),d.fireCustomEvent("scrollreach"+r[a/100])),l.was=a},remove:function(){this.toggle(!1),u&&(u.parentNode.removeChild(u),u=null)}}},p={hideNativeScrollbars:function(a,b){var c=q.scrollbarSpec.width,d=a.style;if(0===c){var e=Date.now();return a.setAttribute("data-scroll",e),p.addCssRule('[data-scroll="'+e+'"]::-webkit-scrollbar',"display:none;width:0;height:0;")}return d[b?"left":"right"]=-c+"px",d.bottom=-c+"px",!0},addCssRule:function(a,c){var d=b.getElementById("scroll-sheet");d||(d=b.createElement("style"),d.id="scroll-sheet",d.appendChild(b.createTextNode("")),b.head.appendChild(d));try{return d.sheet.insertRule(a+" {"+c+"}",0),!0}catch(a){return}},createWrapper:function(a,c){for(var d,e=b.createElement("div");d=a.childNodes[0];)e.appendChild(d);return a.appendChild(e)},checkLoop:function(){if(!q.instances.length)return void(q.checkTimer=null);q.pauseCheck||j(q.instances,"update"),m.checkFrequency&&(q.checkTimer=setTimeout(function(){p.checkLoop()},m.checkFrequency))},easingFunction:function(a){return--a*a*a+1}},q=l.G={isTouch:"ontouchstart"in a,cssTransition:g("transition"),cssTransform:g("transform"),scrollbarSpec:e(),passiveEvent:f(),instances:[],checkTimer:null,pauseCheck:!1};"function"==typeof define&&define.amd&&define(function(){return l}),"undefined"!=typeof module&&module.exports&&(module.exports=l),a.Optiscroll=l}(window,document,Math),function(a){var b="optiscroll";a.fn[b]=function(c){var d,e;return"string"==typeof c&&(e=Array.prototype.slice.call(arguments),d=e.shift()),this.each(function(){var f=a(this),g=f.data(b);g?g&&"string"==typeof d&&(g[d].apply(g,e),"destroy"===d&&f.removeData(b)):(g=new window.Optiscroll(this,c||{}),f.data(b,g))})}}(jQuery||Zepto); | ||
!function(a,b,c,d){"use strict";function e(){var a,c,d=b.documentElement,e=0,f=1;return a=b.createElement("div"),a.style.cssText="overflow:scroll;width:50px;height:50px;position:absolute;left:-100px;direction:rtl",c=b.createElement("div"),c.style.cssText="width:100px;height:100px",a.appendChild(c),d.appendChild(a),e=a.offsetWidth-a.clientWidth,a.scrollLeft>0?f=0:(a.scrollLeft=1,0===a.scrollLeft&&(f=-1)),d.removeChild(a),{width:e,rtl:f}}function f(){var b=!1,c=Object.defineProperty({},"passive",{get:function(){b=!0}});return a.addEventListener("test",null,c),!!b&&{capture:!1,passive:!0}}function g(a){var c=a.charAt(0).toUpperCase()+a.slice(1),e=b.createElement("test"),f=[a,"Webkit"+c];for(var g in f)if(e.style[f[g]]!==d)return f[g];return""}function h(a,b,c){var d=a.className.split(/\s+/),e=d.indexOf(b);c?~e||d.push(b):~e&&d.splice(e,1),a.className=d.join(" ")}function i(a,b,c){for(var e in b)!b.hasOwnProperty(e)||a[e]!==d&&c||(a[e]=b[e]);return a}function j(a,b,c){var d,e;if(a.length)for(d=0,e=a.length;d<e;d++)a[d][b].apply(a[d],c);else for(d in a)a[d][b].apply(a[d],c)}function k(a,b){var c,d;return function(){var e=this,f=Date.now(),g=arguments;c&&f<c+b?(clearTimeout(d),d=setTimeout(function(){c=f,a.apply(e,g)},b)):(c=f,a.apply(e,g))}}var l=function a(b,c){return new a.Instance(b,c||{})},m=l.globalSettings={scrollMinUpdateInterval:25,checkFrequency:1e3,pauseCheck:!1};l.defaults={preventParentScroll:!1,forceScrollbars:!1,scrollStopDelay:300,maxTrackSize:95,minTrackSize:5,draggableTracks:!0,autoUpdate:!0,classPrefix:"optiscroll-",wrapContent:!0,rtl:!1},l.Instance=function(b,c){this.element=b,this.settings=i(i({},l.defaults),c||{}),"boolean"!=typeof c.rtl&&(this.settings.rtl="rtl"===a.getComputedStyle(b).direction),this.cache={},this.init()},l.Instance.prototype={init:function(){var a=this.element,b=this.settings,c=!1,d=this.scrollEl=b.wrapContent?p.createWrapper(a):a.firstElementChild;h(d,b.classPrefix+"content",!0),h(a,"is-enabled"+(b.rtl?" is-rtl":""),!0),this.scrollbars={v:o("v",this),h:o("h",this)},(q.scrollbarSpec.width||b.forceScrollbars)&&(c=p.hideNativeScrollbars(d,b.rtl)),c&&j(this.scrollbars,"create"),q.isTouch&&b.preventParentScroll&&h(a,b.classPrefix+"prevent",!0),this.update(),this.bind(),b.autoUpdate&&q.instances.push(this),b.autoUpdate&&!q.checkTimer&&p.checkLoop()},bind:function(){var a=this.listeners={},b=this.scrollEl;a.scroll=k(n.scroll.bind(this),m.scrollMinUpdateInterval),q.isTouch&&(a.touchstart=n.touchstart.bind(this),a.touchend=n.touchend.bind(this)),a.mousewheel=a.wheel=n.wheel.bind(this);for(var c in a)b.addEventListener(c,a[c],q.passiveEvent)},update:function(){var a=this.scrollEl,c=this.cache,e=c.clientH,f=a.scrollHeight,g=a.clientHeight,h=a.scrollWidth,i=a.clientWidth;if(f!==c.scrollH||g!==c.clientH||h!==c.scrollW||i!==c.clientW){if(c.scrollH=f,c.clientH=g,c.scrollW=h,c.clientW=i,e!==d){if(0===f&&0===g&&!b.body.contains(this.element))return this.destroy(),!1;this.fireCustomEvent("sizechange")}j(this.scrollbars,"update")}},scrollTo:function(a,b,c){var d,e,f,g,h=this.cache;q.pauseCheck=!0,this.update(),d=this.scrollEl.scrollLeft,e=this.scrollEl.scrollTop,f=+a,"left"===a&&(f=0),"right"===a&&(f=h.scrollW-h.clientW),a===!1&&(f=d),g=+b,"top"===b&&(g=0),"bottom"===b&&(g=h.scrollH-h.clientH),b===!1&&(g=e),this.animateScroll(d,f,e,g,+c)},scrollIntoView:function(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p=this.scrollEl;q.pauseCheck=!0,this.update(),"string"==typeof a?a=p.querySelector(a):a.length&&a.jquery&&(a=a[0]),"number"==typeof c&&(c={top:c,right:c,bottom:c,left:c}),c=c||{},d=a.getBoundingClientRect(),e=p.getBoundingClientRect(),l=n=p.scrollLeft,m=o=p.scrollTop,j=l+d.left-e.left,k=m+d.top-e.top,f=j-(c.left||0),g=k-(c.top||0),h=j+d.width-this.cache.clientW+(c.right||0),i=k+d.height-this.cache.clientH+(c.bottom||0),f<l&&(n=f),h>l&&(n=h),g<m&&(o=g),i>m&&(o=i),this.animateScroll(l,n,m,o,+b)},animateScroll:function(b,d,e,f,g){var h=this,i=this.scrollEl,j=Date.now();if(d!==b||f!==e){if(0===g)return i.scrollLeft=d,void(i.scrollTop=f);isNaN(g)&&(g=15*c.pow(c.max(c.abs(d-b),c.abs(f-e)),.54)),function k(){var l=c.min(1,(Date.now()-j)/g),m=p.easingFunction(l);f!==e&&(i.scrollTop=~~(m*(f-e))+e),d!==b&&(i.scrollLeft=~~(m*(d-b))+b),h.scrollAnimation=l<1?a.requestAnimationFrame(k):null}()}},destroy:function(){var b,c=this,d=this.element,e=this.scrollEl,f=this.listeners;if(this.scrollEl){for(var g in f)e.removeEventListener(g,f[g]);if(j(this.scrollbars,"remove"),!this.settings.contentElement){for(;b=e.childNodes[0];)d.insertBefore(b,e);d.removeChild(e),this.scrollEl=null}h(d,this.settings.classPrefix+"prevent",!1),h(d,"is-enabled",!1),a.requestAnimationFrame(function(){var a=q.instances.indexOf(c);a>-1&&q.instances.splice(a,1)})}},fireCustomEvent:function(a){var c,d=this.cache,e=d.scrollH,f=d.scrollW;c={scrollbarV:i({},d.v),scrollbarH:i({},d.h),scrollTop:d.v.position*e,scrollLeft:d.h.position*f,scrollBottom:(1-d.v.position-d.v.size)*e,scrollRight:(1-d.h.position-d.h.size)*f,scrollWidth:f,scrollHeight:e,clientWidth:d.clientW,clientHeight:d.clientH};var g;"function"==typeof CustomEvent?g=new CustomEvent(a,{detail:c}):(g=b.createEvent("CustomEvent"),g.initCustomEvent(a,!1,!1,c)),this.element.dispatchEvent(g)}};var n={scroll:function(a){q.pauseCheck||this.fireCustomEvent("scrollstart"),q.pauseCheck=!0,this.scrollbars.v.update(),this.scrollbars.h.update(),this.fireCustomEvent("scroll"),clearTimeout(this.cache.timerStop),this.cache.timerStop=setTimeout(n.scrollStop.bind(this),this.settings.scrollStopDelay)},touchstart:function(a){q.pauseCheck=!1,this.scrollbars.v.update(),this.scrollbars.h.update(),n.wheel.call(this,a)},touchend:function(a){clearTimeout(this.cache.timerStop)},scrollStop:function(){this.fireCustomEvent("scrollstop"),q.pauseCheck=!1},wheel:function(b){var c=this.cache,d=c.v,e=c.h,f=this.settings.preventParentScroll&&q.isTouch;a.cancelAnimationFrame(this.scrollAnimation),f&&d.enabled&&d.percent%100==0&&(this.scrollEl.scrollTop=d.percent?c.scrollH-c.clientH-1:1),f&&e.enabled&&e.percent%100==0&&(this.scrollEl.scrollLeft=e.percent?c.scrollW-c.clientW-1:1)}},o=function(d,e){var f="v"===d,g=e.element,j=e.scrollEl,k=e.settings,l=e.cache,m=l[d]={},n=f?"H":"W",o="client"+n,p="scroll"+n,r=f?"scrollTop":"scrollLeft",s=f?["top","bottom"]:["left","right"],t=/^(mouse|touch|pointer)/,u=q.scrollbarSpec.rtl,v=!1,w=null,x=null,y={dragData:null,dragStart:function(a){a.preventDefault();var b=a.touches?a.touches[0]:a;y.dragData={x:b.pageX,y:b.pageY,scroll:j[r]},y.bind(!0,a.type.match(t)[1])},dragMove:function(a){var b,c,d=a.touches?a.touches[0]:a,e=k.rtl&&1===u&&!f?-1:1;a.preventDefault(),b=f?d.pageY-y.dragData.y:d.pageX-y.dragData.x,c=b/l[o],j[r]=y.dragData.scroll+c*l[p]*e},dragEnd:function(a){y.dragData=null,y.bind(!1,a.type.match(t)[1])},bind:function(a,c){var d=(a?"add":"remove")+"EventListener",e=c+"move",f=c+("touch"===c?"end":"up");b[d](e,y.dragMove),b[d](f,y.dragEnd),b[d](c+"cancel",y.dragEnd)}};return{toggle:function(a){v=a,x&&h(g,"has-"+d+"track",v),m.enabled=v},create:function(){if(w=b.createElement("div"),x=b.createElement("b"),w.className=k.classPrefix+d,x.className=k.classPrefix+d+"track",w.appendChild(x),g.appendChild(w),k.draggableTracks){(a.PointerEvent?["pointerdown"]:["touchstart","mousedown"]).forEach(function(a){x.addEventListener(a,y.dragStart)})}},update:function(){var a,b,d,e,f;(v||l[o]!==l[p])&&(d=this.calc(),a=d.size,b=m.size,e=1/a*d.position*100,f=c.abs(d.position-(m.position||0))*l[o],1===a&&v&&this.toggle(!1),a<1&&!v&&this.toggle(!0),x&&v&&this.style(e,f,a,b),m=i(m,d),v&&this.fireEdgeEv())},style:function(a,b,c,d){c!==d&&(x.style[f?"height":"width"]=100*c+"%",k.rtl&&!f&&(x.style.marginRight=100*(1-c)+"%")),x.style[q.cssTransform]="translate("+(f?"0%,"+a+"%":a+"%,0%")+")"},calc:function(){var a,b,d=j[r],e=l[o],g=l[p],h=e/g,i=g-e;return h>=1||!g?{position:0,size:1,percent:0}:(!f&&k.rtl&&u&&(d=i-d*u),b=100*d/i,d<=1&&(b=0),d>=i-1&&(b=100),h=c.max(h,k.minTrackSize/100),h=c.min(h,k.maxTrackSize/100),a=b/100*(1-h),{position:a,size:h,percent:b})},fireEdgeEv:function(){var a=m.percent;m.was!==a&&a%100==0&&(e.fireCustomEvent("scrollreachedge"),e.fireCustomEvent("scrollreach"+s[a/100])),m.was=a},remove:function(){this.toggle(!1),w&&(w.parentNode.removeChild(w),w=null)}}},p={hideNativeScrollbars:function(a,b){var c=q.scrollbarSpec.width,d=a.style;if(0===c){var e=Date.now();return a.setAttribute("data-scroll",e),p.addCssRule('[data-scroll="'+e+'"]::-webkit-scrollbar',"display:none;width:0;height:0;")}return d[b?"left":"right"]=-c+"px",d.bottom=-c+"px",!0},addCssRule:function(a,c){var d=b.getElementById("scroll-sheet");d||(d=b.createElement("style"),d.id="scroll-sheet",d.appendChild(b.createTextNode("")),b.head.appendChild(d));try{return d.sheet.insertRule(a+" {"+c+"}",0),!0}catch(a){return}},createWrapper:function(a,c){for(var d,e=b.createElement("div");d=a.childNodes[0];)e.appendChild(d);return a.appendChild(e)},checkLoop:function(){if(!q.instances.length)return void(q.checkTimer=null);q.pauseCheck||j(q.instances,"update"),m.checkFrequency&&(q.checkTimer=setTimeout(function(){p.checkLoop()},m.checkFrequency))},easingFunction:function(a){return--a*a*a+1}},q=l.G={isTouch:"ontouchstart"in a,cssTransition:g("transition"),cssTransform:g("transform"),scrollbarSpec:e(),passiveEvent:f(),instances:[],checkTimer:null,pauseCheck:!1};"function"==typeof define&&define.amd&&define(function(){return l}),"undefined"!=typeof module&&module.exports&&(module.exports=l),a.Optiscroll=l}(window,document,Math),function(a){var b="optiscroll";a.fn[b]=function(c){var d,e;return"string"==typeof c&&(e=Array.prototype.slice.call(arguments),d=e.shift()),this.each(function(){var f=a(this),g=f.data(b);g?g&&"string"==typeof d&&(g[d].apply(g,e),"destroy"===d&&f.removeData(b)):(g=new window.Optiscroll(this,c||{}),f.data(b,g))})}}(jQuery||Zepto); |
/*! | ||
* Optiscroll.js v3.0.0 | ||
* Optiscroll.js v3.1.0 | ||
* https://github.com/wilsonfletcher/Optiscroll/ | ||
@@ -13,2 +13,3 @@ * | ||
/** | ||
@@ -25,3 +26,3 @@ * Optiscroll, use this to create instances | ||
var GS = Optiscroll.globalSettings = { | ||
@@ -50,3 +51,3 @@ scrollMinUpdateInterval: 1000 / 40, // 40 FPS | ||
// instance variables | ||
this.element = element; | ||
this.element = element; | ||
this.settings = _extend(_extend({}, Optiscroll.defaults), options || {}); | ||
@@ -57,3 +58,3 @@ if (typeof options.rtl !== 'boolean') { | ||
this.cache = {}; | ||
this.init(); | ||
@@ -71,5 +72,5 @@ }; | ||
shouldCreateScrollbars = false; | ||
var scrollEl = this.scrollEl = settings.wrapContent | ||
? Utils.createWrapper(element) | ||
var scrollEl = this.scrollEl = settings.wrapContent | ||
? Utils.createWrapper(element) | ||
: element.firstElementChild; | ||
@@ -81,3 +82,3 @@ | ||
// initialize scrollbars | ||
this.scrollbars = { | ||
this.scrollbars = { | ||
v: Scrollbar('v', this), | ||
@@ -90,3 +91,3 @@ h: Scrollbar('h', this), | ||
shouldCreateScrollbars = Utils.hideNativeScrollbars(scrollEl, settings.rtl); | ||
} | ||
} | ||
@@ -119,4 +120,4 @@ if(shouldCreateScrollbars) { | ||
bind: function () { | ||
@@ -154,6 +155,6 @@ var listeners = this.listeners = {}, | ||
cW = scrollEl.clientWidth; | ||
if(sH !== cache.scrollH || cH !== cache.clientH || | ||
if(sH !== cache.scrollH || cH !== cache.clientH || | ||
sW !== cache.scrollW || cW !== cache.clientW) { | ||
cache.scrollH = sH; | ||
@@ -198,3 +199,3 @@ cache.clientH = cH; | ||
startY = this.scrollEl.scrollTop; | ||
endX = +destX; | ||
@@ -212,3 +213,3 @@ if(destX === 'left') { endX = 0; } | ||
this.animateScroll(startX, endX, startY, endY, +duration); | ||
}, | ||
@@ -252,3 +253,3 @@ | ||
bottomEdge = offsetY + eDim.height - this.cache.clientH + (delta.bottom || 0); | ||
if(leftEdge < startX) { endX = leftEdge; } | ||
@@ -286,7 +287,7 @@ if(rightEdge > startX) { endX = rightEdge; } | ||
} | ||
(function animate () { | ||
var time = Math.min(1, ((Date.now() - startTime) / duration)), | ||
easedTime = Utils.easingFunction(time); | ||
if(endY !== startY) { | ||
@@ -300,3 +301,3 @@ scrollEl.scrollTop = ~~(easedTime * (endY - startY)) + startY; | ||
self.scrollAnimation = time < 1 ? window.requestAnimationFrame(animate) : null; | ||
}(this)); | ||
}()); | ||
}, | ||
@@ -354,3 +355,3 @@ | ||
eventData; | ||
eventData = { | ||
@@ -375,3 +376,3 @@ // scrollbars data | ||
var event; | ||
if (CustomEvent === 'function') { | ||
if (typeof CustomEvent === 'function') { | ||
event = new CustomEvent(eventName, { detail: eventData }); | ||
@@ -393,3 +394,3 @@ } else { // IE does not support CustomEvent | ||
scroll: function (ev) { | ||
if (!G.pauseCheck) { | ||
@@ -399,3 +400,3 @@ this.fireCustomEvent('scrollstart'); | ||
G.pauseCheck = true; | ||
this.scrollbars.v.update(); | ||
@@ -405,3 +406,3 @@ this.scrollbars.h.update(); | ||
this.fireCustomEvent('scroll'); | ||
clearTimeout(this.cache.timerStop); | ||
@@ -416,3 +417,3 @@ this.cache.timerStop = setTimeout(Events.scrollStop.bind(this), this.settings.scrollStopDelay); | ||
this.scrollbars.h.update(); | ||
Events.wheel.call(this, ev); | ||
@@ -437,3 +438,3 @@ }, | ||
var cache = this.cache, | ||
cacheV = cache.v, | ||
cacheV = cache.v, | ||
cacheH = cache.h, | ||
@@ -443,3 +444,3 @@ preventScroll = this.settings.preventParentScroll && G.isTouch; | ||
window.cancelAnimationFrame(this.scrollAnimation); | ||
if(preventScroll && cacheV.enabled && cacheV.percent % 100 === 0) { | ||
@@ -470,3 +471,4 @@ this.scrollEl.scrollTop = cacheV.percent ? (cache.scrollH - cache.clientH - 1) : 1; | ||
scrollProp = isVertical ? 'scrollTop' : 'scrollLeft', | ||
evNames = isVertical ? ['top','bottom'] : ['left','right'], | ||
evSuffixes = isVertical ? ['top','bottom'] : ['left','right'], | ||
evTypesMatcher = /^(mouse|touch|pointer)/, | ||
@@ -482,5 +484,6 @@ rtlMode = G.scrollbarSpec.rtl, | ||
dragStart: function (ev) { | ||
ev.preventDefault(); | ||
var evData = ev.touches ? ev.touches[0] : ev; | ||
events.dragData = { x: evData.pageX, y: evData.pageY, scroll: scrollEl[scrollProp] }; | ||
events.bind(true); | ||
events.bind(true, ev.type.match(evTypesMatcher)[1]); | ||
}, | ||
@@ -492,25 +495,27 @@ | ||
delta, deltaRatio; | ||
ev.preventDefault(); | ||
delta = isVertical ? evData.pageY - events.dragData.y : evData.pageX - events.dragData.x; | ||
deltaRatio = delta / cache[clientSize]; | ||
scrollEl[scrollProp] = events.dragData.scroll + deltaRatio * cache[scrollSize] * dragMode; | ||
}, | ||
dragEnd: function () { | ||
dragEnd: function (ev) { | ||
events.dragData = null; | ||
events.bind(false); | ||
events.bind(false, ev.type.match(evTypesMatcher)[1]); | ||
}, | ||
bind: function (on) { | ||
bind: function (on, type) { | ||
var method = (on ? 'add' : 'remove') + 'EventListener', | ||
type = G.isTouch ? ['touchmove', 'touchend'] : ['mousemove', 'mouseup']; | ||
moveEv = type + 'move', | ||
upEv = type + (type === 'touch' ? 'end' : 'up'); | ||
document[method](type[0], events.dragMove); | ||
document[method](type[1], events.dragEnd); | ||
document[method](moveEv, events.dragMove); | ||
document[method](upEv, events.dragEnd); | ||
document[method](type + 'cancel', events.dragEnd); | ||
}, | ||
}; | ||
return { | ||
@@ -532,3 +537,2 @@ | ||
create: function () { | ||
var evType = G.isTouch ? 'touchstart' : 'mousedown'; | ||
scrollbarEl = document.createElement('div'); | ||
@@ -543,3 +547,6 @@ trackEl = document.createElement('b'); | ||
if(settings.draggableTracks) { | ||
trackEl.addEventListener(evType, events.dragStart); | ||
var evTypes = window.PointerEvent ? ['pointerdown'] : ['touchstart', 'mousedown']; | ||
evTypes.forEach(function (evType) { | ||
trackEl.addEventListener(evType, events.dragStart); | ||
}); | ||
} | ||
@@ -582,3 +589,3 @@ }, | ||
} | ||
}, | ||
@@ -594,4 +601,4 @@ | ||
} | ||
trackEl.style[G.cssTransform] = 'translate(' + | ||
(isVertical ? '0%,' + newRelPos + '%' : newRelPos + '%' + ',0%') | ||
trackEl.style[G.cssTransform] = 'translate(' + | ||
(isVertical ? '0%,' + newRelPos + '%' : newRelPos + '%' + ',0%') | ||
+ ')'; | ||
@@ -603,8 +610,8 @@ }, | ||
var position = scrollEl[scrollProp], | ||
viewS = cache[clientSize], | ||
scrollS = cache[scrollSize], | ||
viewS = cache[clientSize], | ||
scrollS = cache[scrollSize], | ||
sizeRatio = viewS / scrollS, | ||
sizeDiff = scrollS - viewS, | ||
positionRatio, percent; | ||
if(sizeRatio >= 1 || !scrollS) { // no scrollbars needed | ||
@@ -619,8 +626,8 @@ return { position: 0, size: 1, percent: 0 }; | ||
// prevent overscroll effetcs (negative percent) | ||
// prevent overscroll effetcs (negative percent) | ||
// and keep 1px tolerance near the edges | ||
if(position <= 1) { percent = 0; } | ||
if(position >= sizeDiff - 1) { percent = 100; } | ||
// Capped size based on min/max track percentage | ||
// Capped size based on min/max track percentage | ||
sizeRatio = Math.max(sizeRatio, settings.minTrackSize / 100); | ||
@@ -640,3 +647,3 @@ sizeRatio = Math.min(sizeRatio, settings.maxTrackSize / 100); | ||
instance.fireCustomEvent('scrollreachedge'); | ||
instance.fireCustomEvent('scrollreach' + evNames[percent / 100]); | ||
instance.fireCustomEvent('scrollreach' + evSuffixes[percent / 100]); | ||
} | ||
@@ -688,3 +695,3 @@ | ||
document.head.appendChild(styleSheet); | ||
} | ||
} | ||
try { | ||
@@ -710,3 +717,3 @@ styleSheet.sheet.insertRule(selector + ' {' + rules + '}', 0); | ||
checkLoop: function () { | ||
if(!G.instances.length) { | ||
@@ -720,3 +727,3 @@ G.checkTimer = null; | ||
} | ||
if(GS.checkFrequency) { | ||
@@ -731,4 +738,4 @@ G.checkTimer = setTimeout(function () { | ||
// easeOutCubic function | ||
easingFunction: function (t) { | ||
return (--t) * t * t + 1; | ||
easingFunction: function (t) { | ||
return (--t) * t * t + 1; | ||
}, | ||
@@ -769,7 +776,7 @@ | ||
width = outerEl.offsetWidth - outerEl.clientWidth; | ||
if (outerEl.scrollLeft > 0) { | ||
if (outerEl.scrollLeft > 0) { | ||
rtl = 0; // webkit is default | ||
} else { | ||
outerEl.scrollLeft = 1; | ||
if (outerEl.scrollLeft === 0) { | ||
if (outerEl.scrollLeft === 0) { | ||
rtl = -1; // firefox is negative | ||
@@ -779,3 +786,3 @@ } | ||
htmlEl.removeChild(outerEl); | ||
return { width: width, rtl: rtl }; | ||
@@ -800,3 +807,3 @@ } | ||
props = [prop, 'Webkit' + ucProp]; | ||
for (var i in props) { | ||
@@ -813,3 +820,3 @@ if(el.style[props[i]] !== undefined) { return props[i]; } | ||
index = classes.indexOf(value); | ||
if(bool) { | ||
@@ -879,3 +886,3 @@ ~index || classes.push(value); | ||
} | ||
// commonjs export | ||
@@ -885,5 +892,5 @@ if(typeof module !== 'undefined' && module.exports) { | ||
} | ||
window.Optiscroll = Optiscroll; | ||
})(window, document, Math); | ||
})(window, document, Math); |
/*! | ||
* Optiscroll.js v3.0.0 | ||
* Optiscroll.js v3.1.0 | ||
* https://github.com/wilsonfletcher/Optiscroll/ | ||
@@ -8,2 +8,2 @@ * | ||
*/ | ||
!function(a,b,c,d){"use strict";function e(){var a,c,d=b.documentElement,e=0,f=1;return a=b.createElement("div"),a.style.cssText="overflow:scroll;width:50px;height:50px;position:absolute;left:-100px;direction:rtl",c=b.createElement("div"),c.style.cssText="width:100px;height:100px",a.appendChild(c),d.appendChild(a),e=a.offsetWidth-a.clientWidth,a.scrollLeft>0?f=0:(a.scrollLeft=1,0===a.scrollLeft&&(f=-1)),d.removeChild(a),{width:e,rtl:f}}function f(){var b=!1,c=Object.defineProperty({},"passive",{get:function(){b=!0}});return a.addEventListener("test",null,c),!!b&&{capture:!1,passive:!0}}function g(a){var c=a.charAt(0).toUpperCase()+a.slice(1),e=b.createElement("test"),f=[a,"Webkit"+c];for(var g in f)if(e.style[f[g]]!==d)return f[g];return""}function h(a,b,c){var d=a.className.split(/\s+/),e=d.indexOf(b);c?~e||d.push(b):~e&&d.splice(e,1),a.className=d.join(" ")}function i(a,b,c){for(var e in b)!b.hasOwnProperty(e)||a[e]!==d&&c||(a[e]=b[e]);return a}function j(a,b,c){var d,e;if(a.length)for(d=0,e=a.length;d<e;d++)a[d][b].apply(a[d],c);else for(d in a)a[d][b].apply(a[d],c)}function k(a,b){var c,d;return function(){var e=this,f=Date.now(),g=arguments;c&&f<c+b?(clearTimeout(d),d=setTimeout(function(){c=f,a.apply(e,g)},b)):(c=f,a.apply(e,g))}}var l=function a(b,c){return new a.Instance(b,c||{})},m=l.globalSettings={scrollMinUpdateInterval:25,checkFrequency:1e3,pauseCheck:!1};l.defaults={preventParentScroll:!1,forceScrollbars:!1,scrollStopDelay:300,maxTrackSize:95,minTrackSize:5,draggableTracks:!0,autoUpdate:!0,classPrefix:"optiscroll-",wrapContent:!0,rtl:!1},l.Instance=function(b,c){this.element=b,this.settings=i(i({},l.defaults),c||{}),"boolean"!=typeof c.rtl&&(this.settings.rtl="rtl"===a.getComputedStyle(b).direction),this.cache={},this.init()},l.Instance.prototype={init:function(){var a=this.element,b=this.settings,c=!1,d=this.scrollEl=b.wrapContent?p.createWrapper(a):a.firstElementChild;h(d,b.classPrefix+"content",!0),h(a,"is-enabled"+(b.rtl?" is-rtl":""),!0),this.scrollbars={v:o("v",this),h:o("h",this)},(q.scrollbarSpec.width||b.forceScrollbars)&&(c=p.hideNativeScrollbars(d,b.rtl)),c&&j(this.scrollbars,"create"),q.isTouch&&b.preventParentScroll&&h(a,b.classPrefix+"prevent",!0),this.update(),this.bind(),b.autoUpdate&&q.instances.push(this),b.autoUpdate&&!q.checkTimer&&p.checkLoop()},bind:function(){var a=this.listeners={},b=this.scrollEl;a.scroll=k(n.scroll.bind(this),m.scrollMinUpdateInterval),q.isTouch&&(a.touchstart=n.touchstart.bind(this),a.touchend=n.touchend.bind(this)),a.mousewheel=a.wheel=n.wheel.bind(this);for(var c in a)b.addEventListener(c,a[c],q.passiveEvent)},update:function(){var a=this.scrollEl,c=this.cache,e=c.clientH,f=a.scrollHeight,g=a.clientHeight,h=a.scrollWidth,i=a.clientWidth;if(f!==c.scrollH||g!==c.clientH||h!==c.scrollW||i!==c.clientW){if(c.scrollH=f,c.clientH=g,c.scrollW=h,c.clientW=i,e!==d){if(0===f&&0===g&&!b.body.contains(this.element))return this.destroy(),!1;this.fireCustomEvent("sizechange")}j(this.scrollbars,"update")}},scrollTo:function(a,b,c){var d,e,f,g,h=this.cache;q.pauseCheck=!0,this.update(),d=this.scrollEl.scrollLeft,e=this.scrollEl.scrollTop,f=+a,"left"===a&&(f=0),"right"===a&&(f=h.scrollW-h.clientW),a===!1&&(f=d),g=+b,"top"===b&&(g=0),"bottom"===b&&(g=h.scrollH-h.clientH),b===!1&&(g=e),this.animateScroll(d,f,e,g,+c)},scrollIntoView:function(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p=this.scrollEl;q.pauseCheck=!0,this.update(),"string"==typeof a?a=p.querySelector(a):a.length&&a.jquery&&(a=a[0]),"number"==typeof c&&(c={top:c,right:c,bottom:c,left:c}),c=c||{},d=a.getBoundingClientRect(),e=p.getBoundingClientRect(),l=n=p.scrollLeft,m=o=p.scrollTop,j=l+d.left-e.left,k=m+d.top-e.top,f=j-(c.left||0),g=k-(c.top||0),h=j+d.width-this.cache.clientW+(c.right||0),i=k+d.height-this.cache.clientH+(c.bottom||0),f<l&&(n=f),h>l&&(n=h),g<m&&(o=g),i>m&&(o=i),this.animateScroll(l,n,m,o,+b)},animateScroll:function(b,d,e,f,g){var h=this,i=this.scrollEl,j=Date.now();if(d!==b||f!==e){if(0===g)return i.scrollLeft=d,void(i.scrollTop=f);isNaN(g)&&(g=15*c.pow(c.max(c.abs(d-b),c.abs(f-e)),.54)),function k(){var l=c.min(1,(Date.now()-j)/g),m=p.easingFunction(l);f!==e&&(i.scrollTop=~~(m*(f-e))+e),d!==b&&(i.scrollLeft=~~(m*(d-b))+b),h.scrollAnimation=l<1?a.requestAnimationFrame(k):null}()}},destroy:function(){var b,c=this,d=this.element,e=this.scrollEl,f=this.listeners;if(this.scrollEl){for(var g in f)e.removeEventListener(g,f[g]);if(j(this.scrollbars,"remove"),!this.settings.contentElement){for(;b=e.childNodes[0];)d.insertBefore(b,e);d.removeChild(e),this.scrollEl=null}h(d,this.settings.classPrefix+"prevent",!1),h(d,"is-enabled",!1),a.requestAnimationFrame(function(){var a=q.instances.indexOf(c);a>-1&&q.instances.splice(a,1)})}},fireCustomEvent:function(a){var c,d=this.cache,e=d.scrollH,f=d.scrollW;c={scrollbarV:i({},d.v),scrollbarH:i({},d.h),scrollTop:d.v.position*e,scrollLeft:d.h.position*f,scrollBottom:(1-d.v.position-d.v.size)*e,scrollRight:(1-d.h.position-d.h.size)*f,scrollWidth:f,scrollHeight:e,clientWidth:d.clientW,clientHeight:d.clientH};var g;"function"===CustomEvent?g=new CustomEvent(a,{detail:c}):(g=b.createEvent("CustomEvent"),g.initCustomEvent(a,!1,!1,c)),this.element.dispatchEvent(g)}};var n={scroll:function(a){q.pauseCheck||this.fireCustomEvent("scrollstart"),q.pauseCheck=!0,this.scrollbars.v.update(),this.scrollbars.h.update(),this.fireCustomEvent("scroll"),clearTimeout(this.cache.timerStop),this.cache.timerStop=setTimeout(n.scrollStop.bind(this),this.settings.scrollStopDelay)},touchstart:function(a){q.pauseCheck=!1,this.scrollbars.v.update(),this.scrollbars.h.update(),n.wheel.call(this,a)},touchend:function(a){clearTimeout(this.cache.timerStop)},scrollStop:function(){this.fireCustomEvent("scrollstop"),q.pauseCheck=!1},wheel:function(b){var c=this.cache,d=c.v,e=c.h,f=this.settings.preventParentScroll&&q.isTouch;a.cancelAnimationFrame(this.scrollAnimation),f&&d.enabled&&d.percent%100==0&&(this.scrollEl.scrollTop=d.percent?c.scrollH-c.clientH-1:1),f&&e.enabled&&e.percent%100==0&&(this.scrollEl.scrollLeft=e.percent?c.scrollW-c.clientW-1:1)}},o=function(a,d){var e="v"===a,f=d.element,g=d.scrollEl,j=d.settings,k=d.cache,l=k[a]={},m=e?"H":"W",n="client"+m,o="scroll"+m,p=e?"scrollTop":"scrollLeft",r=e?["top","bottom"]:["left","right"],s=q.scrollbarSpec.rtl,t=!1,u=null,v=null,w={dragData:null,dragStart:function(a){var b=a.touches?a.touches[0]:a;w.dragData={x:b.pageX,y:b.pageY,scroll:g[p]},w.bind(!0)},dragMove:function(a){var b,c,d=a.touches?a.touches[0]:a,f=j.rtl&&1===s&&!e?-1:1;a.preventDefault(),b=e?d.pageY-w.dragData.y:d.pageX-w.dragData.x,c=b/k[n],g[p]=w.dragData.scroll+c*k[o]*f},dragEnd:function(){w.dragData=null,w.bind(!1)},bind:function(a){var c=(a?"add":"remove")+"EventListener",d=q.isTouch?["touchmove","touchend"]:["mousemove","mouseup"];b[c](d[0],w.dragMove),b[c](d[1],w.dragEnd)}};return{toggle:function(b){t=b,v&&h(f,"has-"+a+"track",t),l.enabled=t},create:function(){var c=q.isTouch?"touchstart":"mousedown";u=b.createElement("div"),v=b.createElement("b"),u.className=j.classPrefix+a,v.className=j.classPrefix+a+"track",u.appendChild(v),f.appendChild(u),j.draggableTracks&&v.addEventListener(c,w.dragStart)},update:function(){var a,b,d,e,f;(t||k[n]!==k[o])&&(d=this.calc(),a=d.size,b=l.size,e=1/a*d.position*100,f=c.abs(d.position-(l.position||0))*k[n],1===a&&t&&this.toggle(!1),a<1&&!t&&this.toggle(!0),v&&t&&this.style(e,f,a,b),l=i(l,d),t&&this.fireEdgeEv())},style:function(a,b,c,d){c!==d&&(v.style[e?"height":"width"]=100*c+"%",j.rtl&&!e&&(v.style.marginRight=100*(1-c)+"%")),v.style[q.cssTransform]="translate("+(e?"0%,"+a+"%":a+"%,0%")+")"},calc:function(){var a,b,d=g[p],f=k[n],h=k[o],i=f/h,l=h-f;return i>=1||!h?{position:0,size:1,percent:0}:(!e&&j.rtl&&s&&(d=l-d*s),b=100*d/l,d<=1&&(b=0),d>=l-1&&(b=100),i=c.max(i,j.minTrackSize/100),i=c.min(i,j.maxTrackSize/100),a=b/100*(1-i),{position:a,size:i,percent:b})},fireEdgeEv:function(){var a=l.percent;l.was!==a&&a%100==0&&(d.fireCustomEvent("scrollreachedge"),d.fireCustomEvent("scrollreach"+r[a/100])),l.was=a},remove:function(){this.toggle(!1),u&&(u.parentNode.removeChild(u),u=null)}}},p={hideNativeScrollbars:function(a,b){var c=q.scrollbarSpec.width,d=a.style;if(0===c){var e=Date.now();return a.setAttribute("data-scroll",e),p.addCssRule('[data-scroll="'+e+'"]::-webkit-scrollbar',"display:none;width:0;height:0;")}return d[b?"left":"right"]=-c+"px",d.bottom=-c+"px",!0},addCssRule:function(a,c){var d=b.getElementById("scroll-sheet");d||(d=b.createElement("style"),d.id="scroll-sheet",d.appendChild(b.createTextNode("")),b.head.appendChild(d));try{return d.sheet.insertRule(a+" {"+c+"}",0),!0}catch(a){return}},createWrapper:function(a,c){for(var d,e=b.createElement("div");d=a.childNodes[0];)e.appendChild(d);return a.appendChild(e)},checkLoop:function(){if(!q.instances.length)return void(q.checkTimer=null);q.pauseCheck||j(q.instances,"update"),m.checkFrequency&&(q.checkTimer=setTimeout(function(){p.checkLoop()},m.checkFrequency))},easingFunction:function(a){return--a*a*a+1}},q=l.G={isTouch:"ontouchstart"in a,cssTransition:g("transition"),cssTransform:g("transform"),scrollbarSpec:e(),passiveEvent:f(),instances:[],checkTimer:null,pauseCheck:!1};"function"==typeof define&&define.amd&&define(function(){return l}),"undefined"!=typeof module&&module.exports&&(module.exports=l),a.Optiscroll=l}(window,document,Math); | ||
!function(a,b,c,d){"use strict";function e(){var a,c,d=b.documentElement,e=0,f=1;return a=b.createElement("div"),a.style.cssText="overflow:scroll;width:50px;height:50px;position:absolute;left:-100px;direction:rtl",c=b.createElement("div"),c.style.cssText="width:100px;height:100px",a.appendChild(c),d.appendChild(a),e=a.offsetWidth-a.clientWidth,a.scrollLeft>0?f=0:(a.scrollLeft=1,0===a.scrollLeft&&(f=-1)),d.removeChild(a),{width:e,rtl:f}}function f(){var b=!1,c=Object.defineProperty({},"passive",{get:function(){b=!0}});return a.addEventListener("test",null,c),!!b&&{capture:!1,passive:!0}}function g(a){var c=a.charAt(0).toUpperCase()+a.slice(1),e=b.createElement("test"),f=[a,"Webkit"+c];for(var g in f)if(e.style[f[g]]!==d)return f[g];return""}function h(a,b,c){var d=a.className.split(/\s+/),e=d.indexOf(b);c?~e||d.push(b):~e&&d.splice(e,1),a.className=d.join(" ")}function i(a,b,c){for(var e in b)!b.hasOwnProperty(e)||a[e]!==d&&c||(a[e]=b[e]);return a}function j(a,b,c){var d,e;if(a.length)for(d=0,e=a.length;d<e;d++)a[d][b].apply(a[d],c);else for(d in a)a[d][b].apply(a[d],c)}function k(a,b){var c,d;return function(){var e=this,f=Date.now(),g=arguments;c&&f<c+b?(clearTimeout(d),d=setTimeout(function(){c=f,a.apply(e,g)},b)):(c=f,a.apply(e,g))}}var l=function a(b,c){return new a.Instance(b,c||{})},m=l.globalSettings={scrollMinUpdateInterval:25,checkFrequency:1e3,pauseCheck:!1};l.defaults={preventParentScroll:!1,forceScrollbars:!1,scrollStopDelay:300,maxTrackSize:95,minTrackSize:5,draggableTracks:!0,autoUpdate:!0,classPrefix:"optiscroll-",wrapContent:!0,rtl:!1},l.Instance=function(b,c){this.element=b,this.settings=i(i({},l.defaults),c||{}),"boolean"!=typeof c.rtl&&(this.settings.rtl="rtl"===a.getComputedStyle(b).direction),this.cache={},this.init()},l.Instance.prototype={init:function(){var a=this.element,b=this.settings,c=!1,d=this.scrollEl=b.wrapContent?p.createWrapper(a):a.firstElementChild;h(d,b.classPrefix+"content",!0),h(a,"is-enabled"+(b.rtl?" is-rtl":""),!0),this.scrollbars={v:o("v",this),h:o("h",this)},(q.scrollbarSpec.width||b.forceScrollbars)&&(c=p.hideNativeScrollbars(d,b.rtl)),c&&j(this.scrollbars,"create"),q.isTouch&&b.preventParentScroll&&h(a,b.classPrefix+"prevent",!0),this.update(),this.bind(),b.autoUpdate&&q.instances.push(this),b.autoUpdate&&!q.checkTimer&&p.checkLoop()},bind:function(){var a=this.listeners={},b=this.scrollEl;a.scroll=k(n.scroll.bind(this),m.scrollMinUpdateInterval),q.isTouch&&(a.touchstart=n.touchstart.bind(this),a.touchend=n.touchend.bind(this)),a.mousewheel=a.wheel=n.wheel.bind(this);for(var c in a)b.addEventListener(c,a[c],q.passiveEvent)},update:function(){var a=this.scrollEl,c=this.cache,e=c.clientH,f=a.scrollHeight,g=a.clientHeight,h=a.scrollWidth,i=a.clientWidth;if(f!==c.scrollH||g!==c.clientH||h!==c.scrollW||i!==c.clientW){if(c.scrollH=f,c.clientH=g,c.scrollW=h,c.clientW=i,e!==d){if(0===f&&0===g&&!b.body.contains(this.element))return this.destroy(),!1;this.fireCustomEvent("sizechange")}j(this.scrollbars,"update")}},scrollTo:function(a,b,c){var d,e,f,g,h=this.cache;q.pauseCheck=!0,this.update(),d=this.scrollEl.scrollLeft,e=this.scrollEl.scrollTop,f=+a,"left"===a&&(f=0),"right"===a&&(f=h.scrollW-h.clientW),a===!1&&(f=d),g=+b,"top"===b&&(g=0),"bottom"===b&&(g=h.scrollH-h.clientH),b===!1&&(g=e),this.animateScroll(d,f,e,g,+c)},scrollIntoView:function(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p=this.scrollEl;q.pauseCheck=!0,this.update(),"string"==typeof a?a=p.querySelector(a):a.length&&a.jquery&&(a=a[0]),"number"==typeof c&&(c={top:c,right:c,bottom:c,left:c}),c=c||{},d=a.getBoundingClientRect(),e=p.getBoundingClientRect(),l=n=p.scrollLeft,m=o=p.scrollTop,j=l+d.left-e.left,k=m+d.top-e.top,f=j-(c.left||0),g=k-(c.top||0),h=j+d.width-this.cache.clientW+(c.right||0),i=k+d.height-this.cache.clientH+(c.bottom||0),f<l&&(n=f),h>l&&(n=h),g<m&&(o=g),i>m&&(o=i),this.animateScroll(l,n,m,o,+b)},animateScroll:function(b,d,e,f,g){var h=this,i=this.scrollEl,j=Date.now();if(d!==b||f!==e){if(0===g)return i.scrollLeft=d,void(i.scrollTop=f);isNaN(g)&&(g=15*c.pow(c.max(c.abs(d-b),c.abs(f-e)),.54)),function k(){var l=c.min(1,(Date.now()-j)/g),m=p.easingFunction(l);f!==e&&(i.scrollTop=~~(m*(f-e))+e),d!==b&&(i.scrollLeft=~~(m*(d-b))+b),h.scrollAnimation=l<1?a.requestAnimationFrame(k):null}()}},destroy:function(){var b,c=this,d=this.element,e=this.scrollEl,f=this.listeners;if(this.scrollEl){for(var g in f)e.removeEventListener(g,f[g]);if(j(this.scrollbars,"remove"),!this.settings.contentElement){for(;b=e.childNodes[0];)d.insertBefore(b,e);d.removeChild(e),this.scrollEl=null}h(d,this.settings.classPrefix+"prevent",!1),h(d,"is-enabled",!1),a.requestAnimationFrame(function(){var a=q.instances.indexOf(c);a>-1&&q.instances.splice(a,1)})}},fireCustomEvent:function(a){var c,d=this.cache,e=d.scrollH,f=d.scrollW;c={scrollbarV:i({},d.v),scrollbarH:i({},d.h),scrollTop:d.v.position*e,scrollLeft:d.h.position*f,scrollBottom:(1-d.v.position-d.v.size)*e,scrollRight:(1-d.h.position-d.h.size)*f,scrollWidth:f,scrollHeight:e,clientWidth:d.clientW,clientHeight:d.clientH};var g;"function"==typeof CustomEvent?g=new CustomEvent(a,{detail:c}):(g=b.createEvent("CustomEvent"),g.initCustomEvent(a,!1,!1,c)),this.element.dispatchEvent(g)}};var n={scroll:function(a){q.pauseCheck||this.fireCustomEvent("scrollstart"),q.pauseCheck=!0,this.scrollbars.v.update(),this.scrollbars.h.update(),this.fireCustomEvent("scroll"),clearTimeout(this.cache.timerStop),this.cache.timerStop=setTimeout(n.scrollStop.bind(this),this.settings.scrollStopDelay)},touchstart:function(a){q.pauseCheck=!1,this.scrollbars.v.update(),this.scrollbars.h.update(),n.wheel.call(this,a)},touchend:function(a){clearTimeout(this.cache.timerStop)},scrollStop:function(){this.fireCustomEvent("scrollstop"),q.pauseCheck=!1},wheel:function(b){var c=this.cache,d=c.v,e=c.h,f=this.settings.preventParentScroll&&q.isTouch;a.cancelAnimationFrame(this.scrollAnimation),f&&d.enabled&&d.percent%100==0&&(this.scrollEl.scrollTop=d.percent?c.scrollH-c.clientH-1:1),f&&e.enabled&&e.percent%100==0&&(this.scrollEl.scrollLeft=e.percent?c.scrollW-c.clientW-1:1)}},o=function(d,e){var f="v"===d,g=e.element,j=e.scrollEl,k=e.settings,l=e.cache,m=l[d]={},n=f?"H":"W",o="client"+n,p="scroll"+n,r=f?"scrollTop":"scrollLeft",s=f?["top","bottom"]:["left","right"],t=/^(mouse|touch|pointer)/,u=q.scrollbarSpec.rtl,v=!1,w=null,x=null,y={dragData:null,dragStart:function(a){a.preventDefault();var b=a.touches?a.touches[0]:a;y.dragData={x:b.pageX,y:b.pageY,scroll:j[r]},y.bind(!0,a.type.match(t)[1])},dragMove:function(a){var b,c,d=a.touches?a.touches[0]:a,e=k.rtl&&1===u&&!f?-1:1;a.preventDefault(),b=f?d.pageY-y.dragData.y:d.pageX-y.dragData.x,c=b/l[o],j[r]=y.dragData.scroll+c*l[p]*e},dragEnd:function(a){y.dragData=null,y.bind(!1,a.type.match(t)[1])},bind:function(a,c){var d=(a?"add":"remove")+"EventListener",e=c+"move",f=c+("touch"===c?"end":"up");b[d](e,y.dragMove),b[d](f,y.dragEnd),b[d](c+"cancel",y.dragEnd)}};return{toggle:function(a){v=a,x&&h(g,"has-"+d+"track",v),m.enabled=v},create:function(){if(w=b.createElement("div"),x=b.createElement("b"),w.className=k.classPrefix+d,x.className=k.classPrefix+d+"track",w.appendChild(x),g.appendChild(w),k.draggableTracks){(a.PointerEvent?["pointerdown"]:["touchstart","mousedown"]).forEach(function(a){x.addEventListener(a,y.dragStart)})}},update:function(){var a,b,d,e,f;(v||l[o]!==l[p])&&(d=this.calc(),a=d.size,b=m.size,e=1/a*d.position*100,f=c.abs(d.position-(m.position||0))*l[o],1===a&&v&&this.toggle(!1),a<1&&!v&&this.toggle(!0),x&&v&&this.style(e,f,a,b),m=i(m,d),v&&this.fireEdgeEv())},style:function(a,b,c,d){c!==d&&(x.style[f?"height":"width"]=100*c+"%",k.rtl&&!f&&(x.style.marginRight=100*(1-c)+"%")),x.style[q.cssTransform]="translate("+(f?"0%,"+a+"%":a+"%,0%")+")"},calc:function(){var a,b,d=j[r],e=l[o],g=l[p],h=e/g,i=g-e;return h>=1||!g?{position:0,size:1,percent:0}:(!f&&k.rtl&&u&&(d=i-d*u),b=100*d/i,d<=1&&(b=0),d>=i-1&&(b=100),h=c.max(h,k.minTrackSize/100),h=c.min(h,k.maxTrackSize/100),a=b/100*(1-h),{position:a,size:h,percent:b})},fireEdgeEv:function(){var a=m.percent;m.was!==a&&a%100==0&&(e.fireCustomEvent("scrollreachedge"),e.fireCustomEvent("scrollreach"+s[a/100])),m.was=a},remove:function(){this.toggle(!1),w&&(w.parentNode.removeChild(w),w=null)}}},p={hideNativeScrollbars:function(a,b){var c=q.scrollbarSpec.width,d=a.style;if(0===c){var e=Date.now();return a.setAttribute("data-scroll",e),p.addCssRule('[data-scroll="'+e+'"]::-webkit-scrollbar',"display:none;width:0;height:0;")}return d[b?"left":"right"]=-c+"px",d.bottom=-c+"px",!0},addCssRule:function(a,c){var d=b.getElementById("scroll-sheet");d||(d=b.createElement("style"),d.id="scroll-sheet",d.appendChild(b.createTextNode("")),b.head.appendChild(d));try{return d.sheet.insertRule(a+" {"+c+"}",0),!0}catch(a){return}},createWrapper:function(a,c){for(var d,e=b.createElement("div");d=a.childNodes[0];)e.appendChild(d);return a.appendChild(e)},checkLoop:function(){if(!q.instances.length)return void(q.checkTimer=null);q.pauseCheck||j(q.instances,"update"),m.checkFrequency&&(q.checkTimer=setTimeout(function(){p.checkLoop()},m.checkFrequency))},easingFunction:function(a){return--a*a*a+1}},q=l.G={isTouch:"ontouchstart"in a,cssTransition:g("transition"),cssTransform:g("transform"),scrollbarSpec:e(),passiveEvent:f(),instances:[],checkTimer:null,pauseCheck:!1};"function"==typeof define&&define.amd&&define(function(){return l}),"undefined"!=typeof module&&module.exports&&(module.exports=l),a.Optiscroll=l}(window,document,Math); |
@@ -9,3 +9,3 @@ { | ||
], | ||
"version": "3.0.0", | ||
"version": "3.1.0", | ||
"homepage": "https://github.com/wilsonfletcher/optiscroll", | ||
@@ -12,0 +12,0 @@ "repository": { |
var Events = { | ||
scroll: function (ev) { | ||
if (!G.pauseCheck) { | ||
@@ -9,3 +9,3 @@ this.fireCustomEvent('scrollstart'); | ||
G.pauseCheck = true; | ||
this.scrollbars.v.update(); | ||
@@ -15,3 +15,3 @@ this.scrollbars.h.update(); | ||
this.fireCustomEvent('scroll'); | ||
clearTimeout(this.cache.timerStop); | ||
@@ -26,3 +26,3 @@ this.cache.timerStop = setTimeout(Events.scrollStop.bind(this), this.settings.scrollStopDelay); | ||
this.scrollbars.h.update(); | ||
Events.wheel.call(this, ev); | ||
@@ -47,3 +47,3 @@ }, | ||
var cache = this.cache, | ||
cacheV = cache.v, | ||
cacheV = cache.v, | ||
cacheH = cache.h, | ||
@@ -53,3 +53,3 @@ preventScroll = this.settings.preventParentScroll && G.isTouch; | ||
window.cancelAnimationFrame(this.scrollAnimation); | ||
if(preventScroll && cacheV.enabled && cacheV.percent % 100 === 0) { | ||
@@ -56,0 +56,0 @@ this.scrollEl.scrollTop = cacheV.percent ? (cache.scrollH - cache.clientH - 1) : 1; |
@@ -30,7 +30,7 @@ | ||
width = outerEl.offsetWidth - outerEl.clientWidth; | ||
if (outerEl.scrollLeft > 0) { | ||
if (outerEl.scrollLeft > 0) { | ||
rtl = 0; // webkit is default | ||
} else { | ||
outerEl.scrollLeft = 1; | ||
if (outerEl.scrollLeft === 0) { | ||
if (outerEl.scrollLeft === 0) { | ||
rtl = -1; // firefox is negative | ||
@@ -40,3 +40,3 @@ } | ||
htmlEl.removeChild(outerEl); | ||
return { width: width, rtl: rtl }; | ||
@@ -61,3 +61,3 @@ } | ||
props = [prop, 'Webkit' + ucProp]; | ||
for (var i in props) { | ||
@@ -74,3 +74,3 @@ if(el.style[props[i]] !== undefined) { return props[i]; } | ||
index = classes.indexOf(value); | ||
if(bool) { | ||
@@ -77,0 +77,0 @@ ~index || classes.push(value); |
;(function ( window, document, Math, undefined ) { | ||
'use strict'; | ||
'use strict'; |
@@ -14,3 +14,3 @@ /** | ||
(function ($) { | ||
var pluginName = 'optiscroll'; | ||
@@ -20,3 +20,3 @@ | ||
var method, args; | ||
if(typeof options === 'string') { | ||
@@ -36,3 +36,3 @@ args = Array.prototype.slice.call(arguments); | ||
} | ||
// allow exec method on instance | ||
// allow exec method on instance | ||
else if(inst && typeof method === 'string') { | ||
@@ -39,0 +39,0 @@ inst[method].apply(inst, args); |
@@ -13,3 +13,3 @@ | ||
var GS = Optiscroll.globalSettings = { | ||
@@ -38,3 +38,3 @@ scrollMinUpdateInterval: 1000 / 40, // 40 FPS | ||
// instance variables | ||
this.element = element; | ||
this.element = element; | ||
this.settings = _extend(_extend({}, Optiscroll.defaults), options || {}); | ||
@@ -45,3 +45,3 @@ if (typeof options.rtl !== 'boolean') { | ||
this.cache = {}; | ||
this.init(); | ||
@@ -59,5 +59,5 @@ }; | ||
shouldCreateScrollbars = false; | ||
var scrollEl = this.scrollEl = settings.wrapContent | ||
? Utils.createWrapper(element) | ||
var scrollEl = this.scrollEl = settings.wrapContent | ||
? Utils.createWrapper(element) | ||
: element.firstElementChild; | ||
@@ -69,3 +69,3 @@ | ||
// initialize scrollbars | ||
this.scrollbars = { | ||
this.scrollbars = { | ||
v: Scrollbar('v', this), | ||
@@ -78,3 +78,3 @@ h: Scrollbar('h', this), | ||
shouldCreateScrollbars = Utils.hideNativeScrollbars(scrollEl, settings.rtl); | ||
} | ||
} | ||
@@ -107,4 +107,4 @@ if(shouldCreateScrollbars) { | ||
bind: function () { | ||
@@ -142,6 +142,6 @@ var listeners = this.listeners = {}, | ||
cW = scrollEl.clientWidth; | ||
if(sH !== cache.scrollH || cH !== cache.clientH || | ||
if(sH !== cache.scrollH || cH !== cache.clientH || | ||
sW !== cache.scrollW || cW !== cache.clientW) { | ||
cache.scrollH = sH; | ||
@@ -186,3 +186,3 @@ cache.clientH = cH; | ||
startY = this.scrollEl.scrollTop; | ||
endX = +destX; | ||
@@ -200,3 +200,3 @@ if(destX === 'left') { endX = 0; } | ||
this.animateScroll(startX, endX, startY, endY, +duration); | ||
}, | ||
@@ -240,3 +240,3 @@ | ||
bottomEdge = offsetY + eDim.height - this.cache.clientH + (delta.bottom || 0); | ||
if(leftEdge < startX) { endX = leftEdge; } | ||
@@ -274,7 +274,7 @@ if(rightEdge > startX) { endX = rightEdge; } | ||
} | ||
(function animate () { | ||
var time = Math.min(1, ((Date.now() - startTime) / duration)), | ||
easedTime = Utils.easingFunction(time); | ||
if(endY !== startY) { | ||
@@ -288,3 +288,3 @@ scrollEl.scrollTop = ~~(easedTime * (endY - startY)) + startY; | ||
self.scrollAnimation = time < 1 ? window.requestAnimationFrame(animate) : null; | ||
}(this)); | ||
}()); | ||
}, | ||
@@ -342,3 +342,3 @@ | ||
eventData; | ||
eventData = { | ||
@@ -363,3 +363,3 @@ // scrollbars data | ||
var event; | ||
if (CustomEvent === 'function') { | ||
if (typeof CustomEvent === 'function') { | ||
event = new CustomEvent(eventName, { detail: eventData }); | ||
@@ -366,0 +366,0 @@ } else { // IE does not support CustomEvent |
@@ -7,3 +7,3 @@ // AMD export | ||
} | ||
// commonjs export | ||
@@ -13,5 +13,5 @@ if(typeof module !== 'undefined' && module.exports) { | ||
} | ||
window.Optiscroll = Optiscroll; | ||
})(window, document, Math); | ||
})(window, document, Math); |
@@ -14,3 +14,4 @@ var Scrollbar = function (which, instance) { | ||
scrollProp = isVertical ? 'scrollTop' : 'scrollLeft', | ||
evNames = isVertical ? ['top','bottom'] : ['left','right'], | ||
evSuffixes = isVertical ? ['top','bottom'] : ['left','right'], | ||
evTypesMatcher = /^(mouse|touch|pointer)/, | ||
@@ -26,5 +27,6 @@ rtlMode = G.scrollbarSpec.rtl, | ||
dragStart: function (ev) { | ||
ev.preventDefault(); | ||
var evData = ev.touches ? ev.touches[0] : ev; | ||
events.dragData = { x: evData.pageX, y: evData.pageY, scroll: scrollEl[scrollProp] }; | ||
events.bind(true); | ||
events.bind(true, ev.type.match(evTypesMatcher)[1]); | ||
}, | ||
@@ -36,25 +38,27 @@ | ||
delta, deltaRatio; | ||
ev.preventDefault(); | ||
delta = isVertical ? evData.pageY - events.dragData.y : evData.pageX - events.dragData.x; | ||
deltaRatio = delta / cache[clientSize]; | ||
scrollEl[scrollProp] = events.dragData.scroll + deltaRatio * cache[scrollSize] * dragMode; | ||
}, | ||
dragEnd: function () { | ||
dragEnd: function (ev) { | ||
events.dragData = null; | ||
events.bind(false); | ||
events.bind(false, ev.type.match(evTypesMatcher)[1]); | ||
}, | ||
bind: function (on) { | ||
bind: function (on, type) { | ||
var method = (on ? 'add' : 'remove') + 'EventListener', | ||
type = G.isTouch ? ['touchmove', 'touchend'] : ['mousemove', 'mouseup']; | ||
moveEv = type + 'move', | ||
upEv = type + (type === 'touch' ? 'end' : 'up'); | ||
document[method](type[0], events.dragMove); | ||
document[method](type[1], events.dragEnd); | ||
document[method](moveEv, events.dragMove); | ||
document[method](upEv, events.dragEnd); | ||
document[method](type + 'cancel', events.dragEnd); | ||
}, | ||
}; | ||
return { | ||
@@ -76,3 +80,2 @@ | ||
create: function () { | ||
var evType = G.isTouch ? 'touchstart' : 'mousedown'; | ||
scrollbarEl = document.createElement('div'); | ||
@@ -87,3 +90,6 @@ trackEl = document.createElement('b'); | ||
if(settings.draggableTracks) { | ||
trackEl.addEventListener(evType, events.dragStart); | ||
var evTypes = window.PointerEvent ? ['pointerdown'] : ['touchstart', 'mousedown']; | ||
evTypes.forEach(function (evType) { | ||
trackEl.addEventListener(evType, events.dragStart); | ||
}); | ||
} | ||
@@ -126,3 +132,3 @@ }, | ||
} | ||
}, | ||
@@ -138,4 +144,4 @@ | ||
} | ||
trackEl.style[G.cssTransform] = 'translate(' + | ||
(isVertical ? '0%,' + newRelPos + '%' : newRelPos + '%' + ',0%') | ||
trackEl.style[G.cssTransform] = 'translate(' + | ||
(isVertical ? '0%,' + newRelPos + '%' : newRelPos + '%' + ',0%') | ||
+ ')'; | ||
@@ -147,8 +153,8 @@ }, | ||
var position = scrollEl[scrollProp], | ||
viewS = cache[clientSize], | ||
scrollS = cache[scrollSize], | ||
viewS = cache[clientSize], | ||
scrollS = cache[scrollSize], | ||
sizeRatio = viewS / scrollS, | ||
sizeDiff = scrollS - viewS, | ||
positionRatio, percent; | ||
if(sizeRatio >= 1 || !scrollS) { // no scrollbars needed | ||
@@ -163,8 +169,8 @@ return { position: 0, size: 1, percent: 0 }; | ||
// prevent overscroll effetcs (negative percent) | ||
// prevent overscroll effetcs (negative percent) | ||
// and keep 1px tolerance near the edges | ||
if(position <= 1) { percent = 0; } | ||
if(position >= sizeDiff - 1) { percent = 100; } | ||
// Capped size based on min/max track percentage | ||
// Capped size based on min/max track percentage | ||
sizeRatio = Math.max(sizeRatio, settings.minTrackSize / 100); | ||
@@ -184,3 +190,3 @@ sizeRatio = Math.min(sizeRatio, settings.maxTrackSize / 100); | ||
instance.fireCustomEvent('scrollreachedge'); | ||
instance.fireCustomEvent('scrollreach' + evNames[percent / 100]); | ||
instance.fireCustomEvent('scrollreach' + evSuffixes[percent / 100]); | ||
} | ||
@@ -187,0 +193,0 @@ |
@@ -26,3 +26,3 @@ var Utils = { | ||
document.head.appendChild(styleSheet); | ||
} | ||
} | ||
try { | ||
@@ -48,3 +48,3 @@ styleSheet.sheet.insertRule(selector + ' {' + rules + '}', 0); | ||
checkLoop: function () { | ||
if(!G.instances.length) { | ||
@@ -58,3 +58,3 @@ G.checkTimer = null; | ||
} | ||
if(GS.checkFrequency) { | ||
@@ -69,4 +69,4 @@ G.checkTimer = setTimeout(function () { | ||
// easeOutCubic function | ||
easingFunction: function (t) { | ||
return (--t) * t * t + 1; | ||
easingFunction: function (t) { | ||
return (--t) * t * t + 1; | ||
}, | ||
@@ -73,0 +73,0 @@ |
@@ -30,3 +30,3 @@ /* eslint-env qunit */ | ||
os.destroy(); | ||
setTimeout(function () { | ||
@@ -33,0 +33,0 @@ // check DOM elements style |
@@ -18,3 +18,3 @@ /* eslint-env qunit */ | ||
os.scrollEl.scrollTop = 0; | ||
os.element.addEventListener('scrollstart', function (ev) { | ||
@@ -32,3 +32,3 @@ equal(ev.type, 'scrollstart'); | ||
}, 50); | ||
}); | ||
@@ -69,3 +69,3 @@ | ||
}, 50); | ||
}); | ||
@@ -91,3 +91,3 @@ | ||
}, 50); | ||
}); | ||
@@ -113,3 +113,3 @@ | ||
}, 50); | ||
}); | ||
@@ -135,3 +135,3 @@ | ||
}, 50); | ||
}); | ||
@@ -138,0 +138,0 @@ |
@@ -36,3 +36,3 @@ /* eslint-env qunit */ | ||
ok(os.element.querySelector('.optiscroll-h'), 'Horizontal scrollbar element created'); | ||
// Classes | ||
@@ -70,3 +70,3 @@ notEqual(os.element.className.indexOf('has-vtrack'), -1); | ||
}, 100); | ||
}); | ||
@@ -78,12 +78,6 @@ | ||
var vTrack = os.element.querySelector('.optiscroll-vtrack'); | ||
os.scrollEl.scrollTop = 0; | ||
// usign both jquery.simulate and Syn.js to make drag work across all browsers | ||
$(vTrack).simulate('mousedown', { | ||
clientX: $(vTrack).offset().left + $(vTrack).outerWidth() / 2, | ||
clientY: $(vTrack).offset().top + $(vTrack).outerHeight() / 2, | ||
}); | ||
Syn.drag('+0 +25', vTrack, function () { | ||
window.syn.drag('+0 +25', vTrack, function () { | ||
setTimeout(function () { | ||
@@ -97,3 +91,3 @@ equal(os.scrollEl.scrollTop, 50); | ||
}); | ||
}); | ||
@@ -107,9 +101,3 @@ | ||
// usign both jquery.simulate and Syn.js to make drag work across all browsers | ||
$(hTrack).simulate('mousedown', { | ||
clientX: $(hTrack).offset().left + $(hTrack).outerWidth() / 2, | ||
clientY: $(hTrack).offset().top + $(hTrack).outerHeight() / 2, | ||
}); | ||
Syn.drag('+25 +0', hTrack, function () { | ||
window.syn.drag('+25 +0', hTrack, function () { | ||
setTimeout(function () { | ||
@@ -128,3 +116,3 @@ equal(os.scrollEl.scrollLeft, 50); | ||
expect(4); | ||
os.scrollEl.scrollTop = 100; | ||
@@ -134,3 +122,3 @@ os.scrollEl.scrollLeft = 10; | ||
os.element.style.height = '150px'; | ||
setTimeout(function () { | ||
@@ -147,3 +135,3 @@ os.update(); | ||
}, 100); | ||
}); | ||
@@ -154,3 +142,3 @@ | ||
expect(2); | ||
var content = document.querySelector('.test'); | ||
@@ -163,3 +151,3 @@ content.style.width = '400px'; | ||
}); | ||
setTimeout(function () { | ||
@@ -170,3 +158,3 @@ equal(os.cache.v.size, 0.25); | ||
}, 100); | ||
}); | ||
@@ -177,3 +165,3 @@ | ||
expect(4); | ||
os.element.style.height = '300px'; | ||
@@ -194,3 +182,3 @@ os.update(); | ||
expect(4); | ||
os.element.style.width = '300px'; | ||
@@ -206,4 +194,4 @@ os.update(); | ||
}, 50); | ||
}); | ||
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
371539
7607
3