Cách cuộn cửa sổ bằng hàm JQuery $ .scrollTo ()


98

Tôi đang cố gắng cuộn xuống 100px mỗi khi người dùng đến gần đầu tài liệu.

Tôi có hàm đang thực thi khi người dùng đến gần đầu tài liệu, nhưng hàm .scrollTo không hoạt động.

Tôi đã đặt một cảnh báo sau và trước đó để kiểm tra xem nó có thực sự là dòng hay không đang dừng nó và chỉ cảnh báo đầu tiên tắt, đây là mã:

alert("starting");
$.scrollTo({ top: '+=100px', left: '+=0px' }, 800);
alert("finished");

Tôi biết tôi đã liên kết trang jquery đúng cách vì tôi đang sử dụng nhiều hàm jquery khác và tất cả chúng đều hoạt động tốt. Tôi cũng đã thử xóa 'px' từ phía trên và nó dường như không tạo ra sự khác biệt.


3
Bản thân jquery của tôi đang hoạt động tốt, nhưng bạn có chắc là bạn đã liên kết đúng plugin scrollTo không? Thay đổi một trong những cảnh báo đó thành cảnh báo ($. ScrollTo);
Andrew

Câu trả lời:


97

Nếu nó không hoạt động tại sao bạn không thử sử dụng phương thức scrollTop của jQuery?

$("#id").scrollTop($("#id").scrollTop() + 100);

Nếu bạn đang muốn cuộn trơn tru, bạn có thể sử dụng hàm setTimeout / setInterval của javascript cơ bản để làm cho nó cuộn với gia số 1px trong một khoảng thời gian nhất định.


8
Lưu ý nếu bạn muốn cuộn toàn bộ trang chứ không phải từng phần tử, hãy sử dụng $ ('html, body') giống như Tim đã chỉ ở đây. Chỉ $ ('body') sẽ không hoạt động trong tất cả các trình duyệt.
tôi--

321
$('html, body').animate({scrollTop: $("#page").offset().top}, 2000);

19
Tôi thường tự hỏi tại sao mọi người sử dụng 'html, body' cho scrollTop thay vì chỉ 'html'. Bất kỳ suy nghĩ về điều này?
Scott Greenfield

+1 đã làm việc cho tôi;) Tôi cũng muốn biết tại sao html, bodythay vì chỉ html?
Kato

9
@ScottGreenfield, @Kato: không chắc chắn lý do tại sao, nhưng nhận xét này nói không bao gồm bodyvi phạm này trên Chrome 4: stackoverflow.com/questions/1890995/...
Yuji 'Tomita' Tomita

scrollTop: 0cũng đang hoạt động tốt. Nhưng thời lượng giảm xuống. Hoạt động tốt nếu bộ 1000 tốc độ
shashwat

Đây là một giải pháp tốt cho đến khi bạn muốn thêm một phương thức hoàn chỉnh - nó sẽ thực thi hai lần. Giải pháp của @complistic thanh lịch hơn và sẽ ngăn chặn điều đó.
plankguy

41

jQuery hiện hỗ trợ scrollTop như một biến hoạt ảnh.

$("#id").animate({"scrollTop": $("#id").scrollTop() + 100});

Bạn không cần phải setTimeout / setInterval để cuộn trơn tru.


Có một số lỗi cú pháp - thiếu phần đóng của bạn {. Nếu không thì đây là một điểm tốt.
Joshua

1
Có nên $("#id").offset().topthay thế không?
codeulike

15

Để giải quyết vấn đề htmlvs body, tôi đã khắc phục sự cố này bằng cách không tạo hoạt ảnh trực tiếp cho css mà thay window.scrollTo();vào đó là gọi từng bước:

$({myScrollTop:window.pageYOffset}).animate({myScrollTop:300}, {
  duration: 600,
  easing: 'swing',
  step: function(val) {
    window.scrollTo(0, val);
  }
});

Điều này hoạt động tốt mà không có bất kỳ lỗi làm mới nào vì nó sử dụng JavaScript trên nhiều trình duyệt.

Hãy xem http://james.padolsey.com/javascript/fun-with-jquerys-animate/ để biết thêm thông tin về những gì bạn có thể làm với chức năng hoạt ảnh của jQuery.


1
Điều này là tuyệt vời. Tôi chỉ thay đổi window.pageYOffsetđể $(window).scrollTop()window.scrollTo(0, val)để $(window).scrollTop(val)vì vậy tôi không cần phải lo lắng về khả năng tương thích trình duyệt.
leftclickben

1
Tôi chưa bao giờ nghĩ rằng sẽ truyền một đối tượng vào phương thức animate của jQuery như vậy. Rất nhiều khả năng sử dụng. Giải pháp này là tuyệt vời, cảm ơn bạn.
Synexis

Vâng, kỹ thuật là một đóng góp đáng kể. Trước đây đã giải quyết các vấn đề về trình duyệt bằng cách sử dụng trực tiếp "window.scrollTo ()", nhưng điều đó không cho phép gọi lại "hoàn chỉnh" hoặc cũng không phải là một lời hứa. Cảm ơn bạn @complistic cho giải pháp này. Ngoài ra, lời cảm ơn của tôi tới @leftclickben; Tôi đã triển khai biến thể của anh ấy bằng cách sử dụng ".scrollTop ()". Ngoài ra, bài báo "james.padolsey", trên mỗi liên kết, là một bài viết ngắn gọn, rất đáng đọc.
IAM_AL_X

Tôi nghĩ rằng "window.scrollTo ()" phải tương thích với tất cả các trình duyệt hiện đại.
IAM_AL_X

7

Có vẻ như bạn đã sai cú pháp một chút ... Tôi giả sử dựa trên mã của bạn rằng bạn đang cố cuộn xuống 100px trong 800ms, nếu vậy thì điều này hoạt động (sử dụng scrollTo 1.4.1):

$.scrollTo('+=100px', 800, { axis:'y' });

6

Trên thực tế một cái gì đó như

function scrollTo(prop){
    $('html,body').animate({scrollTop: $("#"+prop).offset().top +
 parseInt($("#"+prop).css('padding-top'),10) },'slow');
}

sẽ hoạt động tốt và hỗ trợ đệm. Bạn cũng có thể hỗ trợ lợi nhuận một cách dễ dàng - để hoàn thành, hãy xem bên dưới

function scrollTo(prop){
    $('html,body').animate({scrollTop: $("#"+prop).offset().top 
+ parseInt($("#"+prop).css('padding-top'),10) 
+ parseInt($("#"+prop).css('margin-top'),10) +},'slow');
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.