2009-05-07 28 views
90

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

Tôi có chức năng thực thi khi người dùng ở 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ếu nó thực sự là dòng hay không được ngăn chặn nó và chỉ có cảnh báo đầu tiên đi tắt, đây là các mã:

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

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

+3

Jquery chính tôi làm việc tốt, nhưng bạn có chắc là bạn có plugin scrollTo được liên kết đúng không? Thay đổi một trong những cảnh báo đó để cảnh báo ($. ScrollTo); – Andrew

Trả lời

93

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

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

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

+3

ScrollTop hoạt động trơn tru hơn nhiều trong IE. –

+6

Lưu ý nếu bạn muốn cuộn toàn bộ trang chứ không phải phần tử riêng lẻ, hãy sử dụng $ ('html, body') giống như [Tim] (http://stackoverflow.com/users/181971) đã chỉ ra ở đây. Chỉ $ ('body') sẽ không hoạt động trên tất cả các trình duyệt. –

7

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

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

jQuery hiện hỗ trợ scrollTop dưới dạng biến hoạt ảnh.

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

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

+0

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

+1

Nếu nó là '$ (" # id "). Offset(). Top' thay thế? – codeulike

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

+1 cho điều này, rất trơn tru. – shmeeps

+0

Rất tuyệt vời - cảm ơn! –

+18

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? –

6

Thực ra cái gì đó như

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

sẽ làm việc độc đáo và hỗ trợ đệm. Bạn cũng có thể hỗ trợ lợi nhuận dễ dàng - hoàn thành xem dưới đây

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

Để có được xung quanh html vs body vấn đề, tôi cố định này bằng cách không hoạt cảnh css trực tiếp nhưng thay vì gọi window.scrollTo(); trên mỗi 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 độc đáo mà không có bất kỳ gotchas làm mới vì nó sử dụng JavaScript trình duyệt chéo.

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 thật tuyệt vời. Tôi chỉ thay đổi 'window.pageYOffset' thành' $ (window) .scrollTop() 'và' window.scrollTo (0, val) 'thành' $ (window) .scrollTop (val) 'vì vậy tôi không phải lo lắng về khả năng tương thích của trình duyệt. – leftclickben

+1

Tôi không bao giờ nghĩ rằng để vượt qua một đối tượng để phương pháp animate của jQuery như thế. Vì vậy, nhiều công dụng có thể. Giải pháp này là tuyệt vời, cảm ơn bạn. – Synexis

+0

Điều này nghiêm trọng cần nhiều upvotes, nó tuyệt vời. – degenerate

Các vấn đề liên quan