Contrariamente a lo que la mayoría de las personas aquí están sugiriendo, me gustaría recomendar que hace uso de un plugin si desea animar el movimiento. Solo animar scrollTop no es suficiente para una experiencia de usuario fluida. Vea mi respuesta aquí para el razonamiento.
He intentado varios complementos a lo largo de los años, pero finalmente escribí uno yo mismo. Es posible que desee darle una vuelta: jQuery.scrollable . Usando eso, la acción de desplazamiento se convierte
$container.scrollTo( targetPosition );
Pero eso no es todo. También necesitamos fijar la posición objetivo. El cálculo que ves en otras respuestas,
$target.offset().top - $container.offset().top + $container.scrollTop()
En su mayoría funciona, pero no es del todo correcto. No maneja el borde del contenedor de desplazamiento correctamente. El elemento de destino se desplaza hacia arriba demasiado lejos, por el tamaño del borde. Aquí hay una demostración.
Por lo tanto, una mejor manera de calcular la posición objetivo es
var target = $target[0],
container = $container[0];
targetPosition = $container.scrollTop() + target.getBoundingClientRect().top - container.getBoundingClientRect().top - container.clientTop;
Nuevamente, eche un vistazo a la demostración para verla en acción.
Para una función que devuelve la posición de destino y funciona tanto para contenedores de desplazamiento con ventana como sin ventana, siéntase libre de usar esta esencia . Los comentarios allí explican cómo se calcula la posición.
Al principio, he dicho que sería mejor usar un complemento para el desplazamiento animado . Sin embargo, no necesita un complemento si desea saltar al objetivo sin una transición. Vea la respuesta de @James para eso, pero asegúrese de calcular la posición de destino correctamente si hay un borde alrededor del contenedor.