1 |
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Slide=t()}(this,function(){"use strict";function e(e){console.error("[BScroll warn]: "+e)}var i="undefined"!=typeof window,t=i&&navigator.userAgent.toLowerCase();t&&/wechatdevtools/.test(t),t&&t.indexOf("android"),function(){if("string"==typeof t){var e=/os (\d\d?_\d(_\d)?)/.exec(t);if(!e)return;e=e[1].split("_").map(function(e){return parseInt(e,10)});13===e[0]&&e[1]}}();if(i)try{var s={};Object.defineProperty(s,"passive",{get:function(){}}),window.addEventListener("test-passive",function(){},s)}catch(e){}function o(e,t){for(var s in t)e[s]=t[s];return e}function a(e,t,s){return e<t?t:s<e?s:e}var r=i&&document.createElement("div").style,n=function(){if(!i)return!1;for(var e=0,t=[{key:"standard",value:"transform"},{key:"webkit",value:"webkitTransform"},{key:"Moz",value:"MozTransform"},{key:"O",value:"OTransform"},{key:"ms",value:"msTransform"}];e<t.length;e++){var s=t[e];if(void 0!==r[s.value])return s.key}return!1}();function h(e){return!1===n?e:"standard"===n?"transitionEnd"===e?"transitionend":e:n+e.charAt(0).toUpperCase()+e.substr(1)}n&&"standard"!==n&&n.toLowerCase();h("transform"),h("transition");i&&h("perspective")in r,h("transitionTimingFunction"),h("transitionDuration"),h("transitionDelay"),h("transformOrigin"),h("transitionEnd"),h("transitionProperty");var g={swipe:{style:"cubic-bezier(0.23, 1, 0.32, 1)",fn:function(e){return 1+--e*e*e*e*e}},swipeBounce:{style:"cubic-bezier(0.25, 0.46, 0.45, 0.94)",fn:function(e){return e*(2-e)}},bounce:{style:"cubic-bezier(0.165, 0.84, 0.44, 1)",fn:function(e){return 1- --e*e*e*e}}},p=(l.prototype.init=function(){var e=this.scroll.scroller,t=e.scrollBehaviorX,e=e.scrollBehaviorY;this.wrapperWidth=t.wrapperSize,this.wrapperHeight=e.wrapperSize,this.scrollerHeight=e.contentSize,this.scrollerWidth=t.contentSize,this.pages=this.buildPagesMatrix(this.wrapperWidth,this.wrapperHeight),this.pageLengthOfX=this.pages?this.pages.length:0,this.pageLengthOfY=this.pages&&this.pages[0]?this.pages[0].length:0},l.prototype.getPageStats=function(e,t){return this.pages[e][t]},l.prototype.getNearestPageIndex=function(e,t){for(var s=0,i=0,o=this.pages.length;s<o-1&&!(e>=this.pages[s][0].cx);s++);for(o=this.pages[s].length;i<o-1&&!(t>=this.pages[0][i].cy);i++);return{pageX:s,pageY:i}},l.prototype.buildPagesMatrix=function(e,t){for(var s,i,o=[],r=0,a=0,n=this.scroll.scroller.scrollBehaviorX.maxScrollPos,h=this.scroll.scroller.scrollBehaviorY.maxScrollPos,g=Math.round(e/2),p=Math.round(t/2);r>-this.scrollerWidth;){for(o[a]=[],s=i=0;s>-this.scrollerHeight;)o[a][i]={x:Math.max(r,n),y:Math.max(s,h),width:e,height:t,cx:r-g,cy:s-p},s-=t,i++;r-=e,a++}return o},l);function l(e){this.scroll=e,this.init()}var c={pageX:0,pageY:0,x:0,y:0},d=(u.prototype.refresh=function(){this.pagesMatrix=new p(this.scroll),this.checkSlideLoop(),this.currentPage=this.getAdjustedCurrentPage()},u.prototype.getAdjustedCurrentPage=function(){var e=this.currentPage,t=e.pageX,s=e.pageY,t=Math.min(t,this.pagesMatrix.pageLengthOfX-1),s=Math.min(s,this.pagesMatrix.pageLengthOfY-1);this.loopX&&(t=Math.min(t,this.pagesMatrix.pageLengthOfX-2)),this.loopY&&(s=Math.min(s,this.pagesMatrix.pageLengthOfY-2));e=this.pagesMatrix.getPageStats(t,s);return{pageX:t,pageY:s,x:e.x,y:e.y}},u.prototype.setCurrentPage=function(e){this.currentPage=e},u.prototype.getInternalPage=function(e,t){e>=this.pagesMatrix.pageLengthOfX?e=this.pagesMatrix.pageLengthOfX-1:e<0&&(e=0),t>=this.pagesMatrix.pageLengthOfY?t=this.pagesMatrix.pageLengthOfY-1:t<0&&(t=0);var s=this.pagesMatrix.getPageStats(e,t);return{pageX:e,pageY:t,x:s.x,y:s.y}},u.prototype.getInitialPage=function(e,t){var s=this.slideOptions,i=s.startPageXIndex,o=s.startPageYIndex,r=this.loopX?1:0,a=this.loopY?1:0,n=(e=void 0===e?!1:e)?r:this.currentPage.pageX,s=e?a:this.currentPage.pageY,s=(t=void 0===t?!1:t)?(n=this.loopX?i+1:i,this.loopY?o+1:o):(n=e?r:this.currentPage.pageX,e?a:this.currentPage.pageY),a=this.pagesMatrix.getPageStats(n,s);return{pageX:n,pageY:s,x:a.x,y:a.y}},u.prototype.getExposedPage=function(e){e=o({},e);return this.loopX&&(e.pageX=this.fixedPage(e.pageX,this.pagesMatrix.pageLengthOfX-2)),this.loopY&&(e.pageY=this.fixedPage(e.pageY,this.pagesMatrix.pageLengthOfY-2)),e},u.prototype.getExposedPageByPageIndex=function(e,t){var s={pageX:e,pageY:t};this.loopX&&(s.pageX=e+1),this.loopY&&(s.pageY=t+1);s=this.pagesMatrix.getPageStats(s.pageX,s.pageY);return{x:s.x,y:s.y,pageX:e,pageY:t}},u.prototype.getWillChangedPage=function(e){return e=o({},e),this.loopX&&(e.pageX=this.fixedPage(e.pageX,this.pagesMatrix.pageLengthOfX-2),e.x=this.pagesMatrix.getPageStats(e.pageX+1,0).x),this.loopY&&(e.pageY=this.fixedPage(e.pageY,this.pagesMatrix.pageLengthOfY-2),e.y=this.pagesMatrix.getPageStats(0,e.pageY+1).y),e},u.prototype.fixedPage=function(e,t){for(var s=[],i=0;i<t;i++)s.push(i);return s.unshift(t-1),s.push(0),s[e]},u.prototype.getPageStats=function(){return this.pagesMatrix.getPageStats(this.currentPage.pageX,this.currentPage.pageY)},u.prototype.getValidPageIndex=function(e,t){var s=this.pagesMatrix.pageLengthOfX-1,i=this.pagesMatrix.pageLengthOfY-1,o=0,r=0;return this.loopX&&(e+=1,o+=1,s-=1),this.loopY&&(t+=1,r+=1,i-=1),{pageX:e=a(e,o,s),pageY:t=a(t,r,i)}},u.prototype.nextPageIndex=function(){return this.getPageIndexByDirection("positive")},u.prototype.prevPageIndex=function(){return this.getPageIndexByDirection("negative")},u.prototype.getNearestPage=function(e,t){e=this.pagesMatrix.getNearestPageIndex(e,t),t=e.pageX,e=e.pageY;return{x:this.pagesMatrix.getPageStats(t,0).x,y:this.pagesMatrix.getPageStats(0,e).y,pageX:t,pageY:e}},u.prototype.getPageByDirection=function(e,t,s){var i=e.pageX,e=e.pageY;return i===this.currentPage.pageX&&(i=a(i+t,0,this.pagesMatrix.pageLengthOfX-1)),e===this.currentPage.pageY&&(e=a(e+s,0,this.pagesMatrix.pageLengthOfY-1)),{x:this.pagesMatrix.getPageStats(i,0).x,y:this.pagesMatrix.getPageStats(0,e).y,pageX:i,pageY:e}},u.prototype.resetLoopPage=function(){if(this.loopX){if(0===this.currentPage.pageX)return{pageX:this.pagesMatrix.pageLengthOfX-2,pageY:this.currentPage.pageY};if(this.currentPage.pageX===this.pagesMatrix.pageLengthOfX-1)return{pageX:1,pageY:this.currentPage.pageY}}if(this.loopY)return 0===this.currentPage.pageY?{pageX:this.currentPage.pageX,pageY:this.pagesMatrix.pageLengthOfY-2}:this.currentPage.pageY===this.pagesMatrix.pageLengthOfY-1?{pageX:this.currentPage.pageX,pageY:1}:void 0},u.prototype.getPageIndexByDirection=function(e){var t=this.currentPage.pageX,s=this.currentPage.pageY;return{pageX:t=this.slideX?"negative"===e?t-1:t+1:t,pageY:s=this.slideY?"negative"===e?s-1:s+1:s}},u.prototype.checkSlideLoop=function(){this.wannaLoop=this.slideOptions.loop,1<this.pagesMatrix.pageLengthOfX?this.slideX=!0:this.slideX=!1,this.pagesMatrix.pages[0]&&1<this.pagesMatrix.pageLengthOfY?this.slideY=!0:this.slideY=!1,this.loopX=this.wannaLoop&&this.slideX,this.loopY=this.wannaLoop&&this.slideY,this.slideX&&this.slideY&&e("slide does not support two direction at the same time.")},u);function u(e,t){this.scroll=e,this.slideOptions=t,this.slideX=!1,this.slideY=!1,this.currentPage=o({},c)}var f=[{key:"next",name:"next"},{key:"prev",name:"prev"},{key:"goToPage",name:"goToPage"},{key:"getCurrentPage",name:"getCurrentPage"},{key:"startPlay",name:"startPlay"},{key:"pausePlay",name:"pausePlay"}].map(function(e){return{key:e.key,sourceKey:"plugins.slide."+e.name}});function y(e){this.scroll=e,this.cachedClonedPageDOM=[],this.resetLooping=!1,this.autoplayTimer=0,this.satisfyInitialization()&&this.init()}return y.prototype.satisfyInitialization=function(){return!(this.scroll.scroller.content.children.length<=0)||(e("slide need at least one slide page to be initialised.please check your DOM layout."),!1)},y.prototype.init=function(){this.willChangeToPage=o({},c),this.handleBScroll(),this.handleOptions(),this.handleHooks(),this.createPages()},y.prototype.createPages=function(){this.pages=new d(this.scroll,this.options)},y.prototype.handleBScroll=function(){this.scroll.registerType(["slideWillChange","slidePageChanged"]),this.scroll.proxy(f)},y.prototype.handleOptions=function(){var e=!0===this.scroll.options.slide?{}:this.scroll.options.slide;this.options=o({loop:!0,threshold:.1,speed:400,easing:g.bounce,listenFlick:!0,autoplay:!0,interval:3e3,startPageXIndex:0,startPageYIndex:0},e)},y.prototype.handleLoop=function(e){var t=this.options.loop,s=this.scroll.scroller.content,i=s.children.length;t&&(s!==e?(this.resetLoopChangedStatus(),this.removeClonedSlidePage(e),1<i&&this.cloneFirstAndLastSlidePage(s)):3===i&&this.initialised?(this.removeClonedSlidePage(s),this.moreToOnePageInLoop=!0,this.oneToMorePagesInLoop=!1):1<i?(this.initialised&&0===this.cachedClonedPageDOM.length?(this.oneToMorePagesInLoop=!0,this.moreToOnePageInLoop=!1):(this.removeClonedSlidePage(s),this.resetLoopChangedStatus()),this.cloneFirstAndLastSlidePage(s)):this.resetLoopChangedStatus())},y.prototype.resetLoopChangedStatus=function(){this.moreToOnePageInLoop=!1,this.oneToMorePagesInLoop=!1},y.prototype.handleHooks=function(){var t=this,e=this.scroll.hooks,s=this.scroll.scroller.hooks,i=this.options.listenFlick;this.prevContent=this.scroll.scroller.content,this.hooksFn=[],this.registerHooks(this.scroll,this.scroll.eventTypes.beforeScrollStart,this.pausePlay),this.registerHooks(this.scroll,this.scroll.eventTypes.scrollEnd,this.modifyCurrentPage),this.registerHooks(this.scroll,this.scroll.eventTypes.scrollEnd,this.startPlay),this.scroll.eventTypes.mousewheelMove&&(this.registerHooks(this.scroll,this.scroll.eventTypes.mousewheelMove,function(){return!0}),this.registerHooks(this.scroll,this.scroll.eventTypes.mousewheelEnd,function(e){1!==e.directionX&&1!==e.directionY||t.next(),-1!==e.directionX&&-1!==e.directionY||t.prev()})),this.registerHooks(e,e.eventTypes.refresh,this.refreshHandler),this.registerHooks(e,e.eventTypes.destroy,this.destroy),this.registerHooks(s,s.eventTypes.beforeRefresh,function(){t.handleLoop(t.prevContent),t.setSlideInlineStyle()}),this.registerHooks(s,s.eventTypes.momentum,this.modifyScrollMetaHandler),this.registerHooks(s,s.eventTypes.scroll,this.scrollHandler),this.registerHooks(s,s.eventTypes.checkClick,this.startPlay),i&&this.registerHooks(s,s.eventTypes.flick,this.flickHandler)},y.prototype.startPlay=function(){var e=this,t=this.options,s=t.interval;t.autoplay&&(clearTimeout(this.autoplayTimer),this.autoplayTimer=window.setTimeout(function(){e.next()},s))},y.prototype.pausePlay=function(){this.options.autoplay&&clearTimeout(this.autoplayTimer)},y.prototype.setSlideInlineStyle=function(){var e=this.scroll.scroller,h=e.content,g=e.wrapper,p=this.scroll.options;[{direction:"scrollX",sizeType:"offsetWidth",styleType:"width"},{direction:"scrollY",sizeType:"offsetHeight",styleType:"height"}].forEach(function(e){var t=e.direction,s=e.sizeType,i=e.styleType;if(p[t]){for(var o=g[s],r=h.children,a=r.length,n=0;n<a;n++)r[n].style[i]=o+"px";h.style[i]=o*a+"px"}})},y.prototype.next=function(e,t){var s=this.pages.nextPageIndex(),i=s.pageX,s=s.pageY;this.goTo(i,s,e,t)},y.prototype.prev=function(e,t){var s=this.pages.prevPageIndex(),i=s.pageX,s=s.pageY;this.goTo(i,s,e,t)},y.prototype.goToPage=function(e,t,s,i){t=this.pages.getValidPageIndex(e,t);this.goTo(t.pageX,t.pageY,s,i)},y.prototype.getCurrentPage=function(){return this.exposedPage||this.pages.getInitialPage(!1,!0)},y.prototype.setCurrentPage=function(e){this.pages.setCurrentPage(e),this.exposedPage=this.pages.getExposedPage(e)},y.prototype.nearestPage=function(e,t){var s=this.scroll.scroller,i=s.scrollBehaviorX,o=s.scrollBehaviorY,r=i.maxScrollPos,s=i.minScrollPos,i=o.maxScrollPos,o=o.minScrollPos;return this.pages.getNearestPage(a(e,r,s),a(t,i,o))},y.prototype.satisfyThreshold=function(e,t){var s=this.scroll.scroller,i=s.scrollBehaviorX,o=s.scrollBehaviorY,s=!0;return s=Math.abs(e-i.absStartPos)<=this.thresholdX&&Math.abs(t-o.absStartPos)<=this.thresholdY?!1:s},y.prototype.refreshHandler=function(e){var t,s,i=this;this.satisfyInitialization()&&(this.pages.refresh(),this.computeThreshold(),(t=this.contentChanged=this.prevContent!==e)&&(this.prevContent=e),s=this.pages.getInitialPage(this.oneToMorePagesInLoop||this.moreToOnePageInLoop,t||!this.initialised),this.initialised?this.goTo(s.pageX,s.pageY,0):this.registerHooks(this.scroll.hooks,this.scroll.hooks.eventTypes.beforeInitialScrollTo,function(e){i.initialised=!0,e.x=s.x,e.y=s.y}),this.startPlay())},y.prototype.computeThreshold=function(){var e,t,s=this.options.threshold;s%1==0?(this.thresholdX=s,this.thresholdY=s):(e=(t=this.pages.getPageStats()).width,t=t.height,this.thresholdX=Math.round(e*s),this.thresholdY=Math.round(t*s))},y.prototype.cloneFirstAndLastSlidePage=function(e){var t,s,i=e.children,o=i[i.length-1].cloneNode(!0),r=i[0].cloneNode(!0);t=o,(i=(s=e).firstChild)?i.parentNode.insertBefore(t,i):s.appendChild(t),e.appendChild(r),this.cachedClonedPageDOM=[o,r]},y.prototype.removeClonedSlidePage=function(t){(t&&t.children||[]).length&&this.cachedClonedPageDOM.forEach(function(e){t.removeChild(e)}),this.cachedClonedPageDOM=[]},y.prototype.modifyCurrentPage=function(e){var t=this.getCurrentPage(),s=t.pageX,i=t.pageY,o=this.nearestPage(e.x,e.y);if(this.setCurrentPage(o),this.contentChanged)return!(this.contentChanged=!1);t=this.getCurrentPage(),e=t.pageX,t=t.pageY;if(this.pageWillChangeTo(o),this.oneToMorePagesInLoop)return!(this.oneToMorePagesInLoop=!1);if(this.moreToOnePageInLoop&&0===s&&0===i)return!(this.moreToOnePageInLoop=!1);if(s===e&&i===t||(r=this.pages.getExposedPageByPageIndex(e,t),this.scroll.trigger(this.scroll.eventTypes.slidePageChanged,r)),!this.resetLooping){var r=this.pages.resetLoopPage();return r?(this.resetLooping=!0,this.goTo(r.pageX,r.pageY,0),!0):void 0}this.resetLooping=!1},y.prototype.goTo=function(e,t,s,i){var o=this.pages.getInternalPage(e,t),r=i||this.options.easing||g.bounce,e=o.x,t=o.y,i=e-this.scroll.scroller.scrollBehaviorX.currentPos,o=t-this.scroll.scroller.scrollBehaviorY.currentPos;i||o?(s=void 0===s?this.getEaseTime(i,o):s,this.scroll.scroller.scrollTo(e,t,s,r)):this.scroll.scroller.togglePointerEvents(!0)},y.prototype.flickHandler=function(){var e=this.scroll.scroller,t=e.scrollBehaviorX,s=e.scrollBehaviorY,i=t.currentPos,o=t.startPos,r=t.direction,a=s.currentPos,n=s.startPos,e=s.direction,t=this.pages.currentPage,s=t.pageX,t=t.pageY,n=this.getEaseTime(i-o,a-n);this.goTo(s+r,t+e,n)},y.prototype.getEaseTime=function(e,t){return this.options.speed||Math.max(Math.max(Math.min(Math.abs(e),1e3),Math.min(Math.abs(t),1e3)),300)},y.prototype.modifyScrollMetaHandler=function(e){var t=this.scroll.scroller,s=t.scrollBehaviorX,i=t.scrollBehaviorY,o=t.animater,r=e.newX,t=e.newY,i=this.satisfyThreshold(r,t)||o.forceStopped?this.pages.getPageByDirection(this.nearestPage(r,t),s.direction,i.direction):this.pages.currentPage;e.time=this.getEaseTime(e.newX-i.x,e.newY-i.y),e.newX=i.x,e.newY=i.y,e.easing=this.options.easing||g.bounce},y.prototype.scrollHandler=function(e){var t=e.x,e=e.y;this.satisfyThreshold(t,e)&&(e=this.nearestPage(t,e),this.pageWillChangeTo(e))},y.prototype.pageWillChangeTo=function(e){var t,s=this.pages.getWillChangedPage(e);t=this.willChangeToPage,e=s,t.pageX===e.pageX&&t.pageY===e.pageY||(this.willChangeToPage=s,this.scroll.trigger(this.scroll.eventTypes.slideWillChange,this.willChangeToPage))},y.prototype.registerHooks=function(e,t,s){e.on(t,s,this),this.hooksFn.push([e,t,s])},y.prototype.destroy=function(){var e=this.scroll.scroller.content,t=this.options,s=t.loop,t=t.autoplay;s&&this.removeClonedSlidePage(e),t&&clearTimeout(this.autoplayTimer),this.hooksFn.forEach(function(e){var t=e[0],s=e[1],e=e[2];t.eventTypes[s]&&t.off(s,e)}),this.hooksFn.length=0},y.pluginName="slide",y});
|