Contrariamente a quanto la maggior parte delle persone qui sono suggerendo, vi consiglio di fare utilizzare un plugin se si desidera animare il movimento. L'animazione di scrollTop non è sufficiente per un'esperienza utente fluida. Vedi la mia risposta qui per il ragionamento.
Ho provato diversi plugin nel corso degli anni, ma alla fine ne ho scritto uno da solo. Potresti voler fare un giro: jQuery.scrollable . Usando quello, l'azione di scorrimento diventa
$container.scrollTo( targetPosition );
Ma non è tutto. Dobbiamo anche fissare la posizione target. Il calcolo che vedi in altre risposte,
$target.offset().top - $container.offset().top + $container.scrollTop()
per lo più funziona ma non è del tutto corretto. Non gestisce correttamente il bordo del contenitore di scorrimento. L'elemento target viene fatto scorrere troppo verso l'alto, in base alla dimensione del bordo. Ecco una demo.
Quindi, un modo migliore per calcolare la posizione target è
var target = $target[0],
container = $container[0];
targetPosition = $container.scrollTop() + target.getBoundingClientRect().top - container.getBoundingClientRect().top - container.clientTop;
Ancora una volta, dai un'occhiata alla demo per vederla in azione.
Per una funzione che restituisce la posizione di destinazione e funziona sia per i contenitori di scorrimento per finestre sia per quelli senza finestre, non esitate a usare questa sintesi . I commenti lì dentro spiegano come viene calcolata la posizione.
All'inizio, ho detto che sarebbe meglio usare un plugin per lo scorrimento animato . Non è necessario un plug-in, tuttavia, se si desidera passare all'obiettivo senza transizione. Vedi la risposta di @James per questo, ma assicurati di calcolare correttamente la posizione di destinazione se c'è un bordo attorno al contenitore.