diff --git a/bower.json b/bower.json index 22d83e2..7b895b2 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "ngScrollable", - "version": "0.2.3", + "version": "0.2.5", "homepage": "", "authors": [ "Alexander Eichhorn " diff --git a/example/demo.html b/example/demo.html index c2b98a8..c78339e 100644 --- a/example/demo.html +++ b/example/demo.html @@ -18,7 +18,7 @@

ng-scrollable

Features

Supports mouse, wheel, keyboard and touch input sources.

Kinetic scrolling on touch devices.

-

Small. Minified size is 9.8k JS + 1.4k CSS.

+

Small. Minified size is 10k JS + 1.4k CSS.

Pure Angular. No jquery required.

Soft scrolling using CSS3 translate3d and transition.

Responsive and friendly to your layout.

@@ -27,8 +27,8 @@

Features

Download

- ng-scrollable-0.2.4.tar.gz - ng-scrollable-0.2.4.zip + ng-scrollable-0.2.5.tar.gz + ng-scrollable-0.2.5.zip

diff --git a/min/ng-scrollable.min.js b/min/ng-scrollable.min.js index 98da7b0..9e4bb0a 100644 --- a/min/ng-scrollable.min.js +++ b/min/ng-scrollable.min.js @@ -1,7 +1,7 @@ /** * ngScrollable - Superamazing scrollbars for AngularJS - * @version 0.2.4 - built on 2016-03-26 + * @version 0.2.5 - built on 2016-04-06 * @link https://echa.github.io/ng-scrollable/ * @license MIT License, Copyright (c) 2016 Alexander Eichhorn */ -angular.module("ngScrollable",[]).directive("ngScrollable",["$injector",function(a){"use strict";var b=a.get("$document"),c=a.get("$interval"),d=a.get("$timeout"),e=a.get("$window"),f=a.get("$parse"),g=angular.bind,h=angular.extend,i=angular.element,j=(angular.isDefined,"undefined"!=typeof e.ontouchstart),k="transform",l=e.requestAnimationFrame||e.webkitRequestAnimationFrame,m=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;["webkit","moz","o","ms"].every(function(a){var c=a+"Transform",d=b.find("body").eq(0);return"undefined"!=typeof d[0].style[c]?(k=c,!1):!0});var n={id:0,scrollX:"bottom",scrollY:"right",scrollXSlackSpace:0,scrollYSlackSpace:0,scrollXAlways:!1,scrollYAlways:!1,usePadding:!1,useObserver:!0,wheelSpeed:1,minSliderLength:10,useBothWheelAxes:!1,useKeyboard:!0,preventKeyEvents:!0,updateOnResize:!0,kineticTau:325,spyMargin:1};return{restrict:"A",transclude:!0,template:"
",link:function(a,o,p){var q,r,s,t,u,v=h({},n,a.$eval(p.ngScrollable)),w=i(o.children()[0]),x={window:i(e),el:w,content:i(w.children()[0]),barX:i(w.children()[1]),barY:i(w.children()[2]),sliderX:i(i(w.children()[1]).children()[0]),sliderY:i(i(w.children()[2]).children()[0])},y=!1,z=!1,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=null,L=null,M=null,N=null,O=!1,P=!1,Q=!1,R={},S=1,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,_=function(a){return a.toFixed(3)+"px"},aa=function(a,b,c){return Math.max(b,Math.min(a,c))},ba=function(){var b=a.$root?a.$root.$$phase:a.$$phase;"$apply"!==b&&"$digest"!==b&&a.$digest()},ca=function(){var a=A-3;y||v.scrollXAlways?(G=Math.max(v.minSliderLength,parseInt(a*a/C,10)),H=parseInt(F*(a-G)/(C-a),10),H>=a-G?H=a-G:0>H&&(H=0),x.sliderX[0].style[k]="translate3d("+_(H)+",0,0)",x.sliderX[0].style.width=_(G)):(G=H=0,x.sliderX[0].style[k]="translate3d(0,0,0)",x.sliderX[0].style.width="0")},da=function(){var a=B-3;z||v.scrollYAlways?(I=Math.max(v.minSliderLength,parseInt(a*a/D,10)),J=parseInt(E*(a-I)/(D-a),10),J>=a-I?J=a-I:0>J&&(J=0),x.sliderY[0].style[k]="translate3d(0,"+_(J)+",0)",x.sliderY[0].style.height=_(I)):(J=I=0,x.sliderY[0].style[k]="translate3d(0,0,0)",x.sliderY[0].style.height="0")},ea=function(){var a=v.scrollXAlways,b={left:0,width:_(A),display:y||a?"inherit":"none"};switch(v.scrollX){case"bottom":b.bottom=0,x.content[y||a?"addClass":"removeClass"]("scrollable-bottom"),x.barX[y||a?"addClass":"removeClass"]("scrollable-bottom");break;case"top":b.top=0,x.content[y||a?"addClass":"removeClass"]("scrollable-top"),x.barX[y||a?"addClass":"removeClass"]("scrollable-top")}x.barX.css(b),x.sliderX[0].style.display=y||a?"inherit":"none"},fa=function(){var a=v.scrollYAlways,b={top:0,height:_(B),display:z||a?"inherit":"none"};switch(v.scrollY){case"right":b.right=0,x.content[z||a?"addClass":"removeClass"]("scrollable-right"),x.barY[z||a?"addClass":"removeClass"]("scrollable-right");break;case"left":b.left=0,x.content[z||a?"addClass":"removeClass"]("scrollable-left"),x.barY[z||a?"addClass":"removeClass"]("scrollable-left")}x.barY.css(b),x.sliderY[0].style.display=z||a?"inherit":"none"},ga=function(){var b=!1;R.spyX&&(R.spyX(a,parseInt(F,10)),b=!0),R.spyY&&(R.spyY(a,parseInt(E,10)),b=!0),b&&ba()},ha=function(b,c){var d=E,e=F;E=aa(c,0,D-B),F=aa(b,0,C-A),x.content[0].style[k]="translate3d("+_(-F)+","+_(-E)+",0)",a.$applyAsync(ga),B*v.spyMargin>E&&d>=B*v.spyMargin&&a.$broadcast("scrollable.spytop",E,v.id),E>D-B*(v.spyMargin+1)&&D-B*(v.spyMargin+1)>=d&&a.$broadcast("scrollable.spybottom",E,v.id),A*v.spyMargin>F&&e>=A*v.spyMargin&&a.$broadcast("scrollable.spyleft",F,v.id),F>C-A*(v.spyMargin+1)&&C-A*(v.spyMargin+1)>=e&&a.$broadcast("scrollable.spyright",F,v.id)},ia=function(a){y&&(ha(a,E),ca())},ja=function(a){z&&(ha(F,a),da())},ka=function(b,c){A=v.usePadding?x.el[0].clientWidth:x.el[0].offsetWidth,B=v.usePadding?x.el[0].clientHeight:x.el[0].offsetHeight,C=x.content[0].scrollWidth,D=x.content[0].scrollHeight,S=parseFloat(x.window[0].getComputedStyle(x.el[0],null).getPropertyValue("font-size")),"none"!==v.scrollX&&C>A+v.scrollXSlackSpace?y=!0:(ia(0),y=!1),"none"!==v.scrollY&&D>B+v.scrollYSlackSpace?z=!0:(ja(0),z=!1),ea(),fa(),ca(),da(),F+H+G>C&&ia(H),E+J+I>D&&ja(J),c||a.$broadcast("scrollable.dimensions",A,B,C,D,v.id)},la=function(a,b){return a.stopPropagation(),b&&a.preventDefault(),!1},ma=function(a){return a=a.originalEvent||a,a.targetTouches&&a.targetTouches.length>=1?a.targetTouches[0].pageY:a.pageY},na=function(a){return a=a.originalEvent||a,a.targetTouches&&a.targetTouches.length>=1?a.targetTouches[0].pageX:a.pageX},oa=function(){var a,b,c,d;a=Date.now(),b=a-t,t=a,c=F-V,V=F,d=1e3*c/(1+b),T=.8*d+.2*T,c=E-Z,Z=E,d=1e3*c/(1+b),X=.8*d+.2*X},pa=function(){var a,b;U&&(a=Date.now()-t,b=-U*Math.exp(-a/v.kineticTau),b>.5||-.5>b?(ia(W+b),l(pa)):ia(W))},qa=function(){var a,b;Y&&(a=Date.now()-t,b=-Y*Math.exp(-a/v.kineticTau),b>.5||-.5>b?(ja($+b),l(qa)):ja($))},ra=function(a){return L=na(a),K=F,O=!0,T=U=0,V=F,b.on("mousemove",sa),b.on("mouseup",ta),j&&!u&&(u=c(oa,50)),x.el.addClass("active"),j||la(a,!0)},sa=function(a){if(O){var b=na(a)-L,c=j?-b:parseInt(b*(C-A)/(A-G),10);return l(g(null,ia,K+c)),la(a,!0)}},ta=function(a){return O&&(b.off("mousemove",sa),b.off("mouseup",ta),O=!1,x.el.removeClass("active"),K=L=null),u&&(c.cancel(u),u=null),(T>10||-10>T)&&(U=.8*T,W=Math.round(F+U),t=Date.now(),l(pa)),j||la(a,!0)},ua=function(a){return N=ma(a),M=E,P=!0,X=Y=0,Z=E,b.on("mousemove",va),b.on("mouseup",wa),j&&!u&&(u=c(oa,50)),x.el.addClass("active"),j||la(a,!0)},va=function(a){if(P){var b=ma(a)-N,c=j?-b:parseInt(b*(D-B)/(B-I),10);return l(g(null,ja,M+c)),j||la(a,!0)}},wa=function(a){return P&&(b.off("mousemove",va),b.off("mouseup",wa),P=!1,x.el.removeClass("active"),M=N=null),u&&(c.cancel(u),u=null),(X>10||-10>X)&&(Y=.8*X,$=Math.round(E+Y),t=Date.now(),l(qa)),j||la(a,!0)},xa=function(a){var b=parseInt(G/2,10),c=a.clientX-x.barX[0].getBoundingClientRect().left-b,d=A-G,e=aa(c/d,0,1);l(g(null,ia,(C-A)*e))},ya=function(a){var b=parseInt(I/2,10),c=a.clientY-x.barY[0].getBoundingClientRect().top-b,d=B-I,e=aa(c/d,0,1);l(g(null,ja,(D-B)*e))},za=function(){Q=!0},Aa=function(){Q=!1},Ba=function(a){var c=0,d=0,e=30;if(!(!Q||b[0].activeElement.isContentEditable||"INPUT"===b[0].activeElement.nodeName||a.altKey||a.ctrlKey||a.metaKey)){switch(a.which){case 37:c=-e;break;case 38:d=e;break;case 39:c=e;break;case 40:d=-e;break;case 33:d=B;break;case 32:case 34:d=-B;break;case 35:z&&!y?d=-D:c=B;break;case 36:z&&!y?d=D:c=-B;break;default:return}l(g(null,ja,E-d)),l(g(null,ia,F+c)),v.preventKeyEvents&&a.preventDefault()}},Ca=function(a){var b=a.explicitOriginalTarget||a.target;if(!b)return!1;if(b.isContentEditable)return b.scrollHeight>b.clientHeight+b.clientTop+10;for(;b;){if(b.className&&b.className.indexOf("scrollable-ignore")>-1)return!0;b=b.parentNode}return!1},Da=function(){var a=Date.now()-s;500>a?r=d(Da,500-a):(x.el.removeClass("active"),r=null)},Ea=function(a){return 0>=F+a||F+a>=C-A},Fa=function(a){return 0>=E+a||E+a>=D-B},Ga=function(a){if(a=a.originalEvent||a,!Ca(a)){var b=a.deltaMode?S:1,c=a.deltaX*b*v.wheelSpeed,e=a.deltaY*b*v.wheelSpeed,f=!0;if(a.shiftKey){var h=e;e=c,c=h}s=Date.now(),r||(x.el.addClass("active"),r=d(Da,500)),v.useBothWheelAxes?z&&!y?e?(l(g(null,ja,E+e)),f=!Fa(e)):(l(g(null,ja,E+c)),f=!Fa(c)):y&&!z&&(c?(l(g(null,ia,F+c)),f=!Ea(c)):(l(g(null,ia,F+e)),f=!Ea(e))):(l(g(null,ja,E+e)),l(g(null,ia,F+c)),z&&(f=!Fa(0))),f&&la(a,!0)}},Ha=function(){if(v.useObserver&&m){var a={childList:!0,subtree:!0};q=new m(function(){l(ka)}),q.observe(x.content[0],a)}v.updateOnResize&&x.window.on("resize",ka),"none"!==v.scrollX&&(x.sliderX.on("click",la),x.barX.on("click",xa),x.sliderX.on("mousedown",ra),j&&(x.el.on("touchstart",ra),x.el.on("touchmove",sa),x.el.on("touchend",ta))),"none"!==v.scrollY&&(x.sliderY.on("click",la),x.barY.on("click",ya),x.sliderY.on("mousedown",ua),j&&(x.el.on("touchstart",ua),x.el.on("touchmove",va),x.el.on("touchend",wa))),x.el.on("wheel",Ga),v.useKeyboard&&(x.el.on("mouseenter",za),x.el.on("mouseleave",Aa),b.on("keydown",Ba))},Ia=function(){q&&(q.disconnect(),q=null),v.updateOnResize&&x.window.off("resize",ka),x.sliderX.off("click",la),x.barX.off("click",xa),x.sliderY.off("click",la),x.barY.off("click",ya),j&&(x.el.off("touchstart",ra),x.el.off("touchmove",sa),x.el.off("touchend",ta),x.el.off("touchstart",ua),x.el.off("touchmove",va),x.el.off("touchend",wa)),x.sliderX.off("mousedown",ra),b.off("mousemove",sa),b.off("mouseup",ta),x.sliderY.off("mousedown",ua),b.off("mousemove",va),b.off("mouseup",wa),v.useKeyboard&&(x.el.off("mouseenter",za),x.el.off("mouseleave",Aa),b.off("keydown",Ba)),x.el.off("wheel",Ga)};a.$on("content.reload",function(a,b){Ia(),d(function(){x.el=i(o.children()[0]),x.content=i(x.el.children()[0]),Ha(),ka(a,b)})}),a.$on("content.changed",function(a,b,c){b=b||100,d(function(){ka(a,c)},b),a.preventDefault()}),a.$on("scrollable.scroll.left",function(){a.$applyAsync(function(){ia(0)})}),a.$on("scrollable.scroll.right",function(){a.$applyAsync(function(){ia(C)})}),a.$on("scrollable.scroll.top",function(){a.$applyAsync(function(){ja(0)})}),a.$on("scrollable.scroll.bottom",function(){a.$applyAsync(function(){ja(D)})}),a.$on("$destroy",function(){d.cancel(r),Ia()}),Ha(),ka(),angular.forEach(["spyX","spyY"],function(b){p[b]&&(R[b]=f(p[b]).assign,a.$watch(p[b],function(a){switch(a=a||0,b){case"spyX":ia(a);break;case"spyY":ja(a)}}))})}}}]); \ No newline at end of file +angular.module("ngScrollable",[]).directive("ngScrollable",["$injector",function(a){"use strict";var b=a.get("$document"),c=a.get("$interval"),d=a.get("$timeout"),e=a.get("$window"),f=a.get("$parse"),g=angular.bind,h=angular.extend,i=angular.element,j=(angular.isDefined,"undefined"!=typeof e.ontouchstart),k="transform",l=e.requestAnimationFrame||e.webkitRequestAnimationFrame,m=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;["webkit","moz","o","ms"].every(function(a){var c=a+"Transform",d=b.find("body").eq(0);return"undefined"!=typeof d[0].style[c]?(k=c,!1):!0});var n={id:0,scrollX:"bottom",scrollY:"right",scrollXSlackSpace:0,scrollYSlackSpace:0,scrollXAlways:!1,scrollYAlways:!1,usePadding:!1,useObserver:!0,wheelSpeed:1,minSliderLength:10,useBothWheelAxes:!1,useKeyboard:!0,preventKeyEvents:!0,updateOnResize:!0,kineticTau:325,spyMargin:1};return{restrict:"A",transclude:!0,template:"
",link:function(a,o,p){var q,r,s,t,u,v=h({},n,a.$eval(p.ngScrollable)),w=i(o.children()[0]),x={window:i(e),el:w,content:i(w.children()[0]),barX:i(w.children()[1]),barY:i(w.children()[2]),sliderX:i(i(w.children()[1]).children()[0]),sliderY:i(i(w.children()[2]).children()[0])},y=!1,z=!1,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=null,L=null,M=null,N=null,O=!1,P=!1,Q=!1,R={},S=1,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,_=function(a){return a.toFixed(3)+"px"},aa=function(a,b,c){return Math.max(b,Math.min(a,c))},ba=function(){var b=a.$root?a.$root.$$phase:a.$$phase;"$apply"!==b&&"$digest"!==b&&a.$digest()},ca=function(){var a=A-3;y||v.scrollXAlways?(G=Math.max(v.minSliderLength,parseInt(a*a/C,10)),H=parseInt(F*(a-G)/(C-a),10),H>=a-G?H=a-G:0>H&&(H=0),x.sliderX[0].style[k]="translate3d("+_(H)+",0,0)",x.sliderX[0].style.width=_(G)):(G=H=0,x.sliderX[0].style[k]="translate3d(0,0,0)",x.sliderX[0].style.width="0")},da=function(){var a=B-3;z||v.scrollYAlways?(I=Math.max(v.minSliderLength,parseInt(a*a/D,10)),J=parseInt(E*(a-I)/(D-a),10),J>=a-I?J=a-I:0>J&&(J=0),x.sliderY[0].style[k]="translate3d(0,"+_(J)+",0)",x.sliderY[0].style.height=_(I)):(J=I=0,x.sliderY[0].style[k]="translate3d(0,0,0)",x.sliderY[0].style.height="0")},ea=function(){var a=v.scrollXAlways,b={left:0,width:_(A),display:y||a?"inherit":"none"};switch(v.scrollX){case"bottom":b.bottom=0,x.content[y||a?"addClass":"removeClass"]("scrollable-bottom"),x.barX[y||a?"addClass":"removeClass"]("scrollable-bottom");break;case"top":b.top=0,x.content[y||a?"addClass":"removeClass"]("scrollable-top"),x.barX[y||a?"addClass":"removeClass"]("scrollable-top")}x.barX.css(b),x.sliderX[0].style.display=y||a?"inherit":"none"},fa=function(){var a=v.scrollYAlways,b={top:0,height:_(B),display:z||a?"inherit":"none"};switch(v.scrollY){case"right":b.right=0,x.content[z||a?"addClass":"removeClass"]("scrollable-right"),x.barY[z||a?"addClass":"removeClass"]("scrollable-right");break;case"left":b.left=0,x.content[z||a?"addClass":"removeClass"]("scrollable-left"),x.barY[z||a?"addClass":"removeClass"]("scrollable-left")}x.barY.css(b),x.sliderY[0].style.display=z||a?"inherit":"none"},ga=function(){var b=!1;R.spyX&&(R.spyX(a,parseInt(F,10)),b=!0),R.spyY&&(R.spyY(a,parseInt(E,10)),b=!0),b&&ba()},ha=function(b,c){var d=E,e=F;E=aa(c,0,D-B),F=aa(b,0,C-A),x.content[0].style[k]="translate3d("+_(-F)+","+_(-E)+",0)",a.$applyAsync(ga),B*v.spyMargin>E&&d>=B*v.spyMargin&&a.$broadcast("scrollable.spytop",E,v.id),E>D-B*(v.spyMargin+1)&&D-B*(v.spyMargin+1)>=d&&a.$broadcast("scrollable.spybottom",E,v.id),A*v.spyMargin>F&&e>=A*v.spyMargin&&a.$broadcast("scrollable.spyleft",F,v.id),F>C-A*(v.spyMargin+1)&&C-A*(v.spyMargin+1)>=e&&a.$broadcast("scrollable.spyright",F,v.id)},ia=function(a){y&&(ha(a,E),ca())},ja=function(a){z&&(ha(F,a),da())},ka=function(b,c){A=v.usePadding?x.el[0].clientWidth:x.el[0].offsetWidth,B=v.usePadding?x.el[0].clientHeight:x.el[0].offsetHeight,C=x.content[0].scrollWidth,D=x.content[0].scrollHeight,S=parseFloat(x.window[0].getComputedStyle(x.el[0],null).getPropertyValue("font-size")),"none"!==v.scrollX&&C>A+v.scrollXSlackSpace?y=!0:(ia(0),y=!1),"none"!==v.scrollY&&D>B+v.scrollYSlackSpace?z=!0:(ja(0),z=!1),ea(),fa(),ca(),da(),F+H+G>C&&ia(H),E+J+I>D&&ja(J),c||a.$broadcast("scrollable.dimensions",A,B,C,D,v.id)},la=function(a,b){return a.stopPropagation(),b&&a.preventDefault(),!1},ma=function(a){return a=a.originalEvent||a,a.targetTouches&&a.targetTouches.length>=1?a.targetTouches[0].pageY:a.pageY},na=function(a){return a=a.originalEvent||a,a.targetTouches&&a.targetTouches.length>=1?a.targetTouches[0].pageX:a.pageX},oa=function(){var a,b,c,d;a=Date.now(),b=a-t,t=a,c=F-V,V=F,d=1e3*c/(1+b),T=.8*d+.2*T,c=E-Z,Z=E,d=1e3*c/(1+b),X=.8*d+.2*X},pa=function(){var a,b;U&&(a=Date.now()-t,b=-U*Math.exp(-a/v.kineticTau),b>.5||-.5>b?(ia(W+b),l(pa)):ia(W))},qa=function(){var a,b;Y&&(a=Date.now()-t,b=-Y*Math.exp(-a/v.kineticTau),b>.5||-.5>b?(ja($+b),l(qa)):ja($))},ra=function(a){return L=na(a),K=F,O=!0,T=U=0,V=F,b.on("mousemove",sa),b.on("mouseup",ta),j&&!u&&(u=c(oa,50)),x.el.addClass("active"),j||la(a,!0)},sa=function(a){if(O){var b=na(a)-L,c=j?-b:parseInt(b*(C-A)/(A-G),10);return l(g(null,ia,K+c)),la(a,!0)}},ta=function(a){return O&&(b.off("mousemove",sa),b.off("mouseup",ta),O=!1,x.el.removeClass("active"),K=L=null),u&&(c.cancel(u),u=null),(T>10||-10>T)&&(U=.8*T,W=Math.round(F+U),t=Date.now(),l(pa)),j||la(a,!0)},ua=function(a){return N=ma(a),M=E,P=!0,X=Y=0,Z=E,b.on("mousemove",va),b.on("mouseup",wa),j&&!u&&(u=c(oa,50)),x.el.addClass("active"),j||la(a,!0)},va=function(a){if(P){var b=ma(a)-N,c=j?-b:parseInt(b*(D-B)/(B-I),10);return l(g(null,ja,M+c)),j||la(a,!0)}},wa=function(a){return P&&(b.off("mousemove",va),b.off("mouseup",wa),P=!1,x.el.removeClass("active"),M=N=null),u&&(c.cancel(u),u=null),(X>10||-10>X)&&(Y=.8*X,$=Math.round(E+Y),t=Date.now(),l(qa)),j||la(a,!0)},xa=function(a){var b=parseInt(G/2,10),c=a.clientX-x.barX[0].getBoundingClientRect().left-b,d=A-G,e=aa(c/d,0,1);l(g(null,ia,(C-A)*e))},ya=function(a){var b=parseInt(I/2,10),c=a.clientY-x.barY[0].getBoundingClientRect().top-b,d=B-I,e=aa(c/d,0,1);l(g(null,ja,(D-B)*e))},za=function(){Q=!0},Aa=function(){Q=!1},Ba=function(a){var c=0,d=0,e=30;if(!(!Q||b[0].activeElement.isContentEditable||"INPUT"===b[0].activeElement.nodeName||a.altKey||a.ctrlKey||a.metaKey)){switch(a.which){case 37:c=-e;break;case 38:d=e;break;case 39:c=e;break;case 40:d=-e;break;case 33:d=B;break;case 32:case 34:d=-B;break;case 35:z&&!y?d=-D:c=B;break;case 36:z&&!y?d=D:c=-B;break;default:return}l(g(null,ja,E-d)),l(g(null,ia,F+c)),v.preventKeyEvents&&a.preventDefault()}},Ca=function(a){var b=a.explicitOriginalTarget||a.target;if(!b)return!1;if(b.isContentEditable)return b.scrollHeight>b.clientHeight+b.clientTop+10;for(;b;){if(b.className&&"string"==typeof b.className&&b.className.indexOf("scrollable-ignore")>-1)return!0;b=b.parentNode}return!1},Da=function(){var a=Date.now()-s;500>a?r=d(Da,500-a):(x.el.removeClass("active"),r=null)},Ea=function(a){return 0>=F+a||F+a>=C-A},Fa=function(a){return 0>=E+a||E+a>=D-B},Ga=function(a){if(a=a.originalEvent||a,!Ca(a)){var b=a.deltaMode?S:1,c=a.deltaX*b*v.wheelSpeed,e=a.deltaY*b*v.wheelSpeed,f=!0;if(a.shiftKey){var h=e;e=c,c=h}s=Date.now(),r||(x.el.addClass("active"),r=d(Da,500)),v.useBothWheelAxes?z&&!y?e?(l(g(null,ja,E+e)),f=!Fa(e)):(l(g(null,ja,E+c)),f=!Fa(c)):y&&!z&&(c?(l(g(null,ia,F+c)),f=!Ea(c)):(l(g(null,ia,F+e)),f=!Ea(e))):(l(g(null,ja,E+e)),l(g(null,ia,F+c)),z&&(f=!Fa(0))),f&&la(a,!0)}},Ha=function(a){var b=x.el[0].scrollTop,c=x.el[0].scrollLeft;b&&l(g(null,ja,E+b+2)),c&&l(g(null,ia,F+c+2)),x.el[0].scrollTop=x.el[0].scrollLeft=0,la(a,!0)},Ia=function(){if(v.useObserver&&m){var a={childList:!0,subtree:!0};q=new m(function(){l(ka)}),q.observe(x.content[0],a)}v.updateOnResize&&x.window.on("resize",ka),"none"!==v.scrollX&&(x.sliderX.on("click",la),x.barX.on("click",xa),x.sliderX.on("mousedown",ra),j&&(x.el.on("touchstart",ra),x.el.on("touchmove",sa),x.el.on("touchend",ta))),"none"!==v.scrollY&&(x.sliderY.on("click",la),x.barY.on("click",ya),x.sliderY.on("mousedown",ua),j&&(x.el.on("touchstart",ua),x.el.on("touchmove",va),x.el.on("touchend",wa))),x.el.on("wheel",Ga),x.el.on("scroll",Ha),v.useKeyboard&&(x.el.on("mouseenter",za),x.el.on("mouseleave",Aa),b.on("keydown",Ba))},Ja=function(){q&&(q.disconnect(),q=null),v.updateOnResize&&x.window.off("resize",ka),x.sliderX.off("click",la),x.barX.off("click",xa),x.sliderY.off("click",la),x.barY.off("click",ya),j&&(x.el.off("touchstart",ra),x.el.off("touchmove",sa),x.el.off("touchend",ta),x.el.off("touchstart",ua),x.el.off("touchmove",va),x.el.off("touchend",wa)),x.sliderX.off("mousedown",ra),b.off("mousemove",sa),b.off("mouseup",ta),x.sliderY.off("mousedown",ua),b.off("mousemove",va),b.off("mouseup",wa),v.useKeyboard&&(x.el.off("mouseenter",za),x.el.off("mouseleave",Aa),b.off("keydown",Ba)),x.el.off("wheel",Ga),x.el.off("scroll",Ha)};a.$on("content.reload",function(a,b){Ja(),d(function(){x.el=i(o.children()[0]),x.content=i(x.el.children()[0]),Ia(),ka(a,b)})}),a.$on("content.changed",function(a,b,c){b=b||100,d(function(){ka(a,c)},b),a.preventDefault()}),a.$on("scrollable.scroll.left",function(){a.$applyAsync(function(){ia(0)})}),a.$on("scrollable.scroll.right",function(){a.$applyAsync(function(){ia(C)})}),a.$on("scrollable.scroll.top",function(){a.$applyAsync(function(){ja(0)})}),a.$on("scrollable.scroll.bottom",function(){a.$applyAsync(function(){ja(D)})}),a.$on("$destroy",function(){d.cancel(r),Ja()}),Ia(),ka(),angular.forEach(["spyX","spyY"],function(b){p[b]&&(R[b]=f(p[b]).assign,a.$watch(p[b],function(a){switch(a=a||0,b){case"spyX":ia(a);break;case"spyY":ja(a)}}))})}}}]); \ No newline at end of file diff --git a/package.json b/package.json index b723a85..6492eb9 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "author": "Alexander Eichhorn ", "name": "ngScrollable", "description": "Superamazing scrollbars for AngularJS", - "version": "0.2.4", + "version": "0.2.5", "license": "MIT License", "homepage": "https://echa.github.io/ng-scrollable/", "repository": { diff --git a/src/ng-scrollable.js b/src/ng-scrollable.js index 3f802da..9e082d1 100644 --- a/src/ng-scrollable.js +++ b/src/ng-scrollable.js @@ -654,6 +654,18 @@ angular.module('ngScrollable', []) } }, + handleScroll = function (e) { + var deltaY = dom.el[0].scrollTop, deltaX = dom.el[0].scrollLeft; + if (deltaY) { + $$rAF(bind(null, scrollY, contentTop + deltaY + 2)); + } + if (deltaX) { + $$rAF(bind(null, scrollX, contentLeft + deltaX + 2)); + } + dom.el[0].scrollTop = dom.el[0].scrollLeft = 0; + stop(e, true); + }, + registerHandlers = function () { // use MutationObserver @@ -719,6 +731,9 @@ angular.module('ngScrollable', []) // mouse wheel dom.el.on('wheel', handleWheel); + // scroll event (form tabbing) + dom.el.on( 'scroll', handleScroll ); + // keyboard if (config.useKeyboard) { dom.el.on('mouseenter', hoverOn); @@ -775,6 +790,9 @@ angular.module('ngScrollable', []) // mouse wheel dom.el.off('wheel', handleWheel); + // scroll event + dom.el.off( 'scroll', handleScroll); + };