Trái với những gì hầu hết mọi người ở đây đang đề xuất, tôi khuyên bạn nên sử dụng một plugin nếu bạn muốn làm động tác di chuyển. Chỉ hoạt hình scrollTop là không đủ cho trải nghiệm người dùng mượt mà. Xem câu trả lời của tôi ở đây cho lý do.
Tôi đã thử một số plugin trong những năm qua, nhưng cuối cùng đã tự viết một cái. Bạn có thể muốn cung cấp cho nó một spin: jQuery.scrollable . Sử dụng đó, hành động cuộn trở thành
$container.scrollTo( targetPosition );
Nhưng đó không phải là tất cả. Chúng ta cũng cần sửa vị trí mục tiêu. Tính toán bạn thấy trong các câu trả lời khác,
$target.offset().top - $container.offset().top + $container.scrollTop()
chủ yếu là hoạt động nhưng không hoàn toàn chính xác. Nó không xử lý đường viền của thùng chứa cuộn đúng cách. Phần tử đích được cuộn lên quá xa, theo kích thước của đường viền. Đây là một bản demo.
Do đó, một cách tốt hơn để tính toán vị trí mục tiêu là
var target = $target[0],
container = $container[0];
targetPosition = $container.scrollTop() + target.getBoundingClientRect().top - container.getBoundingClientRect().top - container.clientTop;
Một lần nữa, hãy xem bản demo để thấy nó hoạt động.
Đối với một chức năng trả về vị trí đích và hoạt động cho cả vùng chứa cuộn cửa sổ và không phải cửa sổ, hãy sử dụng ý chính này . Các ý kiến trong đó giải thích cách tính vị trí.
Ban đầu, tôi đã nói rằng tốt nhất nên sử dụng một plugin để cuộn hoạt hình . Tuy nhiên, bạn không cần một plugin, nếu bạn muốn nhảy đến mục tiêu mà không cần chuyển đổi. Xem câu trả lời của @James cho điều đó, nhưng hãy đảm bảo bạn tính toán chính xác vị trí mục tiêu nếu có đường viền xung quanh container.