Im Gegensatz zu dem, was die meisten Leute hier sind darauf hindeutet, würde ich empfehlen Sie tun ein Plugin verwenden , wenn Sie die Bewegung animieren möchten. Nur das Animieren von scrollTop reicht für eine reibungslose Benutzererfahrung nicht aus. Siehe meine Antwort hier für die Begründung.
Ich habe im Laufe der Jahre eine Reihe von Plugins ausprobiert, aber schließlich selbst eines geschrieben. Vielleicht möchten Sie es ausprobieren : jQuery.scrollable . Damit wird die Bildlaufaktion
$container.scrollTo( targetPosition );
Aber das ist nicht alles. Wir müssen auch die Zielposition festlegen. Die Berechnung, die Sie in anderen Antworten sehen,
$target.offset().top - $container.offset().top + $container.scrollTop()
funktioniert meistens aber ist nicht ganz richtig. Der Rand des Bildlaufcontainers wird nicht richtig behandelt. Das Zielelement wird um die Größe des Rahmens zu weit nach oben gescrollt. Hier ist eine Demo.
Daher ist eine bessere Methode zur Berechnung der Zielposition
var target = $target[0],
container = $container[0];
targetPosition = $container.scrollTop() + target.getBoundingClientRect().top - container.getBoundingClientRect().top - container.clientTop;
Schauen Sie sich noch einmal die Demo an, um sie in Aktion zu sehen.
Für eine Funktion, die die Zielposition zurückgibt und sowohl für Fenster- als auch für Nicht-Fenster- Bildlaufcontainer funktioniert , können Sie diese Übersicht verwenden . Die Kommentare dort erklären, wie die Position berechnet wird.
Am Anfang habe ich gesagt, es wäre am besten, ein Plugin für animiertes Scrollen zu verwenden. Sie benötigen jedoch kein Plugin, wenn Sie ohne Übergang zum Ziel springen möchten. Siehe dazu die Antwort von @James , aber stellen Sie sicher, dass Sie die Zielposition korrekt berechnen, wenn sich um den Container ein Rand befindet.