iscroll.min.1.0.js 10.8 KB
!function(){var e=Math,t=function(e){return e>>0},o=/webkit/i.test(navigator.appVersion)?"webkit":/firefox/i.test(navigator.userAgent)?"Moz":"opera"in window?"O":"",i=/android/gi.test(navigator.appVersion),n=/iphone|ipad/gi.test(navigator.appVersion),r=/playbook/gi.test(navigator.appVersion),s=/hp-tablet/gi.test(navigator.appVersion),l="WebKitCSSMatrix"in window&&"m11"in new WebKitCSSMatrix,a="ontouchstart"in window&&!s,c=o+"Transform"in document.documentElement.style,p=n||r,u=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(e){return setTimeout(e,17)}}(),f=function(){return window.cancelRequestAnimationFrame||window.webkitCancelAnimationFrame||window.webkitCancelRequestAnimationFrame||window.mozCancelRequestAnimationFrame||window.oCancelRequestAnimationFrame||window.msCancelRequestAnimationFrame||clearTimeout}(),m="onorientationchange"in window?"orientationchange":"resize",h=a?"touchstart":"mousedown",d=a?"touchmove":"mousemove",w=a?"touchend":"mouseup",b=a?"touchcancel":"mouseup",S="translate"+(l?"3d(":"("),v=l?",0)":")",x=function(e,t){var i=this,n=document,r;this._events={};i.wrapper=typeof e=="object"?e:n.getElementById(e);i.wrapper.style.overflow="hidden";i.scroller=i.wrapper.children[0];i.options={hScroll:true,vScroll:true,x:0,y:0,bounce:true,bounceLock:false,momentum:true,lockDirection:true,useTransform:true,useTransition:false,mouseWheel:true,onRefresh:null,onBeforeScrollStart:function(e){var t=e.target;while(t.nodeType!=1)t=t.parentNode;if(t.tagName!="SELECT"&&t.tagName!="INPUT"&&t.tagName!="TEXTAREA")e.preventDefault()},onScrollStart:null,onBeforeScrollMove:null,onScrollMove:null,onBeforeScrollEnd:null,onScrollEnd:null,onTouchEnd:null,onDestroy:null};for(r in t)i.options[r]=t[r];i.x=i.options.x;i.y=i.options.y;i.options.useTransform=c?i.options.useTransform:false;i.options.hScrollbar=i.options.hScroll&&i.options.hScrollbar;i.options.vScrollbar=i.options.vScroll&&i.options.vScrollbar;i.options.useTransition=p&&i.options.useTransition;i.options.invertWheelDirection=i.options.invertWheelDirection?-1:1;i.scroller.style[o+"TransitionProperty"]=i.options.useTransform?"-"+o.toLowerCase()+"-transform":"top left";i.scroller.style[o+"TransitionDuration"]="0";i.scroller.style[o+"TransformOrigin"]="0 0";if(i.options.useTransition)i.scroller.style[o+"TransitionTimingFunction"]="cubic-bezier(0.33,0.66,0.66,1)";if(i.options.useTransform)i.scroller.style[o+"Transform"]=S+i.x+"px,"+i.y+"px"+v;else i.scroller.style.cssText+=";position:absolute;top:"+i.y+"px;left:"+i.x+"px";if(i.options.mouseWheel)i._initWheel();i.refresh();i._bind(m,window);i._bind(h);if(!a)i._bind("mouseout",i.wrapper)};x.prototype={enabled:true,x:0,y:0,steps:[],scale:1,handleEvent:function(e){var t=this;switch(e.type){case h:if(!a&&e.button!==0)return;t._start(e);break;case d:t._move(e);break;case w:case b:t._end(e);break;case m:t._resize();break;case"mouseout":t._mouseout(e);break;case"webkitTransitionEnd":t._transitionEnd(e);break;case"mousewheel":t._wheel(e);break}},_resize:function(){this.refresh()},_pos:function(e,i){e=this.hScroll?e:0;i=this.vScroll?i:0;if(this.options.useTransform){this.scroller.style[o+"Transform"]=S+e+"px,"+i+"px"+v+" scale("+this.scale+")"}else{e=t(e);i=t(i);this.scroller.style.left=e+"px";this.scroller.style.top=i+"px"}this.x=e;this.y=i},_start:function(e){var t=this,i=a?e.touches[0]:e,n,r,s;if(!t.enabled)return;if(t.options.onBeforeScrollStart)t.options.onBeforeScrollStart.call(t,e);if(t.options.useTransition)t._transitionTime(0);t.moved=false;t.animating=false;t.zoomed=false;t.distX=0;t.distY=0;t.absDistX=0;t.absDistY=0;t.dirX=0;t.dirY=0;if(t.options.momentum){if(t.options.useTransform){n=getComputedStyle(t.scroller,null)[o+"Transform"].replace(/[^0-9-.,]/g,"").split(",");r=n[4]*1;s=n[5]*1}else{r=getComputedStyle(t.scroller,null).left.replace(/[^0-9-]/g,"")*1;s=getComputedStyle(t.scroller,null).top.replace(/[^0-9-]/g,"")*1}if(r!=t.x||s!=t.y){if(t.options.useTransition)t._unbind("webkitTransitionEnd");else f(t.aniTime);t.steps=[];t._pos(r,s)}}t.startX=t.x;t.startY=t.y;t.pointX=i.pageX;t.pointY=i.pageY;t.startTime=e.timeStamp||Date.now();if(t.options.onScrollStart)t.options.onScrollStart.call(t,e);t._bind(d);t._bind(w);t._bind(b)},_move:function(t){var o=this,i=a?t.touches[0]:t,n=i.pageX-o.pointX,r=i.pageY-o.pointY,s=o.x+n,l=o.y+r,c=t.timeStamp||Date.now();if(o.options.onBeforeScrollMove)o.options.onBeforeScrollMove.call(o,t);o.pointX=i.pageX;o.pointY=i.pageY;if(s>0||s<o.maxScrollX){s=o.options.bounce?o.x+n/2:s>=0||o.maxScrollX>=0?0:o.maxScrollX}if(l>0||l<o.maxScrollY){l=o.options.bounce?o.y+r/2:l>=0||o.maxScrollY>=0?0:o.maxScrollY}o.distX+=n;o.distY+=r;o.absDistX=e.abs(o.distX);o.absDistY=e.abs(o.distY);if(o.absDistX<6&&o.absDistY<6){return}if(o.options.lockDirection){if(o.absDistX>o.absDistY+5){l=o.y;r=0}else if(o.absDistY>o.absDistX+5){s=o.x;n=0}}o.moved=true;o._pos(s,l);o.dirX=n>0?-1:n<0?1:0;o.dirY=r>0?-1:r<0?1:0;if(c-o.startTime>300){o.startTime=c;o.startX=o.x;o.startY=o.y}if(o.options.onScrollMove)o.options.onScrollMove.call(o,t)},_end:function(o){if(a&&o.touches.length!=0)return;var i=this,n=a?o.changedTouches[0]:o,r,s,l={dist:0,time:0},c={dist:0,time:0},p=(o.timeStamp||Date.now())-i.startTime,u=i.x,f=i.y,m;i._unbind(d);i._unbind(w);i._unbind(b);if(i.options.onBeforeScrollEnd)i.options.onBeforeScrollEnd.call(i,o);if(!i.moved){if(a){r=n.target;while(r.nodeType!=1)r=r.parentNode;if(r.tagName!="SELECT"&&r.tagName!="INPUT"&&r.tagName!="TEXTAREA"){s=document.createEvent("MouseEvents");s.initMouseEvent("click",true,true,o.view,1,n.screenX,n.screenY,n.clientX,n.clientY,o.ctrlKey,o.altKey,o.shiftKey,o.metaKey,0,null);s._fake=true;r.dispatchEvent(s)}}i._resetPos(200);if(i.options.onTouchEnd)i.options.onTouchEnd.call(i,o);return}if(p<300&&i.options.momentum){l=u?i._momentum(u-i.startX,p,-i.x,i.scrollerW-i.wrapperW+i.x,i.options.bounce?i.wrapperW:0):l;c=f?i._momentum(f-i.startY,p,-i.y,i.maxScrollY<0?i.scrollerH-i.wrapperH+i.y:0,i.options.bounce?i.wrapperH:0):c;u=i.x+l.dist;f=i.y+c.dist;if(i.x>0&&u>0||i.x<i.maxScrollX&&u<i.maxScrollX)l={dist:0,time:0};if(i.y>0&&f>0||i.y<i.maxScrollY&&f<i.maxScrollY)c={dist:0,time:0}}if(l.dist||c.dist){m=e.max(e.max(l.time,c.time),10);i.scrollTo(t(u),t(f),m);if(i.options.onTouchEnd)i.options.onTouchEnd.call(i,o);return}i._resetPos(200);if(i.options.onTouchEnd)i.options.onTouchEnd.call(i,o)},_initWheel:function(){this.wrapper.addEventListener("mousewheel",this);this.wrapper.addEventListener("DOMMouseScroll",this);this.on("destroy",function(){this.wrapper.removeEventListener("mousewheel",this);this.wrapper.removeEventListener("DOMMouseScroll",this)})},_wheel:function(e){var t,o,i,n,r=this;clearTimeout(this.wheelTimeout);this.wheelTimeout=setTimeout(function(){r._execEvent("scrollEnd")},400);e.preventDefault();if("wheelDeltaX"in e){t=e.wheelDeltaX/Math.abs(e.wheelDeltaX)||0;o=e.wheelDeltaY/Math.abs(e.wheelDeltaY)||0}else if("wheelDelta"in e){t=o=e.wheelDelta/Math.abs(e.wheelDelta)}else if("detail"in e){t=o=-(e.detail/Math.abs(e.detail))}else{return}t*=12;o*=12;if(!this.hasVerticalScroll){t=o}i=this.x+t*this.options.invertWheelDirection;n=this.y+o*this.options.invertWheelDirection;if(i>0){i=0}else if(i<this.maxScrollX){i=this.maxScrollX}if(n>0){n=0}else if(n<this.maxScrollY){n=this.maxScrollY}r.scrollTo(i,n,0)},on:function(e,t){if(!this._events[e]){this._events[e]=[]}this._events[e].push(t)},_execEvent:function(e){if(!this._events[e]){return}var t=0,o=this._events[e].length;if(!o){return}for(;t<o;t++){this._events[e][t].call(this)}},_resetPos:function(e){var t=this,o=t.x>=0?0:t.x<t.maxScrollX?t.maxScrollX:t.x,i=t.y>=0||t.maxScrollY>0?0:t.y<t.maxScrollY?t.maxScrollY:t.y;if(o==t.x&&i==t.y){if(t.moved){if(t.options.onScrollEnd)t.options.onScrollEnd.call(t);t.moved=false}return}t.scrollTo(o,i,e||0)},_mouseout:function(e){var t=e.relatedTarget;if(!t){this._end(e);return}while(t=t.parentNode)if(t==this.wrapper)return;this._end(e)},_transitionEnd:function(e){var t=this;if(e.target!=t.scroller)return;t._unbind("webkitTransitionEnd");t._startAni()},_startAni:function(){var t=this,o=t.x,i=t.y,n=Date.now(),r,s,l;if(t.animating)return;if(!t.steps.length){t._resetPos(400);return}r=t.steps.shift();if(r.x==o&&r.y==i)r.time=0;t.animating=true;t.moved=true;if(t.options.useTransition){t._transitionTime(r.time);t._pos(r.x,r.y);t.animating=false;if(r.time)t._bind("webkitTransitionEnd");else t._resetPos(0);return}l=function(){var a=Date.now(),c,p;if(a>=n+r.time){t._pos(r.x,r.y);t.animating=false;if(t.options.onAnimationEnd)t.options.onAnimationEnd.call(t);t._startAni();return}a=(a-n)/r.time-1;s=e.sqrt(1-a*a);c=(r.x-o)*s+o;p=(r.y-i)*s+i;t._pos(c,p);if(t.animating)t.aniTime=u(l)};l()},_transitionTime:function(e){this.scroller.style[o+"TransitionDuration"]=e+"ms"},_momentum:function(o,i,n,r,s){var l=6e-4,a=e.abs(o)/i,c=a*a/(2*l),p=0,u=0;if(o>0&&c>n){u=s/(6/(c/a*l));n=n+u;a=a*n/c;c=n}else if(o<0&&c>r){u=s/(6/(c/a*l));r=r+u;a=a*r/c;c=r}c=c*(o<0?-1:1);p=a/l;return{dist:c,time:t(p)}},_offset:function(e){var t=-e.offsetLeft,o=-e.offsetTop;while(e=e.offsetParent){t-=e.offsetLeft;o-=e.offsetTop}return{left:t,top:o}},_bind:function(e,t,o){(t||this.scroller).addEventListener(e,this,!!o)},_unbind:function(e,t,o){(t||this.scroller).removeEventListener(e,this,!!o)},destroy:function(){var e=this;e.scroller.style[o+"Transform"]="";e._unbind(m,window);e._unbind(h);e._unbind(d);e._unbind(w);e._unbind(b);e._unbind("mouseout",e.wrapper);if(e.options.useTransition)e._unbind("webkitTransitionEnd");if(e.options.onDestroy)e.options.onDestroy.call(e)},refresh:function(){var e=this,t;e.wrapperW=e.wrapper.clientWidth;e.wrapperH=e.wrapper.clientHeight;e.scrollerW=e.scroller.offsetWidth;e.scrollerH=e.scroller.offsetHeight;e.maxScrollX=e.wrapperW-e.scrollerW;e.maxScrollY=e.wrapperH-e.scrollerH;e.dirX=0;e.dirY=0;e.hScroll=e.options.hScroll&&e.maxScrollX<0;e.vScroll=e.options.vScroll&&(!e.options.bounceLock&&!e.hScroll||e.scrollerH>e.wrapperH);t=e._offset(e.wrapper);e.wrapperOffsetLeft=-t.left;e.wrapperOffsetTop=-t.top;e.scroller.style[o+"TransitionDuration"]="0";e._resetPos(200)},scrollTo:function(e,t,o,i){var n=this,r=e,s,l;n.stop();if(!r.length)r=[{x:e,y:t,time:o,relative:i}];for(s=0,l=r.length;s<l;s++){if(r[s].relative){r[s].x=n.x-r[s].x;r[s].y=n.y-r[s].y}n.steps.push({x:r[s].x,y:r[s].y,time:r[s].time||0})}n._startAni()},scrollToElement:function(t,o){var i=this,n;t=t.nodeType?t:i.scroller.querySelector(t);if(!t)return;n=i._offset(t);n.left+=i.wrapperOffsetLeft;n.top+=i.wrapperOffsetTop;n.left=n.left>0?0:n.left<i.maxScrollX?i.maxScrollX:n.left;n.top=n.top>0?0:n.top<i.maxScrollY?i.maxScrollY:n.top;o=o===undefined?e.max(e.abs(n.left)*2,e.abs(n.top)*2):o;i.scrollTo(n.left,n.top,o)},disable:function(){this.stop();this._resetPos(0);this.enabled=false;this._unbind(d);this._unbind(w);this._unbind(b)},enable:function(){this.enabled=true},stop:function(){f(this.aniTime);this.steps=[];this.moved=false;this.animating=false}};if(typeof exports!=="undefined")exports.iScroll=x;else window.iScroll=x}();