jroll.2.6.5.min.js 16 KB

12
  1. /*! JRoll v2.6.5 ~ (c) 2015-2018 Author:BarZu Git:https://github.com/chjtx/JRoll Website:http://www.chjtx.com/JRoll/ */
  2. ;!function(o,r,e){"use strict";function l(o){var r=h.findAllJRolls(o.target),e=r.length;if(!(c.jrollActive&&!c.jrollActive.options.zoom&&o.touches&&o.touches.length>1))if(e){for(;e--;)r[e].moving&&(o.preventDefault(),r[e]._endAction());c.jrollActive=r[0],c.jrollActive._start(o)}else c.jrollActive&&c.jrollActive._end(o)}function t(o){if(c.jrollActive){var e=r.activeElement;c.jrollActive.options.preventDefault&&o.preventDefault(),h.isMobile&&c.jrollActive.options.autoBlur&&("INPUT"===e.tagName||"TEXTAREA"===e.tagName)&&e.blur(),c.jrollActive._move(o)}}function s(o){c.jrollActive&&c.jrollActive._end(o)}function n(){setTimeout(function(){for(var o in m)m[o].refresh().scrollTo(m[o].x,m[o].y,200)},600)}function i(o){var r=h.findScroller(o.target);r&&r._wheel(o)}function a(o,e){r.addEventListener(o,e,!!v&&{passive:!1})}var c,p="2.6.5",u=o.requestAnimationFrame||o.webkitRequestAnimationFrame||function(o){setTimeout(o,17)},d=r.createElement("div").style,m={},f=navigator.userAgent.toLowerCase(),_=function(){for(var o,r=["OT","msT","MozT","webkitT","t"],e=r.length;e--;)if(o=r[e]+"ransform",o in d)return r[e]}(),h={TSF:_+"ransform",TSD:_+"ransitionDuration",TFO:_+"ransformOrigin",isAndroid:/android/.test(f),isIOS:/iphone|ipad/.test(f),isMobile:/mobile|phone|android|pad/.test(f),translateZ:function(o){var r;return r=o?o+"Perspective"in d:"perspective"in d,r?" translateZ(0px)":""}(_.substr(0,_.length-1)),computeTranslate:function(r,e){for(var l,t=0,s=0;r;)l=o.getComputedStyle(r)[h.TSF].replace(/matrix\(|\)/g,"").split(", "),t+=parseInt(l[4])||0,s+=parseInt(l[5])||0,r=r.parentElement,r===e&&(r=null);return{x:t,y:s}},computePosition:function(o,r){for(var e=0,l=0;o;)e+=o.offsetLeft,l+=o.offsetTop,o=o.offsetParent,o===r&&(o=null);return{left:e,top:l}},moveTo:function(o,r,e,l,t,s){function n(){d-=17,d<17?(i=r,a=e):(i=parseInt(i+c,10),a=parseInt(a+p,10)),o.style[h.TSF]="translate("+i+"px, "+a+"px)"+h.translateZ+" scale("+v+")",s&&(s.x=i,s.y=a,s._execEvent("scroll"),s.scrollBtnX&&s._runScrollBarX(),s.scrollBtnY&&s._runScrollBarY()),d>0&&(i!==r||a!==e)?u(n):"function"==typeof t&&t()}var i,a,c,p,d,m,f=0,_=0,v=1;m=/translate\(([-\d.]+)px,\s+([-\d.]+)px\)\s+(?:translateZ\(0px\)\s+)?scale\(([\d.]+)\)/.exec(o.style[h.TSF]),m&&(f=Number(m[1]),_=Number(m[2]),v=Number(m[3])),d=l||17,c=(r-f)/(d/17),p=(e-_)/(d/17),i=f,a=_,n()},findScroller:function(o,e){var l;if(e||!("TEXTAREA"===o.tagName&&o.scrollHeight>o.offsetHeight))for(;o!==r;){if(l=o.getAttribute("jroll-id"))return m[l];o=o.parentNode}return null},findAllJRolls:function(o,e){var l,t=[];if(e||!("TEXTAREA"===o.tagName&&o.scrollHeight>o.clientHeight&&o.scrollTop>0&&o.scrollTop<o.scrollHeight-o.clientHeight))for(;o!==r;)l=o.getAttribute("jroll-id"),l&&t.push(m[l]),o=o.parentNode;return t}},v=!1;try{var x=Object.defineProperty({},"passive",{get:function(){v=!0}});o.addEventListener("test",null,x)}catch(g){}a(h.isMobile?"touchstart":"mousedown",l),a(h.isMobile?"touchmove":"mousemove",t),a(h.isMobile?"touchend":"mouseup",s),h.isMobile?a("touchcancel",s):a(/firefox/.test(f)?"DOMMouseScroll":"mousewheel",i),o.addEventListener("resize",n),o.addEventListener("orientationchange",n),c=function(o,e){var l=this;return l.fading=!0,l.wrapper="string"==typeof o?r.querySelector(o):o,l.scroller=e&&e.scroller?"string"==typeof e.scroller?r.querySelector(e.scroller):e.scroller:l.wrapper.children[0],l.scroller.jroll?(l.scroller.jroll.refresh(),l.scroller.jroll):(l.scroller.jroll=l,void this._init(o,e))},c.version=p,c.utils=h,c.jrollMap=m,c.prototype={_init:function(l,t){var s=this;s.wrapperOffset=h.computePosition(s.wrapper,r.body),s.id=t&&t.id||s.scroller.getAttribute("jroll-id")||"jroll_"+e.random().toString().substr(2,8),s.scroller.setAttribute("jroll-id",s.id),m[s.id]=s,s.options={scrollX:!1,scrollY:!0,scrollFree:!1,minX:null,maxX:null,minY:null,maxY:null,zoom:!1,zoomMin:1,zoomMax:4,zoomDuration:400,bounce:!0,scrollBarX:!1,scrollBarY:!1,scrollBarFade:!1,preventDefault:!0,momentum:!0,autoStyle:!0,autoBlur:!0,edgeRelease:!0};for(var n in t)"scroller"!==n&&(s.options[n]=t[n]);s.options.autoStyle&&("static"===o.getComputedStyle(s.wrapper).position&&(s.wrapper.style.position="relative",s.wrapper.style.top="0",s.wrapper.style.left="0"),s.wrapper.style.overflow="hidden",s.scroller.style.minHeight="100%"),s.options.zoom&&(s.scroller.style.touchAction="none"),s.x=0,s.y=0,s.s=null,s.scrollBarX=null,s.scrollBarY=null,s._s={startX:0,startY:0,lastX:0,lastY:0,endX:0,endY:0},s._z={spacing:0,scale:1,startScale:1},s._event={scrollStart:[],scroll:[],scrollEnd:[],zoomStart:[],zoom:[],zoomEnd:[],refresh:[],touchEnd:[]},s.refresh(!0)},enable:function(){var o=this;return o.scroller.setAttribute("jroll-id",o.id),o},disable:function(){var o=this;return o.scroller.removeAttribute("jroll-id"),o},destroy:function(){var o=this;delete m[o.id],delete o.scroller.jroll,o.scrollBarX&&o.wrapper.removeChild(o.scrollBarX),o.scrollBarY&&o.wrapper.removeChild(o.scrollBarY),o.disable(),o.scroller.style[h.TSF]="",o.scroller.style[h.TSD]="",o.scroller.style[h.TFO]="",o.prototype=null;for(var r in o)o.hasOwnProperty(r)&&delete o[r]},call:function(o,r){var e=this;return e.scrollTo(e.x,e.y),c.jrollActive=o,r&&o._start(r),o},refresh:function(r){var l,t,s,n,i,a,c=this,p=o.getComputedStyle(c.wrapper),u=o.getComputedStyle(c.scroller);return c.wrapperWidth=c.wrapper.clientWidth,c.wrapperHeight=c.wrapper.clientHeight,c.scrollerWidth=e.round(c.scroller.offsetWidth*c._z.scale),c.scrollerHeight=e.round(c.scroller.offsetHeight*c._z.scale),l=parseInt(p.paddingLeft)+parseInt(p.paddingRight),t=parseInt(p.paddingTop)+parseInt(p.paddingBottom),s=parseInt(u.marginLeft)+parseInt(u.marginRight),n=parseInt(u.marginTop)+parseInt(u.marginBottom),isNaN(l)||isNaN(t)||isNaN(s)||isNaN(n)?c:(c.minScrollX=null===c.options.minX?0:c.options.minX,c.maxScrollX=null===c.options.maxX?c.wrapperWidth-c.scrollerWidth-l-s:c.options.maxX,c.minScrollY=null===c.options.minY?0:c.options.minY,c.maxScrollY=null===c.options.maxY?c.wrapperHeight-c.scrollerHeight-t-n:c.options.maxY,c.minScrollX<0&&(c.minScrollX=0),c.minScrollY<0&&(c.minScrollY=0),c.maxScrollX>0&&(c.maxScrollX=0),c.maxScrollY>0&&(c.maxScrollY=0),c._s.endX=c.x,c._s.endY=c.y,c.options.scrollBarX&&c.wrapperWidth+c.maxScrollX<0?(c.scrollBarX||(i=c._createScrollBar("jroll-xbar","jroll-xbtn",!1),c.scrollBarX=i[0],c.scrollBtnX=i[1]),c.scrollBarScaleX=c.wrapper.clientWidth/c.scrollerWidth,a=e.round(c.scrollBarX.clientWidth*c.scrollBarScaleX),c.scrollBtnX.style.width=(a>8?a:8)+"px",c._runScrollBarX()):c.scrollBarX&&(c.wrapper.removeChild(c.scrollBarX),c.scrollBarX=null),c.options.scrollBarY&&c.wrapperHeight+c.maxScrollY<0?(c.scrollBarY||(i=c._createScrollBar("jroll-ybar","jroll-ybtn",!0),c.scrollBarY=i[0],c.scrollBtnY=i[1]),c.scrollBarScaleY=c.wrapper.clientHeight/c.scrollerHeight,a=e.round(c.scrollBarY.clientHeight*c.scrollBarScaleY),c.scrollBtnY.style.height=(a>8?a:8)+"px",c._runScrollBarY()):c.scrollBarY&&(c.wrapper.removeChild(c.scrollBarY),c.scrollBarY=null),r||c._execEvent("refresh"),c)},scale:function(o){var r=this,e=parseFloat(o);return isNaN(e)||(r.scroller.style[h.TFO]="0 0",r._z.scale=e,r.refresh()._scrollTo(r.x,r.y),r.scrollTo(r.x,r.y,400)),r},_wheel:function(o){var r=this,e=o.wheelDelta||120*-(o.detail/3);(r.options.scrollY||r.options.scrollFree)&&r.scrollTo(r.x,r._compute(r.y+e,r.minScrollY,r.maxScrollY))},_runScrollBarX:function(){var o=this,r=e.round(-1*o.x*o.scrollBarScaleX);o._scrollTo.call({scroller:o.scrollBtnX,_z:{scale:1}},r,0)},_runScrollBarY:function(){var o=this,r=e.round(-1*o.y*o.scrollBarScaleY);o._scrollTo.call({scroller:o.scrollBtnY,_z:{scale:1}},0,r)},_createScrollBar:function(o,e,l){var t,s,n=this;return t=r.createElement("div"),s=r.createElement("div"),t.className=o,s.className=e,this.options.scrollBarX!==!0&&this.options.scrollBarY!==!0||(l?(t.style.cssText="position:absolute;top:2px;right:2px;bottom:2px;width:6px;overflow:hidden;border-radius:2px;-webkit-transform: scaleX(.5);transform: scaleX(.5);",s.style.cssText="background:rgba(0,0,0,.4);position:absolute;top:0;left:0;right:0;border-radius:2px;"):(t.style.cssText="position:absolute;left:2px;bottom:2px;right:2px;height:6px;overflow:hidden;border-radius:2px;-webkit-transform: scaleY(.5);transform: scaleY(.5);",s.style.cssText="background:rgba(0,0,0,.4);height:100%;position:absolute;left:0;top:0;bottom:0;border-radius:2px;")),n.options.scrollBarFade&&(t.style.opacity=0),t.appendChild(s),n.wrapper.appendChild(t),[t,s]},_fade:function(o,r){var e=this;e.fading&&r>0&&(r-=25,r%100===0&&(o.style.opacity=r/1e3),u(e._fade.bind(e,o,r)))},on:function(o,r){var e=this;switch(o){case"scrollStart":e._event.scrollStart.push(r);break;case"scroll":e._event.scroll.push(r);break;case"scrollEnd":e._event.scrollEnd.push(r);break;case"zoomStart":e._event.zoomStart.push(r);break;case"zoom":e._event.zoom.push(r);break;case"zoomEnd":e._event.zoomEnd.push(r);break;case"refresh":e._event.refresh.push(r);break;case"touchEnd":e._event.touchEnd.push(r)}return e},_execEvent:function(o,r){for(var e=this,l=e._event[o].length-1;l>=0;l--)e._event[o][l].call(e,r)},_compute:function(o,r,l){var t=this;return o>r?t.options.bounce&&o>r+10?e.round(r+(o-r)/4):r:o<l?t.options.bounce&&o<l-10?e.round(l+(o-l)/4):l:o},_scrollTo:function(o,r){this.scroller.style[h.TSF]="translate("+o+"px, "+r+"px)"+h.translateZ+" scale("+this._z.scale+")"},scrollTo:function(o,r,e,l,t,s,n){var i=this;return l?(i.x=o,i.y=r):(o>=i.minScrollX?(i.x=i.minScrollX,n&&(i._s.startX=n[0].pageX,i._s.endX=i.minScrollX)):o<=i.maxScrollX?(i.x=i.maxScrollX,n&&(i._s.startX=n[0].pageX,i._s.endX=i.maxScrollX)):i.x=o,r>=i.minScrollY?(i.y=i.minScrollY,n&&(i._s.startY=n[0].pageY,i._s.endY=i.minScrollY)):r<=i.maxScrollY?(i.y=i.maxScrollY,n&&(i._s.startY=n[0].pageY,i._s.endY=i.maxScrollY)):i.y=r),s||(i._s.endX=i.x,i._s.endY=i.y),e?h.moveTo(i.scroller,i.x,i.y,e,t,s?i:null):(i._scrollTo(i.x,i.y),s&&i._execEvent("scroll",n&&n[0]),"function"==typeof t&&t()),i.scrollBtnX&&i._runScrollBarX(),i.scrollBtnY&&i._runScrollBarY(),i},scrollToElement:function(o,r,e,l){var t=this,s="string"==typeof o?t.scroller.querySelector(o):o;if(s instanceof HTMLElement){var n=h.computePosition(s,t.scroller),i=h.computeTranslate(s,t.scroller),a=-(n.left+i.x),c=-(n.top+i.y);return t.scrollTo(a,c,r,e,l)}},_endAction:function(){var o=this;o._s.endX=o.x,o._s.endY=o.y,o.moving=!1,o.options.scrollBarFade&&!o.fading&&(o.fading=!0,o.scrollBarX&&o._fade(o.scrollBarX,2e3),o.scrollBarY&&o._fade(o.scrollBarY,2e3)),o._execEvent("scrollEnd")},_stepBounce:function(o,r){var l=this,t=Date.now(),s=t-o,n=0;if(s>0){if(l.speed=l.speed-.008*s,n=e.round(l.speed*s*r*.005),l.speed<=0||n<=0||isNaN(n))return l.bouncing=!1,void l.scrollTo(l.x,l.y,200,!1,function(){l._endAction()},!0);"scrollY"!==l.s&&"scrollFree"!==l.s||(l.y=l.y+n*l.directionY),"scrollX"!==l.s&&"scrollFree"!==l.s||(l.x=l.x+n*l.directionX),l.scrollTo(l.x,l.y,0,!0,null,!0),u(l._stepBounce.bind(l,t,r-1))}},_x:function(o){var r=this,e=r.directionX*o;isNaN(e)||(r.x=r.x+e,(r.x>=r.minScrollX||r.x<=r.maxScrollX)&&(r.options.bounce?r.bouncing=!0:r.moving=!1))},_y:function(o){var r=this,e=r.directionY*o;isNaN(e)||(r.y=r.y+e,(r.y>=r.minScrollY||r.y<=r.maxScrollY)&&(r.options.bounce?r.bouncing=!0:r.moving=!1))},_xy:function(o){var r=this,l=e.round(r.cosX*o),t=e.round(r.cosY*o);isNaN(l)||isNaN(t)||(r.x=r.x+l,r.y=r.y+t,(r.x>=r.minScrollX||r.x<=r.maxScrollX)&&(r.y>=r.minScrollY||r.y<=r.maxScrollY)&&(r.moving=!1))},_step:function(o){var r=this,l=Date.now(),t=l-o,s=0;if(r.id){if(r.bouncing)return void u(r._stepBounce.bind(r,o,20));if(!r.moving)return void r._endAction();if(t>0){if(r.speed=r.speed-t*(r.speed>1.2?.001:r.speed>.6?8e-4:6e-4),s=e.round(r.speed*t),r.speed<=0||s<=0)return void r._endAction();o=l,r._do(s),r.scrollTo(r.x,r.y,0,r.options.bounce&&!r.options.scrollFree,null,!0)}u(r._step.bind(r,o))}},_doScroll:function(r,e){var l,t=this;t.distance=r,t.options.bounce&&(t.x=t._compute(t.x,t.minScrollX,t.maxScrollX),t.y=t._compute(t.y,t.minScrollY,t.maxScrollY)),t.scrollTo(t.x,t.y,0,t.options.bounce,null,!0,e.touches||[e]),t.options.scrollBarFade&&(t.fading=!1,t.scrollBarX&&(t.scrollBarX.style.opacity=1),t.scrollBarY&&(t.scrollBarY.style.opacity=1)),e&&e.touches&&t.options.edgeRelease&&(l=e.touches[0].pageY,(l<=10||l>=o.innerHeight-10)&&t._end(e))},_yTextarea:function(o){var r=this,e=o.target;return!("TEXTAREA"===e.tagName&&e.scrollHeight>e.clientHeight&&(0===e.scrollTop&&r.directionY===-1||e.scrollTop===e.scrollHeight-e.clientHeight&&1===r.directionY))||(r._end(o,!0),!1)},_start:function(o){var l=this,t=o.touches||[o];if(l.options.zoom&&t.length>1){l.s="preZoom",l.scroller.style[h.TFO]="0 0";var s=e.abs(t[0].pageX-t[1].pageX),n=e.abs(t[0].pageY-t[1].pageY);return l._z.spacing=e.sqrt(s*s+n*n),l._z.startScale=l._z.scale,l.originX=(t[0].pageX-t[1].pageX)/2+t[1].pageX-(h.computePosition(l.scroller,r.body).left+h.computeTranslate(l.scroller,r.body).x),l.originY=(t[0].pageY-t[1].pageY)/2+t[1].pageY-(h.computePosition(l.scroller,r.body).top+h.computeTranslate(l.scroller,r.body).y),void l._execEvent("zoomStart",o)}if(l.options.scrollFree)l._do=l._xy,l.s="scrollFree";else if(l.options.scrollX&&l.options.scrollY)l.s="preScroll";else if(!l.options.scrollX&&l.options.scrollY)l._do=l._y,l.s="scrollY";else{if(!l.options.scrollX||l.options.scrollY)return void(l.s=null);l._do=l._x,l.s="scrollX"}l.distance=0,l.lastMoveTime=l.startTime=Date.now(),l._s.lastX=l.startPositionX=l._s.startX=t[0].pageX,l._s.lastY=l.startPositionY=l._s.startY=t[0].pageY,l._execEvent("scrollStart",o)},_move:function(o){var r,l,t,s,n,i,a,c,p=this,u=o.touches||[o],d=1,m=1;if("preScroll"!==p.s&&"scrollX"!==p.s&&"scrollFree"!==p.s||(l=u[0].pageX),"preScroll"!==p.s&&"scrollY"!==p.s&&"scrollFree"!==p.s||(t=u[0].pageY),s=l-p._s.lastX,n=t-p._s.lastY,p._s.lastX=l,p._s.lastY=t,d=s>=0?1:-1,m=n>=0?1:-1,r=Date.now(),(r-p.lastMoveTime>200||p.directionX!==d||p.directionY!==m)&&(p.startTime=r,p.startPositionX=l,p.startPositionY=t,p.directionX=d,p.directionY=m),p.lastMoveTime=r,i=l-p.startPositionX,a=t-p.startPositionY,"preScroll"===p.s){if(e.abs(t-p._s.startY)>=e.abs(l-p._s.startX))return p._do=p._y,void(p.s="scrollY");if(e.abs(t-p._s.startY)<e.abs(l-p._s.startX))return p._do=p._x,void(p.s="scrollX")}if("scrollY"===p.s)return p.y=t-p._s.startY+p._s.endY,void(p._yTextarea(o)&&p._doScroll(a,o));if("scrollX"===p.s)return p.x=l-p._s.startX+p._s.endX,void p._doScroll(i,o);if("scrollFree"===p.s)return p.x=l-p._s.startX+p._s.endX,p.y=t-p._s.startY+p._s.endY,c=e.sqrt(i*i+a*a),p.cosX=i/c,p.cosY=a/c,void p._doScroll(e.sqrt(i*i+a*a),o);if("preZoom"===p.s){var f,_=e.abs(u[0].pageX-u[1].pageX),h=e.abs(u[0].pageY-u[1].pageY),v=e.sqrt(_*_+h*h),x=v/p._z.spacing*p._z.startScale;return x<p.options.zoomMin?x=p.options.zoomMin:x>p.options.zoomMax&&(x=p.options.zoomMax),f=x/p._z.startScale,p.x=e.round(p.originX-p.originX*f+p._s.endX),p.y=e.round(p.originY-p.originY*f+p._s.endY),p._z.scale=x,p._scrollTo(p.x,p.y),void p._execEvent("zoom",o)}},_end:function(o,r){var l,t,s=this,n=Date.now(),i="scrollY"===s.s,a="scrollX"===s.s,p="scrollFree"===s.s;if(i||a||p){if(o.touches&&o.touches.length&&!r)return;return s._execEvent("touchEnd"),c.jrollActive=null,s.duration=n-s.startTime,l=s.y>s.minScrollY||s.y<s.maxScrollY,t=s.x>s.minScrollX||s.x<s.maxScrollX,void(i&&l||a&&t||p&&(l||t)?s.scrollTo(s.x,s.y,300)._endAction():s.options.momentum&&s.duration<200&&s.distance?(s.speed=e.abs(s.distance/s.duration),s.speed=s.speed>2?2:s.speed,s.moving=!0,u(s._step.bind(s,n))):s._endAction())}if("preZoom"===s.s)return s._execEvent("touchEnd"),c.jrollActive=null,s._z.scale>s.options.zoomMax?s._z.scale=s.options.zoomMax:s._z.scale<s.options.zoomMin&&(s._z.scale=s.options.zoomMin),s.refresh(),s.scrollTo(s.x,s.y,s.options.zoomDuration),void s._execEvent("zoomEnd")}},"undefined"!=typeof module&&module.exports&&(module.exports=c),"function"==typeof define&&define(function(){return c}),o.JRoll=c}(window,document,Math);