เลื่อนไปที่ด้านบนของหน้าโดยใช้ JavaScript?


1592

ฉันจะเลื่อนไปที่ด้านบนของหน้าโดยใช้ JavaScript ได้อย่างไร เป็นที่พึงประสงค์แม้ว่าแถบเลื่อนจะกระโดดไปด้านบนทันที ฉันไม่ได้มองหาการเลื่อนที่ราบรื่น


2019 เพื่อหลีกเลี่ยง“ ไซต์นี้ดูเหมือนจะใช้เอฟเฟกต์การวางตำแหน่งที่เชื่อมโยงแบบเลื่อน สิ่งนี้อาจทำงานได้ไม่ดีกับการแพนแบบอะซิงโครนัส” ใช้สคริปต์stackoverflow.com/a/57641938/5781320
คอนสแตนตินใน

คำตอบ:


2170

หากคุณไม่ต้องการเปลี่ยนแปลงภาพเคลื่อนไหวคุณไม่จำเป็นต้องใช้ปลั๊กอินพิเศษใด ๆ - ฉันแค่ใช้ JavaScript ดั้งเดิม window.scrollTo method - การผ่าน 0,0 จะเป็นการเลื่อนหน้าไปทางซ้ายบนทันที .

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

พารามิเตอร์

  • x-coord เป็นพิกเซลตามแนวแกนนอน
  • y-coord เป็นพิกเซลตามแนวแกนตั้ง

176
นั่นคือประเด็นของฉันหากคุณไม่จำเป็นต้องเลื่อนภาพเคลื่อนไหวอย่างราบรื่นคุณก็ไม่จำเป็นต้องใช้ jQuery
daniellmb

22
ความคิดเห็นตลก ๆ ของเจฟฟ์นั้นตรงไปตรงมาสำหรับผู้ที่ต้องการให้สิ่งต่าง ๆ ทำงานข้ามเบราว์เซอร์ 95% ของเวลาควรใช้ jQuery นี้จะมาจากคนที่มีการเขียนมากจาวาสคริปต์บริสุทธิ์ในขณะนี้เพราะเราไม่สามารถจ่ายค่าใช้จ่ายของห้องสมุดชะลอตัวลงโค้ดโฆษณา :(
Will

11
คำตอบนี้ไม่เกี่ยวข้องกับคำถาม มันจะดีถ้าคำถามคือ: ฉันควรใช้สคริปต์และวิธีการเพื่อเลื่อนไปที่ด้านบนของหน้า? คำตอบที่ถูกต้องอยู่ที่นี่: stackoverflow.com/questions/4147112/…
skobaljic

2
ทำงานกับฉันใน Firefox 40 และ Chrome 44 (เพื่อพูดถึงความคิดเห็นของ Mikhail)
โทนี

10
เลื่อนไปที่ด้านล่างของหน้าwindow.scrollTo(0, document.body.scrollHeight);
emix

1344

หากคุณต้องการการเลื่อนที่ราบรื่นลองทำดังนี้:

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

ที่จะใช้<a>แท็กที่มีhref="#top"และทำให้เลื่อนไปด้านบนได้อย่างราบรื่น


+1 ฉันแค่สงสัยว่าจะทำอะไรเช่นนี้และ google จะพาฉันมาที่นี่ คำถามแม้ว่าฟังก์ชั่น "scrollTop" ในเอกสารนั้นอยู่ที่ไหน? ฉันแค่มอง แต่ไม่สามารถหาได้
sqram

22
scrollTop ไม่ได้เป็นฟังก์ชั่นมันเป็นคุณสมบัติขององค์ประกอบหน้าต่าง
Jalal El-Shaer

1
สิ่งนี้ทำงานไม่ถูกต้องเมื่อใช้การโทรกลับแบบสมบูรณ์ของภาพเคลื่อนไหวเนื่องจากจะทำงานสองครั้ง
David Morales

5
"html" และ "body" เป็นสิ่งจำเป็นสำหรับความเข้ากันได้ของเบราว์เซอร์เช่น Chrome v27 scrolls โดยใช้เพียง "body" และ IE8 ไม่ได้ IE8 เลื่อนด้วย "html" แต่ Chrome v27 ไม่ได้
SushiGuy

1
@jalchr ที่จริงแล้วwindow.pageYOffsetจะเป็นทรัพย์สินของหน้าต่างe̶l̶e̶m̶e̶n̶t̶
Alex W

176

ลองใช้วิธีนี้เพื่อเลื่อนไปด้านบน

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

นี่คือสิ่งเดียวกัน: if ('scrollRestoration' ในประวัติ) {history.scrollRestoration = 'manual'; }
Vasilii Suricov

123

ทางออกที่ดีกว่าด้วยแอนิเมชันที่ราบรื่น:

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

การอ้างอิง: https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo#Example


คุณอาจยังต้องสนับสนุน polyfill สำหรับScrollOptions(สำหรับเบราว์เซอร์บางตัว): github.com/iamdustan/smoothscroll
jneuendorf

ฉันชอบวิธีนี้มาก
SuperManEver

ใครสามารถทดสอบสิ่งนี้บน Safari หรือ Internet Explorer และดูว่าทำงานได้ดีหรือไม่ ขอบคุณ
Fabio Magarelli

1
@FabioMagarelli ทำงานได้ดีบน Safari ไม่ได้ทดสอบกับ IE FYI เพื่อทดสอบบนซาฟารีเปิดหน้าใด ๆ ที่มีการเลื่อนและคัดลอกวางโค้ดด้านบนในเครื่องมือสำหรับนักพัฒนา -> คอนโซลมันจะเลื่อนไปที่การตรวจสอบด้านบน (Safari เวอร์ชัน 13.0.5)
Ganesh Ghalame

104

คุณไม่ต้องการ jQuery ในการทำเช่นนี้ แท็ก HTML มาตรฐานจะพอเพียง ...

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

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

12
+1 สิ่งนี้ดีถ้าคุณต้องการนำทางไปยังองค์ประกอบเฉพาะแทนที่จะไปด้านบน
Ish

38
ใช้ '<a href="#"> ด้านบน </a>' เพื่อข้ามไปด้านบนของหน้า
Bakanekobrain

3
นี่น่าจะเป็นวิธีที่ดีที่สุดเมื่อต้องรับมือกับสปา
ฟิล

ดี! มีวิธีทำให้เลื่อนอย่างราบรื่นหรือไม่?
stallingOne

65

คำแนะนำเหล่านี้ใช้ได้ดีสำหรับสถานการณ์ต่าง ๆ สำหรับผู้ที่พบหน้านี้โดยการค้นหาหนึ่งยังสามารถให้นี้ลอง JQuery ไม่มีปลั๊กอินเลื่อนไปที่องค์ประกอบ

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


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

แก้ไข:

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

อีกวิธีหนึ่งที่เลื่อนด้วยระยะขอบด้านบนและด้านซ้าย:

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

4
คุณแน่ใจหรือไม่ว่าช่วงเวลาที่เป็นสตริงในฟังก์ชั่นภาพเคลื่อนไหวทำงานได้หรือไม่
yogesh

คุณไม่สามารถใช้สตริงเป็นระยะเวลาในanimateฟังก์ชั่น แต่คุณควรใช้: $('html, body').animate({scrollTop:(scroll_pos)}, 2000);
Kenny Alvizuris

1
จุดตัด 0 ในวงเล็บคืออะไร? ((0)) จะประเมินเป็น 0
Jack Vial

ใช่ @ แจ็คคุณทำได้
Kamlesh

29
<script>

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

ใน html

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

28

แปลกจริงๆ: คำถามนี้มีการใช้งานเป็นเวลาห้าปีแล้วและยังไม่มีคำตอบของวานิลลาจาวาในการเคลื่อนไหวการเลื่อน ... ดังนั้นคุณจะไปที่นี่:

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)

ถ้าคุณชอบคุณสามารถปิดสิ่งนี้ในฟังก์ชั่นและเรียกมันว่าผ่านทางonclickแอตทริบิวต์ ตรวจสอบjsfiddleนี้

หมายเหตุ: นี่เป็นวิธีแก้ปัญหาขั้นพื้นฐานและอาจไม่ใช่วิธีที่มีประสิทธิภาพมากที่สุด ตัวอย่างที่ละเอียดมากสามารถพบได้ที่นี่: https://github.com/cferdinandi/smooth-scroll


6
คำถามจะถามอย่างชัดเจนถึงวิธีการแก้ปัญหา jQuery ไม่แปลกเลย
จะ

2
ทางออกที่ดีที่สุดสำหรับฉัน ไม่มีปลั๊กอินไม่มีห้องสมุด jquery ขนาดใหญ่เพียงแค่จาวาสคริปต์ตรงไปตรงมา Kudos
2840467

มนุษย์ฉันสร้างตรรกะเดียวกัน XD นี้หลังจาก 5 ปีตรรกะเดียวกันเท่านั้นค่าต่าง ๆ เช่นช่วงเวลาและจำนวนเต็มที่เราใช้ในการลบไม่เชื่อ XD TBH มาที่นี่เพื่อตอบ แต่มันมีคำตอบแล้ว
Germa Vinsmoke

27

หากคุณต้องการเลื่อนแบบราบรื่นโปรดลองสิ่งนี้:

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

อีกวิธีคือ JavaScript window.scrollTo วิธีการ:

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

พารามิเตอร์:

  • ค่า x คือพิกเซลตามแนวแกนนอน
  • ค่า y คือพิกเซลตามแนวแกนตั้ง

7
copycat ... ดูคำตอบของผู้ใช้ ... นี่เป็นเพียงการรวบรวม 2 คำตอบยอดนิยม ....
Laurent B

นั่นเป็นวิธีที่ถูกต้องตามกฎหมายในการใช้ stackoverflow - เป็นประโยชน์มากกว่าที่จะมีไว้ในที่เดียว Joel Spolsky ใช้คำตอบที่มีอยู่แล้วซ้ำอีกครั้งเพื่อเป็นตัวอย่างของวิธีการทำงานของ stackoverflow ในจุดหนึ่ง หากคุณสนใจฉันสามารถลองและค้นหาโพสต์บล็อก
Edgar H

26

ด้วยwindow.scrollTo(0, 0);ความรวดเร็ว
ดังนั้นฉันจึงลองตัวอย่าง Mark Ursino แต่ใน Chrome ไม่มีอะไรเกิดขึ้น
และฉันพบสิ่งนี้

$('.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);
    });
});

ทดสอบทั้ง 3 เบราว์เซอร์และใช้งานได้
ฉันกำลังใช้ blueprint css
นี่คือเมื่อลูกค้าคลิกปุ่ม "จองเลย" และไม่มีการเลือกระยะเวลาการเช่าค่อย ๆ เลื่อนไปด้านบนสุดที่ปฏิทินอยู่และเปิด div dialog ที่ชี้ไปที่ 2 ฟิลด์หลังจาก 3 วินาทีมันจะจางหายไป


ขอบคุณที่ชี้ให้เห็นว่าคุณต้องกำหนดเป้าหมายทั้ง HTML และเนื้อหา ฉันเพิ่งทำเพื่อ HTML และสงสัยว่าทำไมมันไม่ทำงานใน Chrome
Jared

ภาพเคลื่อนไหวร่างกายทำงานได้ใน Safari ดังนั้นฉันจึงอัปเดตคำตอบของคุณ
Dave DuPlantis

46
"ทดสอบเบราว์เซอร์ทั้ง 3 รายการ " หรือไม่ Midori, LuaKit และ Konqueror ใช่มั้ย : p
Anko

14
ทำไมไม่ทำแค่ $ ('html', 'body'). animate ({scrollTop: 0}) แทนที่จะเพิ่มสองบรรทัด?
Matt Smith

23

จำนวนมาก ของ ผู้ใช้ขอแนะนำให้เลือกทั้ง HTML และร่างกายแท็กสำหรับการทำงานร่วมกันข้ามเบราว์เซอร์เช่นดังนั้น:

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

วิธีนี้จะช่วยให้คุณรู้ว่าคุณกำลังโทรกลับทำงานเพียงครั้งเดียว ในความเป็นจริงมันจะทำงานสองครั้งเพราะคุณได้เลือกสององค์ประกอบ

หากนั่นเป็นปัญหาสำหรับคุณคุณสามารถทำสิ่งนี้:

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

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

เหตุผลที่การทำงานใน Chrome $('html').scrollTop()ส่งคืน 0 แต่ไม่ใช่ในเบราว์เซอร์อื่นเช่น Firefox

หากคุณไม่ต้องการรอให้แอนิเมชั่นดำเนินการในกรณีที่แถบเลื่อนอยู่ด้านบนให้ลองทำดังนี้:

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

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

    callback();
}

19

คนเฒ่าคนแก่#topสามารถทำกลอุบาย

document.location.href = "#top";

ทำงานได้ดีใน FF, IE และ Chrome


ดี! มีวิธีทำให้เลื่อนอย่างราบรื่นหรือไม่?
stallingOne

คุณควรหลีกเลี่ยงโซลูชันที่อิงการนำทางดูความคิดเห็นเกี่ยวกับคำตอบของ 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
ในขณะที่รหัสนี้อาจตอบคำถามโดยให้ข้อมูลเกี่ยวกับวิธีการและเหตุผลในการแก้ปัญหาช่วยเพิ่มมูลค่าในระยะยาว
L_J

อธิบายคำตอบของคุณ!
Ullas Hunka

ในหน้าเว็บผู้ใช้จะคลิกที่ปุ่มเลื่อนด้านบนจากนั้นหน้าจะเลื่อนด้านบนสุดพร้อมภาพเคลื่อนไหว
arvinda kumar

ทำไมต้องเคลื่อนไหว () แทนที่จะเลื่อน jquery ()
Akin Hwan


14

$(document).scrollTop(0); ยังใช้งานได้


2
โปรดทราบว่าเมื่อคุณไม่ใช้ Firefox สิ่งนี้จะไม่ทำงาน คุณได้รับข้อผิดพลาดเมื่อให้อาร์กิวเมนต์เดียวเท่านั้น (ข้อผิดพลาด: มีอาร์กิวเมนต์ไม่เพียงพอ [nsIDOMWindow.scrollTo])
ฮัสกี้

14

โซลูชันที่ไม่ใช่ jQuery / JavaScript บริสุทธิ์:

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


10

ลองรหัสนี้:

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

div =>องค์ประกอบ Dom ที่คุณต้องการเลื่อนดู

เวลา =>มิลลิวินาทีกำหนดความเร็วของการเลื่อน



8

คุณไม่ต้องการ JQuery เพียงคุณเรียกสคริปต์

window.location = '#'

เมื่อคลิกปุ่ม "ไปด้านบน"

ตัวอย่างตัวอย่าง:

output.jsbin.com/fakumo#

PS: อย่าใช้วิธีการนี้เมื่อคุณใช้ห้องสมุดที่ทันสมัยเช่น angularjs นั่นอาจทำให้ URL hashbang เสียหาย


9
น่าเสียดายที่นี่ไม่ใช่ทางออกที่ดีที่สุดเนื่องจากคุณกำลังเปลี่ยนตำแหน่งในกรณีนั้นแทนที่จะเลื่อนหน้า นั่นอาจทำให้เกิดปัญหาหากสถานที่มีความสำคัญ (ในกรณีที่ใช้การกำหนดเส้นทางเชิงมุมหรือดังนั้น)
Yaroslav Rogoza

2
@YaroslavRogoza ถูกต้อง แม้ว่ามันอาจใช้งานได้ในกรณีง่าย ๆ แต่ฉันไม่แนะนำวิธีแก้ปัญหานี้ สถานที่กำลังมีความสำคัญมากขึ้นเรื่อย ๆ และแอพพลิเคชั่นหน้าเดียวใช้แฮชอย่างกว้างขวางเพื่อจัดการการนำทาง คุณจะแนะนำบั๊กผลข้างเคียงทันทีเมื่อเพิ่มการนำทางแบบแฮชหลังจากนี้หรือสิ่งนี้ไปยังการนำทางแบบแฮช
Andrew Grothe

8

ใช้สคริปต์นี้เพื่อเลื่อนไปด้านบนโดยตรง

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

8

โซลูชัน JavaScript แบบเพียว:

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

ฉันเขียนโซลูชันเคลื่อนไหวบนCodepen

นอกจากนี้คุณสามารถลองโซลูชันอื่นด้วยscroll-behavior: smoothคุณสมบัติCSS

html {
    scroll-behavior: smooth;
}

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

7

หากคุณไม่ต้องการการเลื่อนแบบราบรื่นคุณสามารถโกงและหยุดภาพเคลื่อนไหวการเลื่อนแบบนุ่มนวลได้ในทันทีที่คุณเริ่ม ...

   $(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;                              
      });
  });

ฉันไม่รู้ว่าจะแนะนำ / อนุญาต แต่ใช้งานได้ :)

เมื่อไหร่ที่คุณจะใช้มัน ฉันไม่แน่ใจ แต่บางทีเมื่อคุณต้องการใช้คลิกเดียวเพื่อเคลื่อนไหวสิ่งหนึ่งกับ Jquery แต่ทำอีกอย่างที่ไม่มีภาพเคลื่อนไหว เช่นเปิดแผงเข้าสู่ระบบผู้ดูแลระบบแบบเลื่อนด้านบนของหน้าและข้ามไปด้านบนเพื่อดูทันที


6

แรงจูงใจ

โซลูชันที่เรียบง่ายนี้ทำงานได้อย่างเป็นธรรมชาติและใช้การเลื่อนอย่างราบรื่นไปยังตำแหน่งใดก็ได้

มันหลีกเลี่ยงการใช้ลิงค์เชื่อมโยง (ที่มี#) ซึ่งในความคิดของฉันมีประโยชน์ถ้าคุณต้องการเชื่อมโยงไปยังส่วน แต่ไม่สะดวกในบางสถานการณ์โดยเฉพาะเมื่อชี้ไปที่ด้านบนซึ่งอาจนำไปสู่สอง URL ที่แตกต่างกันชี้ไปที่ ตำแหน่งเดียวกัน ( http://www.example.orgและhttp://www.example.org/# )

สารละลาย

ใส่รหัสในแท็กที่คุณต้องการเลื่อนตัวอย่างเช่นส่วนแรกของคุณที่ตอบคำถามนี้ แต่สามารถวางidได้ทุกที่ในหน้า

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

จากนั้นเป็นปุ่มที่คุณสามารถใช้ลิงก์ได้เพียงแก้ไขแอตทริบิวต์onclickด้วยรหัสเช่นนี้

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

โดยที่อาร์กิวเมนต์document.getElementByIdคือidของแท็กที่คุณต้องการเลื่อนไปหลังจากคลิก


ขอบคุณ! เป็นทางออกที่ดี
Hugo Stiven Laguna Rueda

@HugoStivenLagunaRueda คุณยินดีฉันพบมันใน MDN ดังนั้นขอบคุณ Mozilla มันยอดเยี่ยมมากมีหลายสิ่งอยู่แล้ว ฉันรักวานิลลา JS
Gianluca Casati

5

คุณสามารถใช้เป้าหมายจากลิงก์ของคุณเช่น #someid โดยที่ #someid เป็น id ของ div

หรือคุณสามารถใช้ปลั๊กอินการเลื่อนจำนวนเท่าใดก็ได้ที่ทำให้สิ่งนี้สวยงามยิ่งขึ้น

http://plugins.jquery.com/project/ScrollToเป็นตัวอย่าง


4

คุณสามารถลองใช้ JS ได้ใน Fiddle นี้http://jsfiddle.net/5bNmH/1/

เพิ่มปุ่ม "ไปที่ด้านบน" ในส่วนท้ายของหน้าของคุณ:

<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;
    });
}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.