You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2 lines
8.5 KiB

!function(o,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(o="undefined"!=typeof globalThis?globalThis:o||self).Zoom=t()}(this,function(){"use strict";var o=[{key:"zoomTo",name:"zoomTo"}].map(function(o){return{key:o.key,sourceKey:"plugins.zoom."+o.name}}),r="undefined"!=typeof window,e=r&&navigator.userAgent.toLowerCase();e&&/wechatdevtools/.test(e),e&&e.indexOf("android"),function(){if("string"!=typeof e)return;var o=/os (\d\d?_\d(_\d)?)/.exec(e);if(!o)return;var t=o[1].split("_").map(function(o){return parseInt(o,10)});13<=t[0]&&t[1]}();function m(){return window.performance&&window.performance.now&&window.performance.timing?window.performance.now()+window.performance.timing.navigationStart:+new Date}function g(o,t,e){return o<t?t:e<o?e:o}var n=r&&document.createElement("div").style,t=function(){if(!r)return!1;for(var o=0,t=[{key:"standard",value:"transform"},{key:"webkit",value:"webkitTransform"},{key:"Moz",value:"MozTransform"},{key:"O",value:"OTransform"},{key:"ms",value:"msTransform"}];o<t.length;o++){var e=t[o];if(void 0!==n[e.value])return e.key}return!1}();function i(o){return!1===t?o:"standard"===t?"transitionEnd"===o?"transitionend":o:t+o.charAt(0).toUpperCase()+o.substr(1)}t&&"standard"!==t&&t.toLowerCase(),i("transform"),i("transition"),r&&i("perspective")in n,i("transitionTimingFunction"),i("transitionDuration"),i("transitionDelay");var s=i("transformOrigin");i("transitionEnd"),i("transitionProperty");function a(o){if(o instanceof window.SVGElement){var t=o.getBoundingClientRect();return{top:t.top,left:t.left,width:t.width,height:t.height}}return{top:o.offsetTop,left:o.offsetLeft,width:o.offsetWidth,height:o.offsetHeight}}var d={style:"cubic-bezier(0.165, 0.84, 0.44, 1)",fn:function(o){return 1- --o*o*o*o}},l=r&&window;function c(){}var v=r?l.requestAnimationFrame||l.webkitRequestAnimationFrame||l.mozRequestAnimationFrame||l.oRequestAnimationFrame||function(o){return window.setTimeout(o,(o.interval||1e3/60)/2)}:c,y=r?l.cancelAnimationFrame||l.webkitCancelAnimationFrame||l.mozCancelAnimationFrame||l.oCancelAnimationFrame||function(o){window.clearTimeout(o)}:c;function h(o){this.scroll=o,this.scale=1,this.prevScale=1,this.init()}return h.prototype.init=function(){this.handleBScroll(),this.handleOptions(),this.handleHooks(),this.tryInitialZoomTo(this.zoomOpt)},h.prototype.zoomTo=function(o,t,e,r){var n=this.resolveOrigin(t,e),i={x:n.originX,y:n.originY,baseScale:this.scale};this._doZoomTo(o,i,r,!0)},h.prototype.handleBScroll=function(){this.scroll.proxy(o),this.scroll.registerType(["beforeZoomStart","zoomStart","zooming","zoomEnd"])},h.prototype.handleOptions=function(){var o=!0===this.scroll.options.zoom?{}:this.scroll.options.zoom;this.zoomOpt=function(o,t){for(var e in t)o[e]=t[e];return o}({start:1,min:1,max:4,initialOrigin:[0,0],minimalZoomDistance:5,bounceTime:800},o)},h.prototype.handleHooks=function(){var r=this,o=this.scroll,t=this.scroll.scroller;this.wrapper=this.scroll.scroller.wrapper,this.setTransformOrigin(this.scroll.scroller.content);var e=t.scrollBehaviorX,n=t.scrollBehaviorY;this.hooksFn=[],this.registerHooks(o.hooks,o.hooks.eventTypes.contentChanged,function(o){r.setTransformOrigin(o),r.scale=1,r.tryInitialZoomTo(r.zoomOpt)}),this.registerHooks(o.hooks,o.hooks.eventTypes.beforeInitialScrollTo,function(){if(1!==r.zoomOpt.start)return!0}),this.registerHooks(e.hooks,e.hooks.eventTypes.beforeComputeBoundary,function(){var o=a(r.scroll.scroller.content);e.contentSize=Math.floor(o.width*r.scale)}),this.registerHooks(n.hooks,n.hooks.eventTypes.beforeComputeBoundary,function(){var o=a(r.scroll.scroller.content);n.contentSize=Math.floor(o.height*r.scale)}),this.registerHooks(t.actions.hooks,t.actions.hooks.eventTypes.start,function(o){var t=o.touches&&o.touches.length||0;r.fingersOperation(t),2===t&&r.zoomStart(o)}),this.registerHooks(t.actions.hooks,t.actions.hooks.eventTypes.beforeMove,function(o){var t=o.touches&&o.touches.length||0;if(r.fingersOperation(t),2===t)return r.zoom(o),!0}),this.registerHooks(t.actions.hooks,t.actions.hooks.eventTypes.beforeEnd,function(o){if(2===r.fingersOperation())return r.zoomEnd(),!0}),this.registerHooks(t.translater.hooks,t.translater.hooks.eventTypes.beforeTranslate,function(o,t){var e=t.scale?t.scale:r.prevScale;r.prevScale=e,o.push("scale("+e+")")}),this.registerHooks(t.hooks,t.hooks.eventTypes.scrollEnd,function(){2===r.fingersOperation()&&r.scroll.trigger(r.scroll.eventTypes.zoomEnd,{scale:r.scale})}),this.registerHooks(this.scroll.hooks,"destroy",this.destroy)},h.prototype.setTransformOrigin=function(o){o.style[s]="0 0"},h.prototype.tryInitialZoomTo=function(o){var t=o.start,e=o.initialOrigin,r=this.scroll.scroller,n=r.scrollBehaviorX,i=r.scrollBehaviorY;1!==t&&(this.resetBoundaries([n,i]),this.zoomTo(t,e[0],e[1],0))},h.prototype.fingersOperation=function(o){if("number"!=typeof o)return this.numberOfFingers;this.numberOfFingers=o},h.prototype._doZoomTo=function(o,t,e,r){var n=this;void 0===e&&(e=this.zoomOpt.bounceTime),void 0===r&&(r=!1);var i,s,a,l,c=this.zoomOpt,h=c.min,u=c.max,f=this.scale,p=g(o,h,u);0!==e?0<e&&(s=m(),a=s+e,(l=function(){var o=m();if(a<=o)return n.scroll.trigger(n.scroll.eventTypes.zooming,{scale:p}),void y(i);var t=d.fn((o-s)/e)*(p-f)+f;n.scroll.trigger(n.scroll.eventTypes.zooming,{scale:t}),i=v(l)})()):n.scroll.trigger(n.scroll.eventTypes.zooming,{scale:p}),this.fingersOperation(2),this._zoomTo(p,f,t,e,r)},h.prototype._zoomTo=function(o,t,e,r,n){void 0===n&&(n=!1);var i=o/e.baseScale;this.setScale(o);var s=this.scroll.scroller,a=s.scrollBehaviorX,l=s.scrollBehaviorY;this.resetBoundaries([a,l]);var c=this.getNewPos(e.x,i,a,!0,n),h=this.getNewPos(e.y,i,l,!0,n);a.currentPos===Math.round(c)&&l.currentPos===Math.round(h)&&o===t||s.scrollTo(c,h,r,d,{start:{scale:t},end:{scale:o}})},h.prototype.resolveOrigin=function(o,t){var e=this.scroll.scroller,r=e.scrollBehaviorX,n=e.scrollBehaviorY,i={left:function(){return 0},top:function(){return 0},right:function(){return r.contentSize},bottom:function(){return n.contentSize},center:function(o){return(0===o?r.contentSize:n.contentSize)/2}};return{originX:"number"==typeof o?o:i[o](0),originY:"number"==typeof t?t:i[t](1)}},h.prototype.zoomStart=function(o){var t=o.touches[0],e=o.touches[1];this.startDistance=this.getFingerDistance(o),this.startScale=this.scale;var r,n,i=(r=this.wrapper,{left:-((n=r.getBoundingClientRect()).left+window.pageXOffset),top:-(n.top+window.pageYOffset)}),s=i.left,a=i.top;this.origin={x:Math.abs(t.pageX+e.pageX)/2+s-this.scroll.x,y:Math.abs(t.pageY+e.pageY)/2+a-this.scroll.y,baseScale:this.startScale},this.scroll.trigger(this.scroll.eventTypes.beforeZoomStart)},h.prototype.zoom=function(o){var t,e,r,n,i,s,a,l=this.getFingerDistance(o);!this.zoomed&&Math.abs(l-this.startDistance)<this.zoomOpt.minimalZoomDistance||(e=(t=this.dampingScale(l/this.startDistance*this.startScale))/this.startScale,this.setScale(t),this.zoomed||(this.zoomed=!0,this.scroll.trigger(this.scroll.eventTypes.zoomStart)),n=(r=this.scroll.scroller).scrollBehaviorX,i=r.scrollBehaviorY,s=this.getNewPos(this.origin.x,e,n,!1,!1),a=this.getNewPos(this.origin.y,e,i,!1,!1),this.scroll.trigger(this.scroll.eventTypes.zooming,{scale:this.scale}),r.translater.translate({x:s,y:a,scale:t}))},h.prototype.zoomEnd=function(){this.zoomed&&(this.shouldRebound()?this._doZoomTo(this.scale,this.origin,this.zoomOpt.bounceTime):this.scroll.trigger(this.scroll.eventTypes.zoomEnd,{scale:this.scale}))},h.prototype.getFingerDistance=function(o){var t,e,r=o.touches[0],n=o.touches[1],i=Math.abs(r.pageX-n.pageX),s=Math.abs(r.pageY-n.pageY);return t=i,e=s,Math.sqrt(t*t+e*e)},h.prototype.shouldRebound=function(){var o=this.zoomOpt,t=o.min,e=o.max,r=this.scale;if(r!==g(r,t,e))return!0;var n=this.scroll.scroller,i=n.scrollBehaviorX,s=n.scrollBehaviorY;this.resetBoundaries([i,s]);var a=i.checkInBoundary().inBoundary,l=i.checkInBoundary().inBoundary;return!(a&&l)},h.prototype.dampingScale=function(o){var t=this.zoomOpt,e=t.min,r=t.max;return o<e?o=.5*e*Math.pow(2,o/e):r<o&&(o=2*r*Math.pow(.5,r/o)),o},h.prototype.setScale=function(o){this.scale=o},h.prototype.resetBoundaries=function(o){o.forEach(function(o){return o.computeBoundary()})},h.prototype.getNewPos=function(o,t,e,r,n){void 0===n&&(n=!1);var i=o-o*t+(n?e.currentPos:e.startPos);return r&&(i=g(i,e.maxScrollPos,e.minScrollPos)),0<i?Math.floor(i):Math.ceil(i)},h.prototype.registerHooks=function(o,t,e){o.on(t,e,this),this.hooksFn.push([o,t,e])},h.prototype.destroy=function(){this.hooksFn.forEach(function(o){var t=o[0],e=o[1],r=o[2];t.off(e,r)}),this.hooksFn.length=0},h.pluginName="zoom",h});