Contrairement à ce que la plupart des gens ici sont ce qui suggère, je vous recommande de faire utiliser un plug - in si vous voulez animer le mouvement. Il ne suffit pas d'animer scrollTop pour une expérience utilisateur fluide. Voir ma réponse ici pour le raisonnement.
J'ai essayé un certain nombre de plugins au fil des ans, mais j'ai fini par en écrire un moi-même. Vous voudrez peut-être lui donner un spin: jQuery.scrollable . En utilisant cela, l'action de défilement devient
$container.scrollTo( targetPosition );
Mais ce n'est pas tout. Nous devons également fixer la position cible. Le calcul que vous voyez dans d'autres réponses,
$target.offset().top - $container.offset().top + $container.scrollTop()
fonctionne principalement mais n'est pas entièrement correct. Il ne gère pas correctement la bordure du conteneur de défilement. L'élément cible est défilé trop haut, de la taille de la bordure. Voici une démo.
Par conséquent, une meilleure façon de calculer la position cible est
var target = $target[0],
container = $container[0];
targetPosition = $container.scrollTop() + target.getBoundingClientRect().top - container.getBoundingClientRect().top - container.clientTop;
Encore une fois, regardez la démo pour la voir en action.
Pour une fonction qui renvoie la position cible et fonctionne à la fois pour les conteneurs de défilement fenêtre et non-fenêtre, n'hésitez pas à utiliser cet élément essentiel . Les commentaires qui y figurent expliquent comment la position est calculée.
Au début, j'ai dit qu'il serait préférable d'utiliser un plugin pour le défilement animé . Vous n'avez cependant pas besoin d'un plugin si vous souhaitez accéder à la cible sans transition. Voir la réponse de @James pour cela, mais assurez-vous de calculer correctement la position cible s'il y a une bordure autour du conteneur.