diff --git a/angular-scroll.js b/angular-scroll.js index 766013b..b89bb46 100644 --- a/angular-scroll.js +++ b/angular-scroll.js @@ -8,11 +8,18 @@ var duScrollDefaultEasing = function (x) { return 1-Math.pow((1-x)*2, 2)/2; }; -angular.module('duScroll', ['duScroll.scrollspy', 'duScroll.requestAnimation', 'duScroll.smoothScroll', 'duScroll.scrollContainer', 'duScroll.scrollHelpers']).value('duScrollDuration', 1000).value('duScrollEasing', duScrollDefaultEasing); +angular.module('duScroll', [ + 'duScroll.scrollspy', + 'duScroll.requestAnimation', + 'duScroll.smoothScroll', + 'duScroll.scrollContainer', + 'duScroll.scrollHelpers' +]).value('duScrollDuration', 350) + .value('duScrollEasing', duScrollDefaultEasing); angular.module('duScroll.scrollHelpers', []). -run(function($window, requestAnimation, duScrollEasing) { +run(function($window, cancelAnimation, requestAnimation, duScrollEasing) { var proto = angular.element.prototype; this.$get = function() { return proto; @@ -45,6 +52,7 @@ run(function($window, requestAnimation, duScrollEasing) { el.scrollTop = top; }; + var scrollAnimation; proto.scrollToAnimated = function(left, top, duration, easing) { if(duration && !easing) { easing = duScrollEasing; @@ -56,18 +64,29 @@ run(function($window, requestAnimation, duScrollEasing) { if(!deltaLeft && !deltaTop) return; - var frame = 0, frames = Math.ceil(duration/60); + var startTime = null; + if(scrollAnimation) { + cancelAnimation(scrollAnimation); + } + var el = this; + + var animationStep = function(timestamp) { + if (startTime === null) { + startTime = timestamp; + } - var animate = function() { - frame++; - var percent = (frame === frames ? 1 : easing(frame/frames)); - this.scrollTo( + var progress = timestamp - startTime; + var percent = (progress >= duration ? 1 : easing(progress/duration)); + + el.scrollTo( startLeft + Math.ceil(deltaLeft * percent), startTop + Math.ceil(deltaTop * percent) ); - if(framea?Math.pow(2*a,2)/2:1-Math.pow(2*(1-a),2)/2};angular.module("duScroll",["duScroll.scrollspy","duScroll.requestAnimation","duScroll.smoothScroll","duScroll.scrollContainer","duScroll.scrollHelpers"]).value("duScrollDuration",1e3).value("duScrollEasing",duScrollDefaultEasing),angular.module("duScroll.scrollHelpers",[]).run(["$window","requestAnimation","duScrollEasing",function(a,b,c){var d=angular.element.prototype;this.$get=function(){return d};var e=function(a){return"undefined"!=typeof HTMLDocument&&a instanceof HTMLDocument||a.nodeType&&a.nodeType===a.DOCUMENT_NODE},f=function(a){return"undefined"!=typeof HTMLElement&&a instanceof HTMLElement||a.nodeType&&a.nodeType===a.ELEMENT_NODE},g=function(a){return f(a)||e(a)?a:a[0]};d.scrollTo=function(b,c,d){if(angular.isElement(b))return this.scrollToElement(b,0,c,d);if(d)return this.scrollToAnimated.apply(this,arguments);var f=g(this);return e(f)?a.scrollTo(b,c):(f.scrollLeft=b,f.scrollTop=c,void 0)},d.scrollToAnimated=function(a,d,e,f){e&&!f&&(f=c);var g=this.scrollLeft(),h=this.scrollTop(),i=Math.round(a-g),j=Math.round(d-h);if(i||j){var k=0,l=Math.ceil(e/60),m=function(){k++;var a=k===l?1:f(k/l);this.scrollTo(g+Math.ceil(i*a),h+Math.ceil(j*a)),l>k&&b(m)}.bind(this);m()}},d.scrollToElement=function(a,b,c,d){var e=g(this),h=this.scrollTop()+g(a).getBoundingClientRect().top-b;f(e)&&(h-=e.getBoundingClientRect().top),this.scrollTo(0,h,c,d)},d.scrollLeft=function(b,c,d){if(angular.isNumber(b))return this.scrollTo(b,this.scrollTop(),c,d);var f=g(this);return e(f)?a.scrollX||document.documentElement.scrollLeft||document.body.scrollLeft:f.scrollLeft},d.scrollTop=function(b,c,d){if(angular.isNumber(b))return this.scrollTo(this.scrollTop(),b,c,d);var f=g(this);return e(f)?a.scrollY||document.documentElement.scrollTop||document.body.scrollTop:f.scrollTop}}]),angular.module("duScroll.requestAnimation",[]).factory("requestAnimation",["$window","$timeout",function(a,b){return a.requestAnimationFrame||a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame||a.msRequestAnimationFrame||function(a){b(a,1e3/60)}}]),angular.module("duScroll.spyAPI",["duScroll.scrollContainerAPI"]).factory("spyAPI",["$rootScope","scrollContainerAPI",function(a,b){var c=function(b){return function(){var c=b.container,d=c[0],e=0;d instanceof HTMLElement&&(e=d.getBoundingClientRect().top);var f,g,h,i,j,k;for(i=b.spies,g=b.currentlyActive,h=void 0,f=0;ft?Math.pow(2*t,2)/2:1-Math.pow(2*(1-t),2)/2};angular.module("duScroll",["duScroll.scrollspy","duScroll.requestAnimation","duScroll.smoothScroll","duScroll.scrollContainer","duScroll.scrollHelpers"]).value("duScrollDuration",350).value("duScrollEasing",duScrollDefaultEasing),angular.module("duScroll.scrollHelpers",[]).run(["$window","cancelAnimation","requestAnimation","duScrollEasing",function(t,e,n,r){var o=angular.element.prototype;this.$get=function(){return o};var l=function(t){return"undefined"!=typeof HTMLDocument&&t instanceof HTMLDocument||t.nodeType&&t.nodeType===t.DOCUMENT_NODE},i=function(t){return"undefined"!=typeof HTMLElement&&t instanceof HTMLElement||t.nodeType&&t.nodeType===t.ELEMENT_NODE},c=function(t){return i(t)||l(t)?t:t[0]};o.scrollTo=function(e,n,r){if(angular.isElement(e))return this.scrollToElement(e,0,n,r);if(r)return this.scrollToAnimated.apply(this,arguments);var o=c(this);return l(o)?t.scrollTo(e,n):(o.scrollLeft=e,void(o.scrollTop=n))};var u;o.scrollToAnimated=function(t,o,l,i){l&&!i&&(i=r);var c=this.scrollLeft(),a=this.scrollTop(),s=Math.round(t-c),d=Math.round(o-a);if(s||d){var f=null;u&&e(u);var p=this,m=function(t){null===f&&(f=t);var e=t-f,r=e>=l?1:i(e/l);p.scrollTo(c+Math.ceil(s*r),a+Math.ceil(d*r)),u=1>r?n(m):null};u=n(m)}},o.scrollToElement=function(t,e,n,r){var o=c(this),l=this.scrollTop()+c(t).getBoundingClientRect().top-e;i(o)&&(l-=o.getBoundingClientRect().top),this.scrollTo(0,l,n,r)},o.scrollLeft=function(e,n,r){if(angular.isNumber(e))return this.scrollTo(e,this.scrollTop(),n,r);var o=c(this);return l(o)?t.scrollX||document.documentElement.scrollLeft||document.body.scrollLeft:o.scrollLeft},o.scrollTop=function(e,n,r){if(angular.isNumber(e))return this.scrollTo(this.scrollTop(),e,n,r);var o=c(this);return l(o)?t.scrollY||document.documentElement.scrollTop||document.body.scrollTop:o.scrollTop}}]),angular.module("duScroll.polyfill",[]).factory("polyfill",["$window",function(t){var e=["webkit","moz","o","ms"];return function(n,r){if(t[n])return t[n];for(var o,l=n.substr(0,1).toUpperCase()+n.substr(1),i=0;i