jQuery .scrollTop (); + hoạt hình


171

Tôi đặt trang để cuộn lên trên cùng khi nhấp vào nút. Nhưng trước tiên, tôi đã sử dụng một câu lệnh if để xem nếu đầu trang không được đặt thành 0. Sau đó, nếu không phải là 0, tôi làm động trang để cuộn lên trên cùng.

var body = $("body");
var top = body.scrollTop() // Get position of the body

if(top!=0)
{
  body.animate({scrollTop:0}, '500');
}

Phần khó khăn bây giờ là hoạt hình một cái gì đó SAU trang đã cuộn lên trên cùng. Vì vậy, suy nghĩ tiếp theo của tôi là, tìm hiểu vị trí trang là gì. Vì vậy, tôi đã sử dụng bảng điều khiển để tìm hiểu.

console.log(top);  // the result was 365

Điều này mang lại cho tôi kết quả 365, tôi đoán đó là số vị trí tôi đã ở ngay trước khi cuộn lên trên cùng.

Câu hỏi của tôi là làm cách nào để đặt vị trí thành 0, để tôi có thể thêm một hình ảnh động khác chạy khi trang ở mức 0?

Cảm ơn!


1
Có cần thiết những nút mà bạn bắn sự kiện luôn luôn nhìn thấy? Nếu không thì tôi có một mã không cần bất kỳ loại điều kiện nào có thể dễ dàng cho điều kiện đầu tiên của bạn
Cơ khí

1
Không nên có trích dẫn xung quanh mili giây. "Chuỗi" tài liệu đề cập đến là chậm / nhanh
mplungjan

Câu trả lời:


313

Để thực hiện việc này, bạn có thể đặt chức năng gọi lại cho lệnh animate sẽ thực thi sau khi hoạt ảnh cuộn kết thúc.

Ví dụ:

var body = $("html, body");
body.stop().animate({scrollTop:0}, 500, 'swing', function() { 
   alert("Finished animating");
});

Mã cảnh báo đó nằm ở đâu, bạn có thể thực thi nhiều javascript hơn để thêm vào hình ảnh động.

Ngoài ra, 'swing' là có để thiết lập nới lỏng. Hãy xem http://api.jquery.com/animate/ để biết thêm thông tin.


1
Cảm ơn Thomas, đó là những gì tôi cần. Tôi cũng đã thêm một sự chậm trễ vì lớp học được thêm rất nhanh. if (top! = 0) {console.log ("cuộn ẩn"); body.animate ({scrollTop: 0}, '500', 'swing', function () {console.log ("Hoàn thành hoạt hình"); leftitems.delay (1000) .removeClass ("slide");}); }
Juan Di Diego

5
Tôi không chắc có phải vì bài đăng này đã 4 năm tuổi hay không, nhưng tôi nghĩ trong các phiên bản mới hơn của jQuery, bạn cần xóa các trích dẫn đó trong khoảng thời gian: body.animate ({scrollTop: 0}, 500, 'swing', function () {alert ("Hoàn thành hoạt ảnh");});
Andrew

27
Nhân tiện, cuộc gọi lại của bạn sẽ thực hiện hai lần, bởi vì bạn đã chọn hai yếu tố.
Big McLargeHuge

8
Thomas đã có điểm tốt khi thêm phần thân và html. Trường hợp 1. Cơ thể đọc và kiểm soát Chrome, FIrefox cần html để làm điều đó.
sợ hãi

4
Chỉ cần thử - $ ('html') không hoạt động trong Chrome và $ ('body') không hoạt động trong Firefox, vì vậy $ ('html, body') là cần thiết. Và cũng gọi .stop () là một điều tốt - tôi đã cố gắng gọi nhanh hoạt động nhiều lần bằng chrome và sau đó tôi không thể cuộn trang xuống.
Lev Lukomsky

54

Hãy thử mã này:

$('.Classname').click(function(){
    $("html, body").animate({ scrollTop: 0 }, 600);
    return false;
});

8
$("html")nên được sử dụng thay thế, bởi vì trong trường hợp của bạn nếu bạn thêm chức năng gọi lại, nó sẽ được gọi hai lần, một lần cho html và một lần cho cơ thể . Và sử dụng cơ thể không làm gì cả.
lỗ hổng

10
có vẻ như phụ thuộc vào trình duyệt trong một số trường hợp, $ ('html') có thể không làm gì cả, vì vậy bạn cần sử dụng cả hai và chăm sóc cuộc gọi lại được kích hoạt hai lần.
phổ biến

31

Dùng cái này:

$('a[href^="#"]').on('click', function(event) {

    var target = $( $(this).attr('href') );

    if( target.length ) {
        event.preventDefault();
        $('html, body').animate({
            scrollTop: target.offset().top
        }, 500);
    }

});

8

Đối với điều này, bạn có thể sử dụng phương thức gọi lại

body.animate({
      scrollTop:0
    }, 500, 
    function(){} // callback method use this space how you like
);

7

Hãy thử điều này thay thế:

var body = $("body, html");
var top = body.scrollTop() // Get position of the body
if(top!=0)
{
       body.animate({scrollTop :0}, 500,function(){
         //DO SOMETHING AFTER SCROLL ANIMATION COMPLETED
          alert('Hello');
      });
}

5

Giải pháp đơn giản:

cuộn đến bất kỳ yếu tố nào bằng ID hoặc NAME:

SmoothScrollTo("#elementId", 1000);

mã:

function SmoothScrollTo(id_or_Name, timelength){
    var timelength = timelength || 1000;
    $('html, body').animate({
        scrollTop: $(id_or_Name).offset().top-70
    }, timelength, function(){
        window.location.hash = id_or_Name;
    });
}

' Thời gian ' đã được truyền vào dưới dạng tham số nên không cần khai báo với 'var'. Không thể chỉnh sửa 'câu trả lời' này vì nó có ít hơn 6 ký tự! ;-) +1
Anthony Walsh

@AnthonyWalsh không có cách nào afaik. varkhông cần ghi đè lên toàn cầu (nếu tồn tại biến toàn cục có tên đó)
T.Todua

Đủ công bằng ;-) Tôi đang sử dụng TypeScript và chuyển một số trực tiếp làm tham số cho bước thời gian để tất cả phạm vi cục bộ trong trường hợp của tôi. Chúc mừng!
Anthony Walsh

4

Mã có chức năng nhấp ()

    var body = $('html, body');

    $('.toTop').click(function(e){
        e.preventDefault();
        body.animate({scrollTop:0}, 500, 'swing');

}); 

.toTop= lớp phần tử được nhấp có thể imghoặca


4
jQuery("html,body").animate({scrollTop: jQuery("#your-elemm-id-where you want to scroll").offset().top-<some-number>}, 500, 'swing', function() { 
       alert("Finished animating");
    });

0

Bạn phải xem

$(function () {
        $('a[href*="#"]:not([href="#"])').click(function () {
            if (location.pathname.replace(/^\//, '') == this.pathname.replace(/^\//, '') && location.hostname == this.hostname) {
                var target = $(this.hash);
                target = target.length ? target : $('[name=' + this.hash.slice(1) + ']');
                if (target.length) {
                    $('html, body').animate({
                        scrollTop: target.offset().top
                    }, 1000);
                    return false;
                }
            }
        });
    });

hoặc thử chúng

$(function () {$('a').click(function () {
$('body,html').animate({
    scrollTop: 0
}, 600);
return false;});});

0
$("body").stop().animate({
        scrollTop: 0
    }, 500, 'swing', function () {
        console.log(confirm('Like This'))
    }
);

0

bạn có thể sử dụng cả lớp CSS hoặc id HTML, để giữ cho nó đối xứng Tôi luôn sử dụng lớp CSS chẳng hạn

<a class="btn btn-full js--scroll-to-plans" href="#">I’m hungry</a> 
|
|
|
<section class="section-plans js--section-plans clearfix">
$(document).ready(function () {
    $('.js--scroll-to-plans').click(function () {
        $('body,html').animate({
            scrollTop: $('.js--section-plans').offset().top
        }, 1000);
        return false;})
});
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.