Вопреки тому, что предлагает большинство людей, я бы порекомендовал вам делать использовать плагин, если вы хотите оживить движение. Одного анимированного scrollTop недостаточно для плавного взаимодействия с пользователем. См. мой ответ здесь для обоснования.
За прошедшие годы я перепробовал несколько плагинов, но в итоге написал сам. Вы могли бы хотеть дать ему вращение: jQuery.scrollable . Используя это, действие прокрутки становится
$container.scrollTo( targetPosition );
Но это еще не все. Нам нужно также зафиксировать целевую позицию. Расчет вы видите в других ответах
$target.offset().top - $container.offset().top + $container.scrollTop()
в основном работает, но не совсем правильно. Он не обрабатывает границу контейнера прокрутки должным образом. Целевой элемент прокручивается вверх слишком далеко, по размеру границы. Вот демонстрация.
Следовательно, лучший способ рассчитать целевую позицию -
var target = $target[0],
container = $container[0];
targetPosition = $container.scrollTop() + target.getBoundingClientRect().top - container.getBoundingClientRect().top - container.clientTop;
Опять же, посмотрите на демо , чтобы увидеть его в действии.
Для функции, которая возвращает целевую позицию и работает для оконных и неоконных контейнеров прокрутки, не стесняйтесь использовать this gist . Комментарии там объясняют, как рассчитывается позиция.
В начале я сказал, что было бы лучше использовать плагин для анимированной прокрутки. Однако вам не нужен плагин, если вы хотите перейти к цели без перехода. Посмотрите ответ @ James для этого, но убедитесь, что вы правильно рассчитали целевую позицию, если вокруг контейнера есть граница.