-
Notifications
You must be signed in to change notification settings - Fork 22
/
Copy pathpull-element.min.js
8 lines (8 loc) · 6.08 KB
/
pull-element.min.js
1
2
3
4
5
6
7
8
/*!
* @license
* pull-element.js v1.1.4
* (c) 2017 Jade Gu
* Released under the MIT License.
* https://github.com/Lucifier129/pull-element
*/
!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?module.exports=i():"function"==typeof define&&define.amd?define(i):t.PullElement=i()}(this,function(){"use strict";function t(t){for(var i=arguments,n=i.length,e=1;e<n;e++){var o=i[e];for(var r in o)t[r]=o[r]}return t}function i(t){return"number"==typeof t&&!isNaN(t)}function n(t){return"function"==typeof t}function e(t,i){var n,e,o,r,s=t.scrollWidth,l=t.scrollHeight;if(i){var a=document.documentElement,c=document.body;o=a.clientWidth,r=a.clientHeight,n=c.scrollTop||a.scrollTop,e=c.scrollLeft||a.scrollLeft}else o=t.offsetWidth,r=t.offsetHeight,n=t.scrollTop,e=t.scrollLeft;return{isScrollTopEnd:n<=0,isScrollBottomEnd:r+n>=l,isScrollLeftEnd:e<=0,isScrollRightEnd:o+e>=s}}function o(t){return"string"==typeof t?document.querySelector(t):t}function r(t){return"string"==typeof t?Array.prototype.slice.call(document.querySelectorAll(t)):t.length?Array.prototype.slice.call(t):[t]}function s(t,i,n,e){t.addEventListener(i,n,e)}function l(t,i,n){t.removeEventListener(i,n)}function a(t){var i=t.touches[0];return{x:i.clientX,y:i.clientY}}function c(t,e){return n(e)?e(t):i(e)?t/e:t}function u(t,i){var n="translate("+t+"px,"+i+"px) translateZ(0)";return{transform:n,webkitTransform:n}}function h(i){this.options=t({},y,i),this.state=t({},v),this.target=null,this.scroller=null,this.trigger=null,this.transitionStyle=null,this.isTouching=!1,this.isPreventDefault=!1,this.isWaiting=!1,this.isGlobalScroller=!1,this.transitionDuration=0,this.handleTouchStart=this.handleTouchStart.bind(this),this.handleTouchMove=this.handleTouchMove.bind(this),this.handleTouchEnd=this.handleTouchEnd.bind(this)}var d={passive:!1},f={transition:"",transform:"",webkitTransform:"",webkitTransition:""},p={transition:"",webkitTransition:""},g={pullDown:"onPullDown",pullUp:"onPullUp",pullRight:"onPullRight",pullLeft:"onPullLeft"},m={pullDown:"isScrollTopEnd",pullUp:"isScrollBottomEnd",pullRight:"isScrollLeftEnd",pullLeft:"isScrollRightEnd"},T={action:"",axis:"",translateX:0,translateY:0},v=t({isScrollTopEnd:!0,isScrollLeftEnd:!0,isScrollBottomEnd:!0,isScrollRightEnd:!0,clientX:0,clientY:0},T),y={target:"body",scroller:"",trigger:"",damping:1.6,wait:!0,pullUp:!1,pullDown:!1,pullLeft:!1,pullRight:!1,detectScroll:!1,detectScrollOnStart:!1,detectBoundary:!1,stopPropagation:!1,drag:!1,transitionProperty:"transform",transitionDuration:"0.3s",transitionTimingFunction:"ease-out"},S="function"==typeof Promise;return t(h.prototype,{init:function(){var t=this.options,i=o(t.target),n=t.scroller?o(t.scroller):i,e=t.trigger?r(t.trigger):[i];this.target=i,this.scroller=n,this.trigger=e,this.isGlobalScroller=n===document.body||n===window||n===document.documentElement,this.transitionStyle={transitionProperty:t.transitionProperty,transitionDuration:t.transitionDuration,transitionTimingFunction:t.transitionTimingFunction,webkitTransitionProperty:t.transitionProperty,webkitTransitionDuration:t.transitionDuration,webkitTransitionTimingFunction:t.transitionTimingFunction};var s=Number(t.transitionDuration.replace(/[^.\d]+/g,""));/[\d\.]+s$/.test(t.transitionDuration)&&(s*=1e3),this.transitionDuration=s,this.enable()},destroy:function(){this.disable()},setTranslate:function(i,n){var e=this.state;e.translateX=i,e.translateY=n,t(this.target.style,p,u(i,n))},animateTo:function(i,n,e){var o=this.state,r=this.target,s=this.transitionDuration,l=this.transitionStyle,a=u(i,n);o.translateX=i,o.translateY=n;var c=function(i){t(r.style,l,a),setTimeout(i,s)};if(S)return new Promise(c).then(e);c(e)},animateToOrigin:function(i){var n=this,e=function(){t(n.target.style,f),t(n.state,T),n.isWaiting=!1,i&&i()};return this.animateTo(0,0,e)},enable:function(){for(var t=0;t<this.trigger.length;t++)s(this.trigger[t],"touchstart",this.handleTouchStart);s(document,"touchmove",this.handleTouchMove,d),s(document,"touchend",this.handleTouchEnd),s(document,"touchcancel",this.handleTouchEnd)},disable:function(){for(var t=0;t<this.trigger.length;t++)l(this.trigger[t],"touchstart",this.handleTouchStart);l(document,"touchmove",this.handleTouchMove),l(document,"touchend",this.handleTouchEnd),l(document,"touchcancel",this.handleTouchEnd)},preventDefault:function(){this.isPreventDefault=!0},getScrollInfo:function(){return e(this.scroller,this.isGlobalScroller)},isActiveAction:function(t){var i=this.options,n=g[t];return i[n]||i[n+"End"]||i[t]},emit:function(t,i){var e=this.options[t];n(e)&&e.call(this,i)},detectBoundary:function(t,i,n,e,o){var r=!1;return"pullDown"===t?o<=0&&n<=0&&(r=!0):"pullUp"===t?o>=0&&n>=0&&(r=!0):"pullLeft"==t?e>=0&&i>=0&&(r=!0):"pullRight"===t&&e<=0&&i<=0&&(r=!0),!!r&&(this.handleTouchEnd(),!0)},handleTouchStart:function(i){if(!this.isTouching&&!this.isWaiting){var n=this.options,e=a(i);t(this.state,{clientX:e.x,clientY:e.y,axis:"",action:""}),(n.detectScroll||n.detectScrollOnStart)&&t(this.state,this.getScrollInfo()),n.stopPropagation&&i.stopPropagation(),this.isTouching=!0}},handleTouchMove:function(i){if(this.isTouching){var n=a(i),e=this.options,o=this.state,r=n.x,s=n.y,l=r-o.clientX,u=s-o.clientY,h=o.translateX,d=o.translateY,f=o.axis,p=o.action;if(f||(f=Math.abs(u)>=Math.abs(l)?"y":"x"),p||("y"===f?u>0?p="pullDown":u<0&&(p="pullUp"):"x"===f&&(l>0?p="pullRight":l<0&&(p="pullLeft"))),e.detectBoundary){if(this.detectBoundary(p,l,u,h,d))return}var T=this.isActiveAction(p);T&&e.detectScroll&&!o[m[p]]&&(t(o,this.getScrollInfo()),o[m[p]]&&(l=0,u=0));var v=T&&o[m[p]];if(v&&(h+=c(l,e.damping),d+=c(u,e.damping)),t(o,{clientX:r,clientY:s,translateX:h,translateY:d,action:p,axis:f}),v){if(e.drag||("y"===f?h=0:"x"===f&&(d=0)),this.emit(g[p],{translateX:h,translateY:d}),this.isPreventDefault)return void(this.isPreventDefault=!1);e.wait&&(this.isWaiting=!0),i.preventDefault(),this.setTranslate(h,d)}}},handleTouchEnd:function(){if(this.isTouching){this.isTouching=!1;var t=this.state,i=t.action;if(this.isActiveAction(i)&&t[m[i]]){if(this.emit(g[i]+"End",{translateX:t.translateX,translateY:t.translateY}),this.isPreventDefault)return void(this.isPreventDefault=!1);this.animateToOrigin()}}}}),h});