Es sieht so aus, als gäbe es bereits viele Lösungen. Hier ist trotzdem eine weitere, die Easing-Gleichungen verwendet.
// zuerst raf shim hinzufügen
// http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/
window.requestAnimFrame = (function(){
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
function( callback ){
window.setTimeout(callback, 1000 / 60);
};
})();
// Hauptfunktion
function scrollToY(scrollTargetY, speed, easing) {
// scrollTargetY: der Ziel-scrollY-Wert des Fensters
// speed: Zeit in Pixeln pro Sekunde
// easing: zu verwendende Easing-Gleichung
var scrollY = window.scrollY || document.documentElement.scrollTop,
scrollTargetY = scrollTargetY || 0,
speed = speed || 2000,
easing = easing || 'easeOutSine',
currentTime = 0;
// Mindestzeit 0,1 Sekunden, Höchstzeit 0,8 Sekunden
var time = Math.max(.1, Math.min(Math.abs(scrollY - scrollTargetY) / speed, .8));
// Easing-Gleichungen von https://github.com/danro/easing-js/blob/master/easing.js
var easingEquations = {
easeOutSine: function (pos) {
return Math.sin(pos * (Math.PI / 2));
},
easeInOutSine: function (pos) {
return (-0.5 * (Math.cos(Math.PI * pos) - 1));
},
easeInOutQuint: function (pos) {
if ((pos /= 0.5) < 1) {
return 0.5 * Math.pow(pos, 5);
}
return 0.5 * (Math.pow((pos - 2), 5) + 2);
}
};
// Animationsloop hinzufügen
function tick() {
currentTime += 1 / 60;
var p = currentTime / time;
var t = easingEquations[easing](p);
if (p < 1) {
requestAnimFrame(tick);
window.scrollTo(0, scrollY + ((scrollTargetY - scrollY) * t));
} else {
console.log('scroll fertig');
window.scrollTo(0, scrollTargetY);
}
}
// einmal aufrufen, um zu beginnen
tick();
}
// Los geht's!
scrollToY(0, 1500, 'easeInOutQuint');