Вопреки тому , что большинство людей здесь предлагают, я рекомендую вам сделать использовать плагин , если вы хотите , чтобы оживить движение. Одного анимированного 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;
Опять же, посмотрите на демо, чтобы увидеть его в действии.
Для функции, которая возвращает целевую позицию и работает для оконных и неоконных контейнеров прокрутки, не стесняйтесь использовать эту суть . Комментарии там объясняют, как рассчитывается позиция.
В начале я сказал, что для анимационной прокрутки лучше всего использовать плагин . Однако вам не нужен плагин, если вы хотите перейти к цели без перехода. Посмотрите ответ @James для этого, но убедитесь, что вы правильно рассчитали целевую позицию, если вокруг контейнера есть граница.