วิธีเลื่อนหน้าต่างโดยใช้ฟังก์ชัน JQuery $ .scrollTo ()


98

ฉันพยายามเลื่อนลง 100px ทุกครั้งที่ผู้ใช้เข้าใกล้ด้านบนสุดของเอกสาร

ฉันมีฟังก์ชันที่ทำงานเมื่อผู้ใช้เข้าใกล้ด้านบนสุดของเอกสาร แต่ฟังก์ชัน. scrollTo ไม่ทำงาน

ฉันแจ้งเตือนก่อนและหลังเพื่อตรวจสอบว่าเป็นบรรทัดจริงหรือไม่ที่หยุดการแจ้งเตือนและมีเพียงการแจ้งเตือนครั้งแรกเท่านั้นที่ดับลงนี่คือรหัส:

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

ฉันรู้ว่าฉันมีหน้า jquery ที่เชื่อมโยงอย่างถูกต้องเพราะฉันใช้ฟังก์ชั่น jquery อื่น ๆ มากมายและมันก็ทำงานได้ดี ฉันได้ลองลบ 'px' จากด้านบนแล้วและดูเหมือนจะไม่สร้างความแตกต่าง


3
Jquery เองก็ทำงานได้ดี แต่คุณแน่ใจหรือว่าคุณมีปลั๊กอิน scrollTo ที่เชื่อมโยงอย่างถูกต้อง? เปลี่ยนการแจ้งเตือนอย่างใดอย่างหนึ่งเพื่อแจ้งเตือน ($. scrollTo);
แอนดรูว์

คำตอบ:


97

ถ้ามันไม่ได้ผลทำไมคุณไม่ลองใช้วิธี scrollTop ของ jQuery?

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

หากคุณต้องการเลื่อนอย่างราบรื่นคุณสามารถใช้ฟังก์ชัน javascript setTimeout / setInterval พื้นฐานเพื่อให้เลื่อนเพิ่มขึ้นทีละ 1px ในระยะเวลาที่กำหนด


8
สังเกตว่าคุณต้องการเลื่อนทั้งหน้าไม่ใช่แต่ละองค์ประกอบให้ใช้ $ ('html, body') เหมือนกับที่Timชี้ไว้ที่นี่ เพียงแค่ $ ('body') จะใช้ไม่ได้ในทุกเบราว์เซอร์
i--

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

19
ฉันมักจะสงสัยว่าทำไมผู้คนถึงใช้ 'html, body' สำหรับ scrollTop แทนที่จะใช้แค่ 'html' มีความคิดเห็นเกี่ยวกับเรื่องนี้ไหม
Scott Greenfield

+1 ใช้ได้ผลสำหรับฉัน;) ฉันสนใจที่จะรู้ว่าทำไมhtml, bodyแทนที่จะเป็นแค่ html?
Kato

9
@ScottGreenfield, @Kato: ไม่แน่ใจว่าทำไม แต่ความคิดเห็นนี้บอกว่าไม่รวมbodyช่วงพักนี้บน Chrome 4: stackoverflow.com/questions/1890995/…
Yuji 'Tomita' Tomita

scrollTop: 0ยังทำงานได้ดี แต่ระยะเวลาลดลง ทำงานได้ดีถ้าตั้งค่าความเร็ว 1,000
shashwat

นี่เป็นทางออกที่ดีจนกว่าคุณจะต้องการเพิ่มวิธีการที่สมบูรณ์ - มันจะดำเนินการสองครั้ง วิธีแก้ปัญหาของ @complistic นั้นหรูหรากว่าและจะป้องกันไม่ให้สิ่งนั้น
plankguy

41

ขณะนี้ jQuery สนับสนุน scrollTop เป็นตัวแปรภาพเคลื่อนไหว

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

คุณไม่จำเป็นต้อง setTimeout / setInterval เพื่อเลื่อนอย่างราบรื่นอีกต่อไป


มีข้อผิดพลาดทางไวยากรณ์ - ไม่มีการปิด {. มิฉะนั้นนี่เป็นจุดที่ดี
โจชัว

1
มันควรจะเป็น$("#id").offset().topแทน?
codeulike

15

ที่จะได้รับรอบ htmlbodyปัญหาvs ฉันแก้ไขสิ่งนี้โดยการไม่ทำให้ css เคลื่อนไหวโดยตรง แต่เป็นการเรียกร้องwindow.scrollTo();ในแต่ละขั้นตอน:

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

ใช้งานได้ดีโดยไม่ต้องมีการรีเฟรชใด ๆ เนื่องจากใช้ JavaScript ข้ามเบราว์เซอร์

ไปที่http://james.padolsey.com/javascript/fun-with-jquerys-animate/สำหรับข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่คุณสามารถทำได้ด้วยฟังก์ชัน animate ของ jQuery


1
นี่เป็นสิ่งที่ยอดเยี่ยม ฉันเปลี่ยนwindow.pageYOffsetเป็น$(window).scrollTop()และwindow.scrollTo(0, val)เป็น$(window).scrollTop(val)เท่านั้นดังนั้นฉันจึงไม่ต้องกังวลกับความเข้ากันได้ของเบราว์เซอร์
leftclickben

1
ฉันไม่เคยคิดที่จะส่งวัตถุไปยังวิธีการเคลื่อนไหวของ jQuery แบบนั้น ใช้งานได้มากมาย วิธีนี้ดีมากขอบคุณ
Synexis

ใช่เทคนิคเป็นส่วนสำคัญ ก่อนหน้านี้มีปัญหาเกี่ยวกับเบราว์เซอร์โดยใช้ "window.scrollTo ()" โดยตรง แต่ไม่อนุญาตให้มีการโทรกลับ "ที่สมบูรณ์" หรือคำสัญญา ขอบคุณ @complistic สำหรับการแก้ปัญหานี้ นอกจากนี้ฉันขอขอบคุณ @leftclickben; ฉันใช้รูปแบบของเขาโดยใช้ ".scrollTop ()" นอกจากนี้บทความ "james.padolsey" ต่อลิงก์นั้นสั้นและคุ้มค่ามากในการอ่าน
IAM_AL_X

ฉันคิดว่า "window.scrollTo ()" น่าจะเข้ากันได้กับเบราว์เซอร์สมัยใหม่ทั้งหมด
IAM_AL_X

7

ดูเหมือนว่าคุณมีไวยากรณ์ผิดเล็กน้อย ... ฉันคิดตามรหัสของคุณว่าคุณกำลังพยายามเลื่อนลง 100px ใน 800ms ถ้าเป็นเช่นนั้นก็ใช้ได้ (โดยใช้ scrollTo 1.4.1):

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

6

จริงๆแล้วสิ่งที่ชอบ

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

จะทำงานได้ดีและรองรับช่องว่างภายใน คุณยังสามารถรองรับระยะขอบได้อย่างง่ายดาย - ดูรายละเอียดด้านล่าง

function scrollTo(prop){
    $('html,body').animate({scrollTop: $("#"+prop).offset().top 
+ parseInt($("#"+prop).css('padding-top'),10) 
+ parseInt($("#"+prop).css('margin-top'),10) +},'slow');
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.