Nur diese reine Javascript-Lösung unten gemacht.
Einfache Verwendung:
EPPZScrollTo.scrollVerticalToElementById('wrapper', 0);
Engine-Objekt (Sie können mit den Filter-, FPS-Werten herumspielen):
/**
*
* Erstellt von Borbás Geri am 17.12.13
* Urheberrecht (c) 2013 eppz! development, LLC.
*
* Hiermit wird jeder Person, die eine Kopie dieser Software und zugehöriger Dokumentationsdateien (die "Software") erhält, kostenlos die Erlaubnis erteilt, die Software uneingeschränkt zu nutzen, einschließlich, aber nicht beschränkt auf das Recht, Kopien der Software zu verwenden, zu ändern, zu fusionieren, zu veröffentlichen, zu verbreiten, unterlizenzieren und/oder Kopien der Software zu verkaufen, und Personen zu ermächtigen, denen die Software zur Verfügung gestellt wird, dies unter den folgenden Bedingungen zu tun:
* Der obige Urheberrechtshinweis und dieser Genehmigungshinweis müssen in allen Kopien oder wesentlichen Teilen der Software enthalten sein.
* DIE SOFTWARE WIRD "WIE SIE IST", OHNE JEGLICHE GEWÄHRLEISTUNG, AUSDRÜCKLICH ODER STILLSCHWEIGEND, EINSCHLIESSLICH, ABER NICHT BESCHRÄNKT AUF DIE GEWÄHRLEISTUNG DER MARKTFÄHIGKEIT, DER EIGNUNG FÜR EINEN BESTIMMTEN ZWECK UND DER NICHTVERLETZUNG, BEREITGESTELLT. IN KEINEM FALL HAFTEN DIE AUTOREN ODER COPYRIGHT-INHABER FÜR ANSPRÜCHE, SCHÄDEN ODER ANDERE HAFTUNG, UNABHÄNGIG DAVON, OB SIE AUS EINEM VERTRAG, EINER UNERLAUBTEN HANDLUNG ODER ANDERWEITIG ERGEBEN, DIE AUS, IN VERBINDUNG MIT DER SOFTWARE ODER DER VERWENDUNG ODER ANDEREN GESCHÄFTEN MIT DER SOFTWARE.
*
*/
var EPPZScrollTo =
{
/**
* Helfer.
*/
documentVerticalScrollPosition: function()
{
if (self.pageYOffset) return self.pageYOffset; // Firefox, Chrome, Opera, Safari.
if (document.documentElement && document.documentElement.scrollTop) return document.documentElement.scrollTop; // Internet Explorer 6 (Standardsmodus).
if (document.body.scrollTop) return document.body.scrollTop; // Internet Explorer 6, 7 und 8.
return 0; // Keines der oben genannten.
},
viewportHeight: function()
{ return (document.compatMode === "CSS1Compat") ? document.documentElement.clientHeight : document.body.clientHeight; },
documentHeight: function()
{ return (document.height !== undefined) ? document.height : document.body.offsetHeight; },
documentMaximumScrollPosition: function()
{ return this.documentHeight() - this.viewportHeight(); },
elementVerticalClientPositionById: function(id)
{
var element = document.getElementById(id);
var rectangle = element.getBoundingClientRect();
return rectangle.top;
},
/**
* Animations-Tick.
*/
scrollVerticalTickToPosition: function(currentPosition, targetPosition)
{
var filter = 0.2;
var fps = 60;
var difference = parseFloat(targetPosition) - parseFloat(currentPosition);
// Schnappschuss, dann anhalten, wenn angekommen.
var arrived = (Math.abs(difference) <= 0.5);
if (arrived)
{
// Ziel anwenden.
scrollTo(0.0, targetPosition);
return;
}
// Gefilterte Position.
currentPosition = (parseFloat(currentPosition) * (1.0 - filter)) + (parseFloat(targetPosition) * filter);
// Ziel anwenden.
scrollTo(0.0, Math.round(currentPosition));
// Nächsten Tick planen.
setTimeout("EPPZScrollTo.scrollVerticalTickToPosition("+currentPosition+", "+targetPosition+")", (1000 / fps));
},
/**
* Für die öffentliche Verwendung.
*
* @param id Die ID des Elements, zu dem gescrollt werden soll.
* @param padding Oben anzuwendender Abstand über dem Element.
*/
scrollVerticalToElementById: function(id, padding)
{
var element = document.getElementById(id);
if (element == null)
{
console.warn('Element mit ID \''+id+'\' konnte nicht gefunden werden.');
return;
}
var targetPosition = this.documentVerticalScrollPosition() + this.elementVerticalClientPositionById(id) - padding;
var currentPosition = this.documentVerticalScrollPosition();
// Begrenzen.
var maximumScrollPosition = this.documentMaximumScrollPosition();
if (targetPosition > maximumScrollPosition) targetPosition = maximumScrollPosition;
// Animation starten.
this.scrollVerticalTickToPosition(currentPosition, targetPosition);
}
};