-
Notifications
You must be signed in to change notification settings - Fork 82
/
jquery.overscroll.min.js
32 lines (27 loc) · 7.4 KB
/
jquery.overscroll.min.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/*
Overscroll v1.5.0
A jQuery Plugin that emulates the iPhone scrolling experience in a browser.
http://azoffdesign.com/overscroll
Intended for use with the latest jQuery
http://code.jquery.com/jquery-latest.js
Copyright 2011, Jonathan Azoff
Dual licensed under the MIT or GPL Version 2 licenses.
http://jquery.org/license
For API documentation, see the README file
http://azof.fr/pYCzuM
Date: Saturday, November 5th 2011
*/
(function(i,o,f,c){c=f.fn.overscroll=function(a){a=a||{};return this.each(function(){c.init(f(this),a)})};f.fn.removeOverscroll=function(){return this.each(function(){var a=f(this).data(c.removerKey);f.isFunction(a)&&a()})};f.extend(c,{events:{wheel:"mousewheel DOMMouseScroll",start:"select mousedown touchstart",drag:"mousemove touchmove",end:"mouseup mouseleave touchend",ignored:"dragstart drag"},div:"<div/>",removerKey:"overscroll-remover",constants:{driftFrequency:40,driftSequences:22,driftDecay:1.15,
driftTimeout:100,timeout:400,captureThreshold:3,wheelDelta:20,scrollDelta:15,thumbThickness:6,thumbOpacity:0.7},init:function(a,b){var d={sizing:c.getSizing(a),flags:{},cleaned:{}};d.options=b=f.extend({showThumbs:true,persistThumbs:false,wheelDirection:"vertical",cursor:i.opera?"move":"all-scroll",wheelDelta:c.constants.wheelDelta,scrollDelta:c.constants.scrollDelta,direction:"multi",cancelOn:""},b);if(b.direction!=="multi"&&b.direction!==b.wheelDirection)b.wheelDirection=b.direction;b.scrollDelta=
o.abs(b.scrollDelta);b.wheelDelta=o.abs(b.wheelDelta);a.removeOverscroll();a.data(c.removerKey,c.remover(a,d));d.target=a.css({position:"relative",overflow:"hidden",cursor:b.cursor}).on(c.events.wheel,d,c.wheel).on(c.events.start,d,c.start).on(c.events.end,d,c.stop).on(c.events.ignored,false);if(b.showThumbs){d.thumbs={};if(d.sizing.container.scrollWidth>0&&b.direction!=="vertical"){d.thumbs.horizontal=f(c.div).css(c.getThumbCss(d.sizing.thumbs.horizontal)).css({opacity:b.persistThumbs?c.constants.thumbOpacity:
0});a.prepend(d.thumbs.horizontal)}if(d.sizing.container.scrollHeight>0&&b.direction!=="horizontal"){d.thumbs.vertical=f(c.div).css(c.getThumbCss(d.sizing.thumbs.vertical)).css({opacity:b.persistThumbs?c.constants.thumbOpacity:0});a.prepend(d.thumbs.vertical)}}b.scrollLeft&&a.scrollLeft(b.scrollLeft);b.scrollTop&&a.scrollTop(b.scrollTop);c.moveThumbs(d,a.scrollLeft(),a.scrollTop())},remover:function(a,b){return function(){a.removeAttr("style").removeData(c.removerKey).off(c.events.wheel,c.wheel).off(c.events.start,
c.start).off(c.events.end,c.stop).off(c.events.ignored,false);if(b.thumbs){b.thumbs.horizontal&&b.thumbs.horizontal.remove();b.thumbs.vertical&&b.thumbs.vertical.remove()}}},triggerEvent:function(a,b){b.target.trigger("overscroll:"+a)},toggleThumbs:function(a,b){if(a.thumbs&&!a.options.persistThumbs)if(b){a.thumbs.vertical&&a.thumbs.vertical.stop(true,true).fadeTo("fast",c.constants.thumbOpacity);a.thumbs.horizontal&&a.thumbs.horizontal.stop(true,true).fadeTo("fast",c.constants.thumbOpacity)}else{a.thumbs.vertical&&
a.thumbs.vertical.fadeTo("fast",0);a.thumbs.horizontal&&a.thumbs.horizontal.fadeTo("fast",0)}},setPosition:function(a,b,d){b.x=a.pageX;b.y=a.pageY;b.time=c.time();b.index=d;return b},wheel:function(a,b){var d=a.data,e=a.originalEvent;a.preventDefault();c.clearInterval(d.target);if(e.wheelDelta)b=e.wheelDelta/(i.opera?-120:120);if(e.detail)b=-e.detail/3;if(!d.wheelCapture){d.wheelCapture={timeout:null};c.toggleThumbs(d,true);d.target.stop(true,d.flags.dragging=true)}b*=d.options.wheelDelta;if(d.options.wheelDirection===
"horizontal")this.scrollLeft-=b;else this.scrollTop-=b;c.moveThumbs(d,this.scrollLeft,this.scrollTop);d.wheelCapture.timeout&&i.clearTimeout(d.wheelCapture.timeout);d.wheelCapture.timeout=i.setTimeout(function(){c.toggleThumbs(d,d.wheelCapture=d.flags.dragging=null)},c.constants.timeout)},moveThumbs:function(a,b,d){var e,g,h;if(a.options.showThumbs){e=a.thumbs;a=a.sizing;if(e.horizontal){g=b*(1+a.container.width/a.container.scrollWidth);h=d+a.thumbs.horizontal.top;e.horizontal.css("margin",h+"px 0 0 "+
g+"px")}if(e.vertical){g=b+a.thumbs.vertical.left;h=d*(1+a.container.height/a.container.scrollHeight);e.vertical.css("margin",h+"px 0 0 "+g+"px")}}},start:function(a){var b=a.data,d=b.target,e=b.flags;c.clearInterval(b.target);b.startTarget=f(a.target);if(!b.startTarget.is(b.options.cancelOn)){c.normalizeEvent(a);e.dragging=e.dragged=false;d.bind(c.events.drag,b,c.drag).stop(true,true);b.position=c.setPosition(a,{});b.capture=c.setPosition(a,{},2);c.triggerEvent("dragstart",b)}},drag:function(a){var b=
a.data,d=b.flags;c.normalizeEvent(a);d.dragged||c.toggleThumbs(b,true);d.dragged=true;if(b.options.direction!=="vertical")this.scrollLeft-=a.pageX-b.position.x;if(b.options.direction!=="horizontal")this.scrollTop-=a.pageY-b.position.y;c.moveThumbs(b,this.scrollLeft,this.scrollTop);c.setPosition(a,b.position);if(--b.capture.index<=0){d.dragging=true;c.setPosition(a,b.capture,c.constants.captureThreshold)}},normalizeEvent:function(a){var b;b=a.originalEvent;if(b.changedTouches){b=b.changedTouches;a.pageX=
b.pageX;a.pageY=b.pageY}},time:function(){return(new Date).getTime()},deferClick:function(a){var b=a.data("events");if(b&&b.click&&b.click.length){b=b.click.slice();a.unbind("click").one("click",function(d){d.preventDefault();f.each(b,function(e,g){a.click(g)})})}},stop:function(a){var b=a.data,d=b.target,e=b.flags;if(b.position){d.unbind(c.events.drag,c.drag);c.triggerEvent("dragend",b);e.dragging?c.drift(this,a,function(){c.toggleThumbs(b,e.dragging=false)}):c.toggleThumbs(b,false);if(e.dragged&&
f(a.target).is(b.startTarget)){c.deferClick(b.startTarget);b.startTarget=e.dragged=null}b.capture=b.position=undefined}},clearInterval:function(a){a=f(a);var b=a.data("overscroll-interval");b&&i.clearInterval(b);a.data("overscroll-interval",null)},setInterval:function(a,b){c.clearInterval(a);f(a).data("overscroll-interval",b)},drift:function(a,b,d){var e=b.data,g,h,j,k,l=a.scrollLeft,m=a.scrollTop,p=c.constants.driftDecay;if(c.time()-e.capture.time>c.constants.driftTimeout)return d.call(null,e);c.normalizeEvent(b);
g=e.options.scrollDelta*(b.pageX-e.capture.x);h=e.options.scrollDelta*(b.pageY-e.capture.y);j=g/c.constants.driftSequences;k=h/c.constants.driftSequences;if(e.options.direction!=="vertical")l-=g;if(e.options.direction!=="horizontal")m-=h;c.triggerEvent("driftstart",b.data);c.setInterval(a,i.setInterval(function(){var n=true;if(k>1&&a.scrollTop>m||k<-1&&a.scrollTop<m){n=false;a.scrollTop-=k;k/=p}if(j>1&&a.scrollLeft>l||j<-1&&a.scrollLeft<l){n=false;a.scrollLeft-=j;j/=p}c.moveThumbs(e,a.scrollLeft,
a.scrollTop);if(n){c.clearInterval(a);c.triggerEvent("driftend",e);d.call(null,e)}},c.constants.driftFrequency))},getSizing:function(a){var b={},d=a.get(0);a=b.container={width:a.width(),height:a.height()};a.scrollWidth=a.width>=d.scrollWidth?a.width:d.scrollWidth;a.scrollHeight=a.height>=d.scrollHeight?a.height:d.scrollHeight;b.thumbs={horizontal:{width:a.width*a.width/a.scrollWidth,height:c.constants.thumbThickness,corner:c.constants.thumbThickness/2,left:0,top:a.height-c.constants.thumbThickness},
vertical:{width:c.constants.thumbThickness,height:a.height*a.height/a.scrollHeight,corner:c.constants.thumbThickness/2,left:a.width-c.constants.thumbThickness,top:0}};return b},getThumbCss:function(a){return{position:"absolute","background-color":"black",width:a.width+"px",height:a.height+"px",margin:a.top+"px 0 0 "+a.left+"px","-moz-border-radius":a.corner+"px","-webkit-border-radius":a.corner+"px","border-radius":a.corner+"px","z-index":"999"}}})})(window,Math,jQuery);