diff --git a/dist/rd-smoothscroll.js b/dist/rd-smoothscroll.js index ec32087..1f6fbf3 100644 --- a/dist/rd-smoothscroll.js +++ b/dist/rd-smoothscroll.js @@ -10,9 +10,7 @@ "use strict"; var isTouch = "ontouchstart" in window, - isFirefox = typeof InstallTrigger !== 'undefined', - isMac = window.navigator.platform === 'MacIntel' || window.navigator.platform === 'MacPPC', - isWebkit = "webkitTransform" in document.documentElement.style; + isMac = window.navigator.platform === 'MacIntel' || window.navigator.platform === 'MacPPC'; /* * http://paulirish.com/2011/requestanimationframe-for-smart-animating/ @@ -47,7 +45,7 @@ RDSmoothScroll.Defaults = { friction: 0.88, step: isMac? 0.65 : 2, - minDistance: 0.1 + minDistance: 0.1 }; /** @@ -55,7 +53,10 @@ * @protected */ RDSmoothScroll.Animator = function (element) { - var originalTarget = (element.nodeName.toLowerCase() === "html") && isWebkit ? element.children[element.children.length - 1] : element; + var originalTarget = element; + if (element.nodeName.toLowerCase() === "html") { + originalTarget = this.scrollableRoot(); + } this.target = element; this.originalTarget = originalTarget; this.direction = undefined; @@ -69,6 +70,37 @@ this.speed = 0; }; + /** + * Get root element that can be scrolled + * @protected + */ + RDSmoothScroll.Animator.prototype.scrollableRoot = function () { + if (document.scrollingElement !== undefined) { + return document.scrollingElement; + } + + var initialScrollTop = document.documentElement.scrollTop; + + if (initialScrollTop > 1) { + document.documentElement.scrollTop -= 1; + } else { + document.documentElement.scrollTop += 1; + } + + // If documentElement can't be scrolled, use fallback + if (initialScrollTop === document.documentElement.scrollTop) { + return document.body; + } + + // If documentElement _was_ scrolled, reset to its initial position + // if page hasn't already been scrolled + if (Math.abs(document.documentElement.scrollTop - initialScrollTop) === 1) { + document.documentElement.scrollTop = initialScrollTop; + } + + return document.documentElement; + }; + /** * Updates the animator states * @protected @@ -262,4 +294,4 @@ if (!isTouch) { window.RDSmoothScroll.instance = new RDSmoothScroll(); } -})(window, document); \ No newline at end of file +})(window, document); diff --git a/dist/rd-smoothscroll.min.js b/dist/rd-smoothscroll.min.js index 2573590..8984891 100644 --- a/dist/rd-smoothscroll.min.js +++ b/dist/rd-smoothscroll.min.js @@ -1 +1,7 @@ -!function(t,i,o){"use strict";var e="ontouchstart"in t,r=("undefined"!=typeof InstallTrigger,"MacIntel"===t.navigator.platform||"MacPPC"===t.navigator.platform),n="webkitTransform"in i.documentElement.style;t.requestAnimFrame=function(){return t.requestAnimationFrame||t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||t.oRequestAnimationFrame||t.msRequestAnimationFrame||function(i){t.setTimeout(i,1e3/60)}}(),t.RDSmoothScroll=function(){this.options=RDSmoothScroll.Defaults,this.animators=[],this.initialize()},RDSmoothScroll.Defaults={friction:.88,step:r?.65:2,minDistance:.1},RDSmoothScroll.Animator=function(t){var i="html"===t.nodeName.toLowerCase()&&n?t.children[t.children.length-1]:t;this.target=t,this.originalTarget=i,this.direction=o,this.currentY=i.scrollTop,this.targetY=i.scrollTop,this.lastY=i.scrollTop,this.delta=0,this.minY=0,this.maxY=o,this.isPlaying=!1,this.speed=0},RDSmoothScroll.Animator.prototype.update=function(i){var o=t.RDSmoothScroll.instance,e=i.detail?-1*i.detail:i.wheelDelta/40,r=0>e?-1:1;r!=this.direction&&(this.speed=0,this.direction=r),this.currentY=-this.originalTarget.scrollTop,this.delta=e,this.targetY+=e,this.speed+=(this.targetY-this.lastY)*o.options.step,this.lastY=this.targetY,this.start()},RDSmoothScroll.Animator.prototype.start=function(){this.isPlaying||(this.isPlaying=!0,t.jQuery&&t.jQuery(this.originalTarget).stop(),this.play())},RDSmoothScroll.Animator.prototype.play=function(){var t=this;this.isPlaying&&(requestAnimFrame(function(){t.play()}),this.render())},RDSmoothScroll.Animator.prototype.stop=function(){this.isPlaying&&(this.speed=0,this.isPlaying=!1)},RDSmoothScroll.Animator.prototype.render=function(){var i=t.RDSmoothScroll.instance;Math.abs(this.originalTarget.scrollTop- -this.currentY)>Math.abs(this.delta)&&Math.abs(this.originalTarget.scrollTop- -this.currentY)>1&&this.stop(),this.speed<-i.options.minDistance||this.speed>i.options.minDistance?(this.currentY=this.currentY+this.speed,this.currentY>this.minY?this.currentY=this.speed=0:this.currentYo.clientHeight&&o.clientHeight>0);)o=o.parentNode;if(null!=o){e=r.isAnimator(o)?r.getAnimator(o):r.createAnimator(o);for(var n in r.animators)r.animators[n]!==e&&r.animators[n].stop&&r.animators[n].stop();e.update(i)}}},RDSmoothScroll.prototype.createAnimator=function(t){return this.animators[this.animators.push(new RDSmoothScroll.Animator(t))-1]},RDSmoothScroll.prototype.isAnimator=function(t){for(var i in this.animators)if(this.animators[i].target===t)return!0;return!1},RDSmoothScroll.prototype.getAnimator=function(t){for(var i in this.animators)if(this.animators[i].target===t)return this.animators[i];return o},e||(t.RDSmoothScroll.instance=new RDSmoothScroll)}(window,document); \ No newline at end of file +(function(b,d,f){var g="ontouchstart"in b,h="MacIntel"===b.navigator.platform||"MacPPC"===b.navigator.platform;b.requestAnimFrame=function(){return b.requestAnimationFrame||b.webkitRequestAnimationFrame||b.mozRequestAnimationFrame||b.oRequestAnimationFrame||b.msRequestAnimationFrame||function(a){b.setTimeout(a,1E3/60)}}();b.RDSmoothScroll=function(a){this.options=RDSmoothScroll.Defaults;this.animators=[];this.initialize()};RDSmoothScroll.Defaults={friction:.88,step:h?.65:2,minDistance:.1};RDSmoothScroll.Animator= +function(a){var b=a;"html"===a.nodeName.toLowerCase()&&(b=this.scrollableRoot());this.target=a;this.originalTarget=b;this.direction=f;this.lastY=this.targetY=this.currentY=b.scrollTop;this.minY=this.delta=0;this.maxY=f;this.isPlaying=!1;this.speed=0};RDSmoothScroll.Animator.prototype.scrollableRoot=function(){var a=d.documentElement.scrollTop;1a?-1:1;c!=this.direction&&(this.speed=0,this.direction=c);this.currentY=-this.originalTarget.scrollTop;this.delta=a;this.targetY+=a;this.speed+=(this.targetY-this.lastY)*e.options.step;this.lastY=this.targetY;this.start()};RDSmoothScroll.Animator.prototype.start=function(){this.isPlaying||(this.isPlaying=!0,b.jQuery&& +b.jQuery(this.originalTarget).stop(),this.play())};RDSmoothScroll.Animator.prototype.play=function(){var a=this;this.isPlaying&&(requestAnimFrame(function(){a.play()}),this.render())};RDSmoothScroll.Animator.prototype.stop=function(){this.isPlaying&&(this.speed=0,this.isPlaying=!1)};RDSmoothScroll.Animator.prototype.render=function(){var a=b.RDSmoothScroll.instance;Math.abs(this.originalTarget.scrollTop- -this.currentY)>Math.abs(this.delta)&&1a.options.minDistance?(this.currentY+=this.speed,this.currentY>this.minY?this.currentY=this.speed=0:this.currentYc.clientHeight&&0