Cuộn lên đầu trang bằng JavaScript?


1593

Làm cách nào để tôi cuộn lên đầu trang bằng JavaScript? Đó là mong muốn ngay cả khi thanh cuộn ngay lập tức nhảy lên trên cùng. Tôi không tìm kiếm một cuộn trơn tru.


Năm 2019, để tránh trang web này Trang web này dường như sử dụng hiệu ứng định vị được liên kết cuộn. Điều này có thể không hoạt động tốt với panning không đồng bộ sử dụng tập lệnh stackoverflow.com/a/57641938/5781320
Constantin

Câu trả lời:


2172

Nếu bạn không cần thay đổi thành hoạt hình thì bạn không cần sử dụng bất kỳ plugin đặc biệt nào - Tôi chỉ cần sử dụng phương thức JavaScript window.scrollTo gốc - chuyển vào 0,0 sẽ cuộn trang sang trên cùng bên trái ngay lập tức .

window.scrollTo(x-coord, y-coord);

Thông số

  • tọa độ x là pixel dọc theo trục ngang.
  • tọa độ y là pixel dọc theo trục dọc.

176
Đó là quan điểm của tôi, nếu bạn không cần phải tạo hiệu ứng cuộn trơn tru thì bạn không cần sử dụng jQuery.
daniellmb

23
Thật buồn cười vì bình luận của jeff là trung thực cho những người chỉ muốn mọi thứ hoạt động trên trình duyệt chéo 95% thời gian chỉ nên sử dụng jQuery. Điều này đến từ một người phải viết rất nhiều javascript thuần túy ngay bây giờ vì chúng tôi không đủ khả năng chi trả cho một thư viện làm chậm mã quảng cáo :(
Will

11
Câu trả lời này không liên quan gì đến câu hỏi. Sẽ ổn thôi nếu câu hỏi là: Tôi nên sử dụng kịch bản và phương pháp nào để cuộn lên đầu trang? Câu trả lời đúng là ở đây: stackoverflow.com/questions/4147112/ từ
skobaljic

2
Làm việc cho tôi trong Firefox 40 và Chrome 44 (để giải quyết nhận xét của Mikhail)
tony

10
Cuộn xuống cuối trangwindow.scrollTo(0, document.body.scrollHeight);
emix

1346

Nếu bạn muốn cuộn trơn tru, hãy thử một cái gì đó như thế này:

$("a[href='#top']").click(function() {
  $("html, body").animate({ scrollTop: 0 }, "slow");
  return false;
});

Điều đó sẽ đưa bất kỳ <a>thẻ nào có href="#top"và làm cho nó di chuyển trơn tru lên trên cùng.


+1. Tôi chỉ tự hỏi làm thế nào để làm một cái gì đó như thế này và google dẫn tôi đến đây. Câu hỏi mặc dù, chức năng "scrollTop" ở đâu trong các tài liệu? Tôi chỉ nhìn nhưng không thể tìm thấy nó.
sqram

22
scrollTop không hoạt động, nó là một thuộc tính của thành phần cửa sổ
Jalal El-Shaer

1
Điều này không hoạt động chính xác khi sử dụng gọi lại hoàn chỉnh của animate, vì nó sẽ chạy nó hai lần.
David Morales

5
"html" và "body" đều được yêu cầu để tương thích trình duyệt, tức là Chrome v27 cuộn chỉ với "body" và IE8 thì không. IE8 cuộn chỉ với "html" nhưng Chrome v27 thì không.
SushiGuy

1
@jalchr Trên thực tế, window.pageYOffsetsẽ là thuộc tính của cửa sổ đối tượng e̶l̶e̶m̶e̶n̶t̶.
Alex W

176

Hãy thử điều này để cuộn lên trên

<script>
 $(document).ready(function(){
    $(window).scrollTop(0);
});
</script>

điều này giống nhau: if ('scrollRestoration' trong lịch sử) {history.scrollRestoration = 'Manual'; }
Vasilii Suricov

123

Giải pháp tốt hơn với hình ảnh động mượt mà:

// this changes the scrolling behavior to "smooth"
window.scrollTo({ top: 0, behavior: 'smooth' });

Tham khảo: https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo#Example


Bạn vẫn có thể cần hỗ trợ polyfill cho ScrollOptions(đối với một số trình duyệt nhất định): github.com/iamdustan/smoothscroll
jneuendorf 5/12/18

Tôi thích giải pháp này rất nhiều.
SuperManEver

Ai đó có thể kiểm tra điều này trên Safari hoặc Internet Explorer và xem nó có hoạt động tốt không? Cảm ơn
Fabio Magarelli

1
@FabioMagarelli Nó hoạt động tốt trên Safari, không được thử nghiệm trên IE. FYI để kiểm tra nó trên safari mở bất kỳ trang nào có cuộn và sao chép dán mã ở trên vào Công cụ dành cho nhà phát triển -> Bảng điều khiển nó sẽ cuộn lên được xác minh hàng đầu (Phiên bản Safari 13.0.5).
Ganesh Ghalame

104

Bạn không cần jQuery để làm điều này. Một thẻ HTML tiêu chuẩn sẽ đủ ...

<div id="jump_to_me">
    blah blah blah
</div>

<a target="#jump_to_me">Click Here To Destroy The World!</a>

12
+1 Điều này tốt nếu bạn cần điều hướng đến yếu tố cụ thể thay vì chỉ lên trên cùng.
Ish

38
Sử dụng '<a href="#"> Hàng đầu </a>' để nhảy lên đầu trang.
Bakanekobrain

3
Đây có vẻ là cách tốt nhất để giao dịch với các SPA
Phil

Đẹp! Có cách nào để làm cho nó cuộn trơn tru?
ngừng hoạt động vào

65

Tất cả những gợi ý này hoạt động tuyệt vời cho các tình huống khác nhau. Đối với những người tìm thấy trang này thông qua một tìm kiếm, người ta cũng có thể cung cấp cho này một thử. JQuery, không có trình cắm thêm, cuộn đến phần tử.

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

47

cuộn trơn tru, javascript thuần túy:

(function smoothscroll(){
    var currentScroll = document.documentElement.scrollTop || document.body.scrollTop;
    if (currentScroll > 0) {
         window.requestAnimationFrame(smoothscroll);
         window.scrollTo (0,currentScroll - (currentScroll/5));
    }
})();

31
<script>
$(function(){
   var scroll_pos=(0);          
   $('html, body').animate({scrollTop:(scroll_pos)}, '2000');
});
</script>

Biên tập:

$('html, body').animate({scrollTop:(scroll_pos)}, 2000);

Một cách khác để cuộn với lề trên và bên trái:

window.scrollTo({ top: 100, left: 100, behavior: 'smooth' });

4
Bạn có chắc chắn thời lượng như chuỗi trong chức năng hoạt hình không?
Yogesh

Bạn không thể sử dụng một chuỗi cho thời lượng trong animatehàm, thay vào đó bạn nên sử dụng: $('html, body').animate({scrollTop:(scroll_pos)}, 2000);
Kenny Alvizuris

1
Điểm của gói 0 trong ngoặc đơn là gì? ((0)) sẽ chỉ đánh giá về 0.
Jack Vial

Có @Jack, bạn có thể.
Kam Meat

29
<script>

  $("a[href='#top']").click(function() {
     $("html, body").animate({ scrollTop: 0 }, "slow");
     return false;
  });
</script>

trong html

<a href="#top">go top</a>

28

Thực sự kỳ lạ: Câu hỏi này đã hoạt động được 5 năm rồi và vẫn chưa có câu trả lời JavaScript vanilla nào để tạo hiệu ứng cho cuộn cuộn Vì vậy, bạn hãy vào đây:

var scrollToTop = window.setInterval(function() {
    var pos = window.pageYOffset;
    if ( pos > 0 ) {
        window.scrollTo( 0, pos - 20 ); // how far to scroll on each step
    } else {
        window.clearInterval( scrollToTop );
    }
}, 16); // how fast to scroll (this equals roughly 60 fps)

Nếu bạn thích, bạn có thể gói nó trong một hàm và gọi nó thông qua onclickthuộc tính. Kiểm tra jsfiddle này

Lưu ý: Đây là một giải pháp rất cơ bản và có thể không phải là giải pháp hiệu quả nhất. Một ví dụ rất công phu có thể được tìm thấy ở đây: https://github.com/cferdinandi/smooth-scroll


6
Câu hỏi rõ ràng yêu cầu một giải pháp jQuery mặc dù. vì vậy không lạ
Will

2
Giải pháp tốt nhất cho tôi. Không có plugin, không có thư viện jquery cồng kềnh chỉ đơn giản là javascript. Kudos
dùng2840467

Man, tôi cũng đã tạo ra cùng một logic XD sau 5 năm, chính xác là cùng một logic, chỉ có các giá trị khác nhau như, khoảng thời gian và số nguyên mà chúng ta đang sử dụng để trừ, không thể tin XD. TBH, đã đến đây để trả lời nhưng nó đã có sẵn câu trả lời của bạn.
Germa Vinsmoke

27

Nếu bạn muốn cuộn trơn tru, vui lòng thử điều này:

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

Một giải pháp khác là JavaScript window.scrollTo phương thức:

 window.scrollTo(x-value, y-value);

Thông số :

  • x-value là pixel dọc theo trục ngang.
  • giá trị y là pixel dọc theo trục dọc.

7
copycat ... xem câu trả lời của người dùng ... Đây chỉ là phần tổng hợp của 2 câu trả lời hàng đầu ....
Laurent B

đó là một cách hợp pháp để sử dụng stackoverflow - sẽ thực tế hơn khi đặt nó ở một nơi. Joel Spolsky đã sử dụng lại việc sử dụng các câu trả lời hiện có như một ví dụ về cách stackoverflow được cho là hoạt động tại một điểm. Nếu bạn quan tâm tôi có thể thử và tìm bài đăng trên blog
Edgar H

26

Với window.scrollTo(0, 0);rất nhanh
nên tôi đã thử ví dụ Mark Ursino, nhưng trong Chrome không có gì xảy ra
và tôi đã tìm thấy điều này

$('.showPeriodMsgPopup').click(function(){
    //window.scrollTo(0, 0);
    $('html').animate({scrollTop:0}, 'slow');//IE, FF
    $('body').animate({scrollTop:0}, 'slow');//chrome, don't know if Safari works
    $('.popupPeriod').fadeIn(1000, function(){
        setTimeout(function(){$('.popupPeriod').fadeOut(2000);}, 3000);
    });
});

đã thử nghiệm cả 3 trình duyệt và nó hoạt động.
Tôi đang sử dụng bản kế hoạch chi tiết,
đây là khi khách hàng nhấp vào nút "Đặt ngay" và không chọn thời gian thuê, từ từ di chuyển lên trên cùng nơi có lịch và mở hộp thoại div trỏ đến 2 trường, sau 3 giây nó mờ dần


Cảm ơn bạn đã chỉ ra bạn cần nhắm mục tiêu cả html và cơ thể. Tôi chỉ làm việc đó với html và tự hỏi tại sao nó không hoạt động trong Chrome.
Jared

Hoạt hình cơ thể hoạt động trong Safari, vì vậy tôi đang cập nhật câu trả lời của bạn cho phù hợp.
Dave DuPlantis

46
"Đã kiểm tra cả 3 trình duyệt "? Midori, LuaKit và Konqueror, phải không? : p
Anko

14
Tại sao không chỉ làm $ ('html', 'body'). Animate ({scrollTop: 0}) thay vì thêm hai dòng?
Matt Smith

23

Một của người sử dụng khuyên bạn nên chọn cả html và thân thẻ cho khả năng tương thích qua trình duyệt, như vậy:

$('html, body').animate({ scrollTop: 0 }, callback);

Điều này có thể khiến bạn vấp ngã mặc dù nếu bạn chỉ tính đến cuộc gọi lại của mình chỉ chạy một lần. Thực tế nó sẽ chạy hai lần vì bạn đã chọn hai yếu tố.

Nếu đó là một vấn đề cho bạn, bạn có thể làm một cái gì đó như thế này:

function scrollToTop(callback) {
    if ($('html').scrollTop()) {
        $('html').animate({ scrollTop: 0 }, callback);
        return;
    }

    $('body').animate({ scrollTop: 0 }, callback);
}

Lý do hoạt động này là trong Chrome $('html').scrollTop()trả về 0, nhưng không phải trong các trình duyệt khác như Firefox.

Nếu bạn không muốn đợi hình động hoàn thành trong trường hợp thanh cuộn đã ở trên cùng, hãy thử điều này:

function scrollToTop(callback) {
    if ($('html').scrollTop()) {
        $('html').animate({ scrollTop: 0 }, callback);
        return;
    }

    if ($('body').scrollTop()) {
        $('body').animate({ scrollTop: 0 }, callback);
        return;
    }

    callback();
}

19

Người già #topcó thể làm nên chuyện

document.location.href = "#top";

Hoạt động tốt trong FF, IE và Chrome


Đẹp! Có cách nào để làm cho nó cuộn trơn tru?
ngừng hoạt động vào

bạn nên tránh các giải pháp dựa trên điều hướng, xem ý kiến ​​về câu trả lời của Sriramajeyam.
Andrew Grothe

15

$(".scrolltop").click(function() {
  $("html, body").animate({ scrollTop: 0 }, "slow");
  return false;
});
.section{
 height:400px;
}
.section1{
  background-color: #333;
}
.section2{
  background-color: red;
}
.section3{
  background-color: yellow;
}
.section4{
  background-color: green;
}
.scrolltop{
  position:fixed;
  right:10px;
  bottom:10px;
  color:#fff;
}
<html>
<head>
<title>Scroll top demo</title>
<script src="https://code.jquery.com/jquery-3.3.1.js"></script>
</head>
<body>
<div class="content-wrapper">
<div class="section section1"></div>
<div class="section section2"></div>
<div class="section section3"></div>
<div class="section section4"></div>
<a class="scrolltop">Scroll top</a>
</div>

</body>
</html>


3
Mặc dù mã này có thể trả lời câu hỏi, việc cung cấp thông tin về cách thức và lý do giải quyết vấn đề sẽ cải thiện giá trị lâu dài của nó
L_J

Giải thich câu trả lơi của bạn!
Ullas Hunka

Trong trang web, bất kỳ người dùng nào cũng nhấp vào nút cuộn trên cùng, sau đó trang sẽ cuộn lên trên cùng với hình động.
arvinda kumar

Tại sao animate () thay vì jquery scroll ()?
Akin Hwan


14

$(document).scrollTop(0); cũng hoạt động.


2
Lưu ý rằng khi bạn không sử dụng Firefox thì nó sẽ không hoạt động. Bạn gặp lỗi khi chỉ đưa ra một đối số (Lỗi: Không đủ đối số [nsIDOMWindow.scrollTo]).
Husky

14

Giải pháp không phải jQuery / JavaScript thuần túy:

document.body.scrollTop = document.documentElement.scrollTop = 0;


10

Hãy thử mã này:

$('html, body').animate({
    scrollTop: $("div").offset().top
}, time);

div => Phần tử Dom nơi bạn muốn di chuyển cuộn.

thời gian => mili giây, xác định tốc độ cuộn.


9

Giải pháp JavaScript thuần túy:

function scrollToTop() {
  window.scrollTo({
    top: 0,
    behavior: 'smooth'
});

Tôi viết một giải pháp hoạt hình trên Codepen

Ngoài ra, bạn có thể thử một giải pháp khác với thuộc scroll-behavior: smoothtính CSS .

html {
    scroll-behavior: smooth;
}

@media (prefers-reduced-motion: reduce) {
    html {
        scroll-behavior: auto;
    }
}

8

Tại sao bạn không sử dụng hàm JQuery inbuilt scrollTop:

$('html, body').scrollTop(0);//For scrolling to top

$("body").scrollTop($("body")[0].scrollHeight);//For scrolling to bottom

Ngắn gọn và đơn giản!


Bạn chỉ thiếu liên kết đến tài liệu
Cyril Duchon-Doris

8

Bạn không cần JQuery. Đơn giản là bạn có thể gọi kịch bản

window.location = '#'

khi nhấp vào nút "Chuyển đến đầu trang"

Bản demo mẫu:

output.jsbin.com/fakumo#

PS: Đừng sử dụng phương pháp này, khi bạn đang sử dụng các thư viện hiện đại như angularjs. Điều đó có thể phá vỡ hashbang URL.


9
Thật không may, đó không phải là giải pháp tốt nhất vì bạn đang thay đổi vị trí thực tế trong trường hợp đó thay vì cuộn trang. Điều đó có thể gây ra sự cố nếu vị trí là quan trọng (trong trường hợp sử dụng định tuyến góc hoặc hơn)
Yaroslav Rogoza

2
@YaroslavRogoza là chính xác. Mặc dù nó có thể hoạt động trong các trường hợp đơn giản, tôi sẽ không đề xuất giải pháp này. Vị trí ngày càng trở nên quan trọng và các ứng dụng một trang sử dụng rộng rãi hàm băm để xử lý điều hướng. Bạn sẽ ngay lập tức đưa ra một lỗi hiệu ứng phụ khi thêm điều hướng dựa trên hàm băm sau điều này hoặc điều này vào điều hướng dựa trên hàm băm.
Andrew Grothe

8

Đơn giản chỉ cần sử dụng tập lệnh này để cuộn lên đầu trực tiếp.

<script>
$(document).ready(function(){
    $("button").click(function(){
        ($('body').scrollTop(0));
    });
});
</script>

7

Nếu bạn không muốn cuộn trơn tru, bạn có thể gian lận và dừng hoạt hình cuộn mượt mà ngay khi bạn bắt đầu ... như vậy:

   $(document).ready(function() {
      $("a[href='#top']").click(function() {
          $("html, body").animate({ scrollTop: 0 }, "1");              
          $('html, body').stop(true, true);

          //Anything else you want to do in the same action goes here

          return false;                              
      });
  });

Tôi không biết liệu nó được đề xuất / cho phép hay không, nhưng nó hoạt động :)

Khi nào bạn sẽ sử dụng cái này? Tôi không chắc chắn, nhưng có lẽ khi bạn muốn sử dụng một cú nhấp chuột để tạo hiệu ứng một điều với Jquery, nhưng làm một việc khác mà không có hoạt hình? tức là mở bảng đăng nhập quản trị viên trượt ở đầu trang và ngay lập tức nhảy lên trên cùng để xem bảng.


6

Động lực

Giải pháp đơn giản này hoạt động tự nhiên và thực hiện một cuộn trơn tru đến bất kỳ vị trí nào.

Nó tránh sử dụng các liên kết neo (những người có #), theo tôi, rất hữu ích nếu bạn muốn liên kết đến một phần, nhưng không thoải mái trong một số trường hợp, đặc biệt khi chỉ lên đầu có thể dẫn đến hai URL khác nhau trỏ đến cùng một vị trí ( http://www.example.orghttp://www.example.org/# ).

Giải pháp

Đặt id vào thẻ bạn muốn cuộn, ví dụ như phần đầu tiên của bạn , câu trả lời cho câu hỏi này, nhưng id có thể được đặt ở mọi nơi trong trang.

<body>
  <section id="top">
    <!-- your content -->
  </section>
  <div id="another"><!-- more content --></div>

Sau đó, là một nút bạn có thể sử dụng một liên kết, chỉ cần chỉnh sửa thuộc tính onclick với một mã như thế này.

<a onclick="document.getElementById('top').scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'nearest' })">Click me</a>

Trong đó đối số document.getElementByIdid của thẻ bạn muốn cuộn đến sau khi nhấp.


Cảm ơn bạn! là giải pháp tuyệt vời
Hugo Stiven Laguna Rueda

@HugoStivenLagunaRueda bạn hoan nghênh, tôi đã tìm thấy nó trên MDN, vì vậy cảm ơn Mozilla. Thật tuyệt vời có bao nhiêu thứ đã ở đó, được hỗ trợ nguyên bản. Tôi yêu vani JS.
Gianluca Casati

5

Bạn chỉ có thể sử dụng mục tiêu từ liên kết của mình, chẳng hạn như #someid, trong đó #someid là id của div.

Hoặc, bạn có thể sử dụng bất kỳ số lượng plugin cuộn nào làm cho nó thanh lịch hơn.

http://plugins.jquery.com/project/ScrollTo là một ví dụ.


4

Bạn có thể thử sử dụng JS như trong Fiddle này http://jsfiddle.net/5bNmH/1/

Thêm nút "Chuyển đến đầu trang" trong phần chân trang của bạn:

<footer>
    <hr />
    <p>Just some basic footer text.</p>
    <!-- Go to top Button -->
    <a href="#" class="go-top">Go Top</a>
</footer>

4
function scrolltop() {

    var offset = 220;
    var duration = 500;

    jQuery(window).scroll(function() {
        if (jQuery(this).scrollTop() > offset) {
            jQuery('#back-to-top').fadeIn(duration);
        } else {
            jQuery('#back-to-top').fadeOut(duration);
        }
    });

    jQuery('#back-to-top').click(function(event) {
        event.preventDefault();
        jQuery('html, body').animate({scrollTop: 0}, duration);
        return false;
    });
}

4

Không có câu trả lời nào ở trên sẽ hoạt động trong SharePoint 2016.

Nó phải được thực hiện như thế này: /sharepoint/195870/

var w = document.getElementById("s4-workspace");
w.scrollTop = 0;
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.