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
14 KiB

!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)}function i(e,t){for(var i in t)e[i]=t[i];return e}var s="undefined"!=typeof window,r=s&&navigator.userAgent.toLowerCase();r&&/wechatdevtools/.test(r),r&&r.indexOf("android"),function(){if("string"!=typeof r)return;var e=/os (\d\d?_\d(_\d)?)/.exec(r);if(!e)return;var t=e[1].split("_").map(function(e){return parseInt(e,10)});13<=t[0]&&t[1]}();function l(e,t,i){return e<t?t:i<e?i:e}var o=s&&document.createElement("div").style,t=function(){if(!s)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 i=t[e];if(void 0!==o[i.value])return i.key}return!1}();function a(e){return!1===t?e:"standard"===t?"transitionEnd"===e?"transitionend":e:t+e.charAt(0).toUpperCase()+e.substr(1)}t&&"standard"!==t&&t.toLowerCase();var n=a("transform"),h=a("transition");s&&a("perspective")in o,a("transitionTimingFunction"),a("transitionDuration"),a("transitionDelay"),a("transformOrigin"),a("transitionEnd"),a("transitionProperty");function p(e,t){e.removeChild(t)}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}}},c=(u.prototype.init=function(){var e=this.scroll.scroller,t=e.scrollBehaviorX,i=e.scrollBehaviorY;this.wrapperWidth=t.wrapperSize,this.wrapperHeight=i.wrapperSize,this.scrollerHeight=i.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},u.prototype.getPageStats=function(e,t){return this.pages[e][t]},u.prototype.getNearestPageIndex=function(e,t){for(var i=0,s=0,r=this.pages.length;i<r-1&&!(e>=this.pages[i][0].cx);i++);for(r=this.pages[i].length;s<r-1&&!(t>=this.pages[0][s].cy);s++);return{pageX:i,pageY:s}},u.prototype.buildPagesMatrix=function(e,t){for(var i,s,r=[],o=0,a=0,n=this.scroll.scroller.scrollBehaviorX.maxScrollPos,h=this.scroll.scroller.scrollBehaviorY.maxScrollPos,l=Math.round(e/2),p=Math.round(t/2);o>-this.scrollerWidth;){for(r[a]=[],i=s=0;i>-this.scrollerHeight;)r[a][s]={x:Math.max(o,n),y:Math.max(i,h),width:e,height:t,cx:o-l,cy:i-p},i-=t,s++;o-=e,a++}return r},u);function u(e){this.scroll=e,this.init()}var d={pageX:0,pageY:0,x:0,y:0},f=(y.prototype.refresh=function(){this.pagesMatrix=new c(this.scroll);var e=this.currentPage,t=e.pageX,i=e.pageY,s=this.pagesMatrix.getPageStats(t,i),r=s.x,o=s.y;this.currentPage={pageX:t,pageY:i,x:r,y:o},this.checkSlideLoop()},y.prototype.setCurrentPage=function(e){this.currentPage=e},y.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 i=this.pagesMatrix.getPageStats(e,t);return{pageX:e,pageY:t,x:i.x,y:i.y}},y.prototype.getInitialPage=function(e){void 0===e&&(e=!1);var t=this.loopX?1:0,i=this.loopY?1:0,s=!e&&this.currentPage.pageX||t,r=!e&&this.currentPage.pageY||i,o=this.pagesMatrix.getPageStats(s,r);return{pageX:s,pageY:r,x:o.x,y:o.y}},y.prototype.getExposedPage=function(){var e=i({},this.currentPage);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},y.prototype.getWillChangedPage=function(e){return e=i({},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},y.prototype.fixedPage=function(e,t){for(var i=[],s=0;s<t;s++)i.push(s);return i.unshift(t-1),i.push(0),i[e]},y.prototype.getPageStats=function(){return this.pagesMatrix.getPageStats(this.currentPage.pageX,this.currentPage.pageY)},y.prototype.getValidPageIndex=function(e,t){var i=this.pagesMatrix.pageLengthOfX-1,s=this.pagesMatrix.pageLengthOfY-1,r=0,o=0;return this.loopX&&(e+=1,r+=1,--i),this.loopY&&(t+=1,o+=1,--s),{pageX:e=l(e,r,i),pageY:t=l(t,o,s)}},y.prototype.nextPageIndex=function(){return this.getPageIndexByDirection("positive")},y.prototype.prevPageIndex=function(){return this.getPageIndexByDirection("negative")},y.prototype.getNearestPage=function(e,t){var i=this.pagesMatrix.getNearestPageIndex(e,t),s=i.pageX,r=i.pageY;return{x:this.pagesMatrix.getPageStats(s,0).x,y:this.pagesMatrix.getPageStats(0,r).y,pageX:s,pageY:r}},y.prototype.getPageByDirection=function(e,t,i){var s=e.pageX,r=e.pageY;return s===this.currentPage.pageX&&(s=l(s+t,0,this.pagesMatrix.pageLengthOfX-1)),r===this.currentPage.pageY&&(r=l(r+i,0,this.pagesMatrix.pageLengthOfY-1)),{x:this.pagesMatrix.getPageStats(s,0).x,y:this.pagesMatrix.getPageStats(0,r).y,pageX:s,pageY:r}},y.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){if(0===this.currentPage.pageY)return{pageX:this.currentPage.pageX,pageY:this.pagesMatrix.pageLengthOfY-2};if(this.currentPage.pageY===this.pagesMatrix.pageLengthOfY-1)return{pageX:this.currentPage.pageX,pageY:1}}},y.prototype.getPageIndexByDirection=function(e){var t=this.currentPage.pageX,i=this.currentPage.pageY;return this.slideX&&(t="negative"===e?t-1:t+1),this.slideY&&(i="negative"===e?i-1:i+1),{pageX:t,pageY:i}},y.prototype.checkSlideLoop=function(){this.needLoop=this.slideOptions.loop,1<this.pagesMatrix.pageLengthOfX&&(this.slideX=!0),this.pagesMatrix.pages[0]&&1<this.pagesMatrix.pageLengthOfY&&(this.slideY=!0),this.loopX=this.needLoop&&this.slideX,this.loopY=this.needLoop&&this.slideY,this.slideX&&this.slideY&&e("slide does not support two direction at the same time.")},y);function y(e,t){this.scroll=e,this.slideOptions=t,this.slideX=!1,this.slideY=!1,this.currentPage=i({},d)}var P=[{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 v(e){this.scroll=e,this.resetLooping=!1,this.autoplayTimer=0,this.satisfyInitialization()&&this.init()}return v.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)},v.prototype.init=function(){this.willChangeToPage=i({},d),this.handleBScroll(),this.handleOptions(),this.handleHooks(),this.createPages()},v.prototype.createPages=function(){this.pages=new f(this.scroll,this.options)},v.prototype.handleBScroll=function(){this.scroll.registerType(["slideWillChange"]),this.scroll.proxy(P)},v.prototype.handleOptions=function(){var e=!0===this.scroll.options.slide?{}:this.scroll.options.slide,t={loop:!0,threshold:.1,speed:400,easing:g.bounce,listenFlick:!0,autoplay:!0,interval:3e3};this.options=i(t,e)},v.prototype.handleLoop=function(e){var t=this.options.loop,i=this.scroll.scroller.content,s=i.children;t&&1<s.length&&this.cloneFirstAndLastSlidePage(i,e)},v.prototype.handleHooks=function(){var t=this,e=this.scroll.hooks,i=this.scroll.scroller.hooks,s=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(i,i.eventTypes.beforeRefresh,function(){t.handleLoop(t.prevContent),t.setSlideInlineStyle()}),this.registerHooks(i,i.eventTypes.momentum,this.modifyScrollMetaHandler),this.registerHooks(i,i.eventTypes.scroll,this.scrollHandler),this.registerHooks(i,i.eventTypes.checkClick,this.startPlay),s&&this.registerHooks(i,i.eventTypes.flick,this.flickHandler)},v.prototype.startPlay=function(){var e=this,t=this.options,i=t.interval;t.autoplay&&(clearTimeout(this.autoplayTimer),this.autoplayTimer=window.setTimeout(function(){e.next()},i))},v.prototype.pausePlay=function(){this.options.autoplay&&clearTimeout(this.autoplayTimer)},v.prototype.setSlideInlineStyle=function(){var e=this.scroll.scroller,h=e.content,l=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,i=e.sizeType,s=e.styleType;if(p[t]){for(var r=l[i],o=h.children,a=o.length,n=0;n<a;n++){o[n].style[s]=r+"px"}h.style[s]=r*a+"px"}})},v.prototype.next=function(e,t){var i=this.pages.nextPageIndex(),s=i.pageX,r=i.pageY;this.goTo(s,r,e,t)},v.prototype.prev=function(e,t){var i=this.pages.prevPageIndex(),s=i.pageX,r=i.pageY;this.goTo(s,r,e,t)},v.prototype.goToPage=function(e,t,i,s){var r=this.pages.getValidPageIndex(e,t);this.goTo(r.pageX,r.pageY,i,s)},v.prototype.getCurrentPage=function(){return this.pages.getExposedPage()},v.prototype.nearestPage=function(e,t){var i=this.scroll.scroller,s=i.scrollBehaviorX,r=i.scrollBehaviorY,o=s.maxScrollPos,a=s.minScrollPos,n=r.maxScrollPos,h=r.minScrollPos;return this.pages.getNearestPage(l(e,o,a),l(t,n,h))},v.prototype.satisfyThreshold=function(e,t){var i=this.scroll.scroller,s=i.scrollBehaviorX,r=i.scrollBehaviorY,o=!0;return Math.abs(e-s.absStartPos)<=this.thresholdX&&Math.abs(t-r.absStartPos)<=this.thresholdY&&(o=!1),o},v.prototype.refreshHandler=function(e){var t,i,s=this;this.satisfyInitialization()&&(this.pages.refresh(),this.computeThreshold(),(t=this.prevContent!==e)&&(this.prevContent=e),i=this.pages.getInitialPage(t),this.initialised?(t&&this.pages.setCurrentPage(i),this.goTo(i.pageX,i.pageY,0)):this.registerHooks(this.scroll.hooks,this.scroll.hooks.eventTypes.beforeInitialScrollTo,function(e){s.initialised=!0,e.x=i.x,e.y=i.y}),this.startPlay())},v.prototype.computeThreshold=function(){var e,t,i,s=this.options.threshold;s%1==0?(this.thresholdX=s,this.thresholdY=s):(t=(e=this.pages.getPageStats()).width,i=e.height,this.thresholdX=Math.round(t*s),this.thresholdY=Math.round(i*s))},v.prototype.cloneFirstAndLastSlidePage=function(e,t){this.initialised&&e===t&&this.removeClonedSlidePage(e);var i,s,r,o,a,n=e.children;i=n[n.length-1].cloneNode(!0),(a=(s=e).firstChild)?(r=i,(o=a).parentNode.insertBefore(r,o)):s.appendChild(i),e.appendChild(n[1].cloneNode(!0))},v.prototype.removeClonedSlidePage=function(e){var t=e.children;2<t.length&&(p(e,t[t.length-1]),p(e,t[0]))},v.prototype.modifyCurrentPage=function(e){if(!this.scroll.scroller.animater.forceStopped){var t=this.nearestPage(e.x,e.y);if(this.pages.setCurrentPage(t),this.pageWillChangeTo(t),!this.resetLooping){var i=this.pages.resetLoopPage();return i?(this.resetLooping=!0,this.goTo(i.pageX,i.pageY,0),!0):void 0}this.resetLooping=!1}},v.prototype.goTo=function(e,t,i,s){var r=this.pages.getInternalPage(e,t),o=s||this.options.easing||g.bounce,a=r.x,n=r.y,h=a-this.scroll.scroller.scrollBehaviorX.currentPos,l=n-this.scroll.scroller.scrollBehaviorY.currentPos;(h||l)&&(i=void 0===i?this.getEaseTime(h,l):i,this.scroll.scroller.scrollTo(a,n,i,o))},v.prototype.flickHandler=function(){var e=this.scroll.scroller,t=e.scrollBehaviorX,i=e.scrollBehaviorY,s=t.currentPos,r=t.startPos,o=t.direction,a=i.currentPos,n=i.startPos,h=i.direction,l=this.pages.currentPage,p=l.pageX,g=l.pageY,c=this.getEaseTime(s-r,a-n);this.goTo(p+o,g+h,c)},v.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)},v.prototype.modifyScrollMetaHandler=function(e){var t=this.scroll.scroller,i=t.scrollBehaviorX,s=t.scrollBehaviorY,r=t.animater,o=e.newX,a=e.newY,n=this.satisfyThreshold(o,a)||r.forceStopped?this.pages.getPageByDirection(this.nearestPage(o,a),i.direction,s.direction):this.pages.currentPage;e.time=this.getEaseTime(e.newX-n.x,e.newY-n.y),e.newX=n.x,e.newY=n.y,e.easing=this.options.easing||g.bounce},v.prototype.scrollHandler=function(e){var t,i=e.x,s=e.y;this.satisfyThreshold(i,s)&&(t=this.nearestPage(i,s),this.pageWillChangeTo(t))},v.prototype.pageWillChangeTo=function(e){var t,i,s=this.pages.getWillChangedPage(e);t=this.willChangeToPage,i=s,t.pageX===i.pageX&&t.pageY===i.pageY||(this.willChangeToPage=s,this.scroll.trigger(this.scroll.eventTypes.slideWillChange,this.willChangeToPage))},v.prototype.registerHooks=function(e,t,i){e.on(t,i,this),this.hooksFn.push([e,t,i])},v.prototype.destroy=function(){var e=this.scroll.scroller.content,t=this.options,i=t.loop,s=t.autoplay;i&&this.removeClonedSlidePage(e),s&&clearTimeout(this.autoplayTimer),this.hooksFn.forEach(function(e){var t=e[0],i=e[1],s=e[2];t.eventTypes[i]&&t.off(i,s)}),this.hooksFn.length=0},v.pluginName="slide",v});