En la mayoría de los casos, sería mejor usar un complemento. Seriamente. Voy a promocionar el mío aquí . Por supuesto que también hay otros. Pero compruebe si realmente evitan los escollos para los que desea un complemento en primer lugar, no todos lo hacen.
He escrito sobre las razones para usar un complemento en otro lugar . En pocas palabras, el revestimiento que sustenta la mayoría de las respuestas aquí
$('html, body').animate( { scrollTop: $target.offset().top }, duration );
Está mal UX.
La animación no responde a las acciones del usuario. Continúa incluso si el usuario hace clic, toca o intenta desplazarse.
Si el punto de partida de la animación está cerca del elemento objetivo, la animación es dolorosamente lenta.
Si el elemento de destino se coloca cerca de la parte inferior de la página, no se puede desplazar a la parte superior de la ventana. La animación de desplazamiento se detiene abruptamente entonces, a mitad de movimiento.
Para manejar estos problemas (y muchos otros ), puede usar un complemento mío, jQuery.scrollable . La llamada se convierte en
$( window ).scrollTo( targetPosition );
y eso es. Por supuesto, hay más opciones .
Con respecto a la posición de destino, $target.offset().top
hace el trabajo en la mayoría de los casos. Pero tenga en cuenta que el valor devuelto no tiene en cuenta un borde en el html
elemento ( consulte esta demostración ). Si necesita que la posición de destino sea precisa bajo cualquier circunstancia, es mejor usar
targetPosition = $( window ).scrollTop() + $target[0].getBoundingClientRect().top;
Eso funciona incluso si se establece un borde en el html
elemento.
scrollTo
fue deshabilitado para mí debido a un complemento de Chrome, no estoy seguro de cuál.