เลื่อนไปอย่างราบรื่นเพื่อ div id jQuery


248

ฉันพยายามเลื่อนดูรหัส jQuery id เพื่อให้ทำงานได้อย่างถูกต้อง จากคำถามล้นสแต็คอื่นฉันลองทำตามนี้

DEMO http://jsfiddle.net/kevinPHPkevin/8tLdq/

$('#myButton').click(function() {
   $.scrollTo($('#myDiv'), 1000);
});

แต่มันไม่ทำงาน มันเพียงแค่ยึดกับ div ฉันก็ลอง

$('#myButton').click(function(event) {
     event.preventDefault();
   $.scrollTo($('#myDiv'), 1000);
});

ไม่มีความคืบหน้า


1
คุณเคยดูสิ่งนี้ไหม stackoverflow.com/questions/3432656/…
The Vanilla Thrilla

@TheVanillaThrilla ฉันได้ แต่มันดูเหมือนป่องเกินไปสำหรับการใช้งานการเชื่อมโยงเดียว
StevenPHP

1
@StevenPHP ผมได้เปลี่ยนโค้ด JavaScript ในตัวอย่างของคุณให้สอดคล้องกับคำตอบของฉันstackoverflow.com/a/26129950/947687 และการทำงานjsfiddle.net/8tLdq/643
dizel3d

OP เก่า แต่ฉันจะแชร์โพสต์นี้ให้คนอื่นที่มาจาก SE นี่คือบทความที่แบ่งปันฟังก์ชั่นง่ายๆในการแก้ปัญหา: smartik.ws/2015/01/…
Andrew Surdu

คำตอบ:


667

คุณจำเป็นต้องเคลื่อนไหว html, body

DEMO http://jsfiddle.net/kevinPHPkevin/8tLdq/1/

$("#button").click(function() {
    $('html, body').animate({
        scrollTop: $("#myDiv").offset().top
    }, 2000);
});

9
@vector ฉันมีปัญหาหนึ่งเมื่อคลิกฉันต้องต่อสู้กับ jquery เพื่อเลื่อนขึ้นวิธีการแก้ปัญหาใด ๆ
YesItsMe

@yesitsme ... ขึ้นหรือลงในกรณีของฉัน
Gray Spectrum

@GraySpectrum ขึ้นมาทันทีหลังจากคลิกเท่านั้นดูเหมือนว่ามีความล่าช้า
YesItsMe

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

พบ "การแก้ไข" บางอย่างสำหรับมัน การเลื่อนองค์ประกอบที่เหมาะสมได้รับการแก้ไขแล้ว แต่ก็ยังคงเพิ่มขึ้นเรื่อย ๆ โดยคลิกที่เป้าหมาย "เลื่อนไปยัง": var target = $(this).data("target"); $(".basics-content").animate({scrollTop: $(target).offset().top}, 1000); });คำอธิบาย: .basics-contentเป็น div ภายในของ modal ที่ฉันต้องการเลื่อนไปจริง ๆ โดยที่targetฉันให้หมายเลขรหัส ขององค์ประกอบ ...
โรลันด์

111

หากคุณต้องการแทนที่การนำทาง href-idมาตรฐานบนหน้าโดยไม่เปลี่ยนมาร์กอัพ HTML เพื่อการเลื่อนที่ราบรื่นให้ใช้สิ่งนี้ ( ตัวอย่าง ):

// handle links with @href started with '#' only
$(document).on('click', 'a[href^="#"]', function(e) {
    // target element id
    var id = $(this).attr('href');

    // target element
    var $id = $(id);
    if ($id.length === 0) {
        return;
    }

    // prevent standard hash navigation (avoid blinking in IE)
    e.preventDefault();

    // top position relative to the document
    var pos = $id.offset().top;

    // animated top scrolling
    $('body, html').animate({scrollTop: pos});
});

3
นี้ทำงานได้ดีผมอาจจะแนะนำให้บิดขนาดเล็กมากvar pos = $(id).offset().top;สามารถvar pos = $id.offset().top;
ดาวี่

ดีมาก. หากคุณต้องการให้สิ่งนี้เกิดขึ้นในบางลิงก์ (บอกว่าคุณมีข้อมูลที่จะแสดงหรือซ่อนข้อมูล) เพียงแค่เพิ่มชื่อชั้นเรียนให้พวกเขาและตรึงชื่อชั้นเรียนของคุณ (พูด scroller) ในตอนท้ายของการประกาศการแข่งขัน (เช่น [href ^ = "#"]. scroller)
ส่วนตัว

คุณจะทำเช่นนั้นโดยไม่มี jQuery ได้อย่างไร
Vadorequest

21

นี่คือ 2 เซ็นต์ของฉัน:

javascript:

$('.scroll').click(function() {
    $('body').animate({
        scrollTop: eval($('#' + $(this).attr('target')).offset().top - 70)
    }, 1000);
});

Html:

<a class="scroll" target="contact">Contact</a>

และเป้าหมาย:

<h2 id="contact">Contact</h2>

ตะเข็บนี้ใช้งานได้เฉพาะในกรณีที่คุณไม่ได้ประกาศประเภทของสิ่งนั้น
David Martins

6
การใช้evalที่นี่มีไว้เพื่ออะไร?
ผู้ทำนาย

ฉันคิดว่ามันต้อง$('html, body').animateเลื่อน
Irshad Khan

6

นี่คือสิ่งที่ฉันใช้:

<!-- jquery smooth scroll to id's -->   
<script>
$(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
        }, 500);
        return false;
      }
    }
  });
});
</script>

ความงามของกล้องนี้คือคุณสามารถใช้แฮชลิงค์และรหัสที่เกี่ยวข้องได้อย่างไม่ จำกัด โดยไม่ต้องเรียกใช้สคริปต์ใหม่สำหรับแต่ละไฟล์

หากคุณกำลังใช้ WordPress ใส่รหัสในรูปแบบของคุณของไฟล์ขวาก่อนแท็กร่างกายปิดfooter.php</body>

หากคุณไม่สามารถเข้าถึงไฟล์ชุดรูปแบบคุณสามารถฝังโค้ดในตัวแก้ไขโพสต์ / หน้า (คุณต้องแก้ไขโพสต์ในโหมดข้อความ) หรือในวิดเจ็ตข้อความที่จะโหลดขึ้นในทุกหน้า

หากคุณกำลังใช้ CMS อื่น ๆ หรือเพียงแค่ HTML </body>คุณสามารถแทรกโค้ดในส่วนที่โหลดขึ้นในทุกหน้าขวาก่อนแท็กร่างกายปิด

หากคุณต้องการรายละเอียดเพิ่มเติมเกี่ยวกับเรื่องนี้ลองดูโพสต์ด่วนของฉันที่นี่: jQuery เลื่อนไปที่ id

หวังว่าจะช่วยได้และแจ้งให้เราทราบหากคุณมีข้อสงสัย


รักอย่างเรียบง่ายและวานิลลานี่สมบูรณ์แบบ
DoPeT

5

อีกตัวอย่างหนึ่ง:

ลิงค์ HTML:

<a href="#featured" class="scrollTo">Learn More</a>

JS:

  $(".scrollTo").on('click', function(e) {
     e.preventDefault();
     var target = $(this).attr('href');
     $('html, body').animate({
       scrollTop: ($(target).offset().top)
     }, 2000);
  });

จุดยึด HTML:

  <div id="featured">My content here</div>

3

แน่ใจหรือไม่ว่าคุณกำลังโหลดไฟล์ปลั๊กอิน jQuery scrollTo

คุณอาจได้รับวัตถุ: วิธีการไม่พบข้อผิดพลาด "scrollTo" ในคอนโซล

วิธี scrollTO ไม่ใช่วิธี jquery ดั้งเดิม ในการใช้งานคุณจะต้องรวมไฟล์ jquery scroll To ไปยังปลั๊กอิน

ref: http://flesler.blogspot.in/2009/05/jqueryscrollto-142-released.html http://flesler.blogspot.in/2007/10/jqueryscrollto.html

soln: เพิ่มในส่วนหัว

<script src="\\path\to\the\jquery.scrollTo.js file"></script>

นี่ควรเป็นคำตอบที่ยอมรับได้ รหัสในคำถามนั้นถูกต้องและทำงานได้ดี ดูเหมือนว่าปลั๊กอิน scrollTo ไม่ทำงาน / ไม่ทำงาน . เขาไม่ได้ถามเกี่ยวกับวิธีที่แตกต่างในการทำสิ่งที่คล้ายกัน
Chris Kavanagh

3

สคริปต์นี้เป็นการปรับปรุงสคริปต์จาก Vector ฉันได้ทำการเปลี่ยนแปลงเล็กน้อยกับมัน ดังนั้นสคริปต์นี้ใช้ได้กับทุกลิงก์ที่มีการเลื่อนหน้าคลาส

ในตอนแรกโดยไม่ต้องผ่อนปรน:

$("a.page-scroll").click(function() {
    var targetDiv = $(this).attr('href');
    $('html, body').animate({
        scrollTop: $(targetDiv).offset().top
    }, 1000);
});

สำหรับการทำให้สบายคุณจะต้องมี Jquery UI:

<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>

เพิ่มลงในสคริปต์:

'easeOutExpo'

สุดท้าย

$("a.page-scroll").click(function() {
    var targetDiv = $(this).attr('href');
    $('html, body').animate({
        scrollTop: $(targetDiv).offset().top
    }, 1000, 'easeOutExpo');
});

ความเร็วในการเคลื่อนไหวทั้งหมดที่คุณสามารถหาได้ที่นี่: โกงแผ่น


3

รหัสนี้จะมีประโยชน์สำหรับลิงค์ภายในบนเว็บ

    $("[href^='#']").click(function() {
        id=$(this).attr("href")
        $('html, body').animate({
            scrollTop: $(id).offset().top
        }, 2000);
    });

2

สามารถทำได้ใน JS ธรรมดา:

document
    .getElementById("range-calculator")
    .scrollIntoView({ behavior: "smooth" });

สนับสนุนเบราว์เซอร์เป็นปัญหาเล็กน้อย แต่เบราว์เซอร์ที่ทันสมัยสนับสนุนมัน


1

คุณสามารถทำได้โดยใช้รหัส jQuery ง่าย ๆ ดังต่อไปนี้

สามารถดูบทช่วยสอนการสาธิตและซอร์สโค้ดได้ที่นี่ - เลื่อนไปที่ div โดยใช้ jQuery

JavaScript:

$(function() {
    $('a[href*=#]:not([href=#])').click(function() {
        var target = $(this.hash);
        target = target.length ? target : $('[name=' + this.hash.substr(1) +']');
        if (target.length) {
            $('html,body').animate({
              scrollTop: target.offset().top
            }, 1000);
            return false;
        }
    });
});

HTML:

<a href="#section1">Go Section 1</a>
<div id="section1">
    <!-- Content goes here -->
</div>

1

ที่นี่ฉันลองสิ่งนี้มันใช้งานได้ดีสำหรับฉัน

$('a[href*="#"]').on('click', function (e) {
    e.preventDefault();

    $('html, body').animate({
        scrollTop: $($(this).attr('href')).offset().top
    }, 500, 'linear');
});

HTML:

 <a href="#fast-food" class="active" data-toggle="tab" >FAST FOOD</a>

<div id="fast-food">
<p> Scroll Here... </p>
  </div>

คำตอบของคุณแตกต่างกันอย่างไร
yunandtidus


0

สิ่งนี้ใช้ได้กับฉัน

<div id="demo">
        <h2>Demo</h2>
</div>
<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
<script>
    $(document).ready(function () {
        // Handler for .ready() called.
        $('html, body').animate({
            scrollTop: $('#demo').offset().top
        }, 'slow');
    });
</script>

ขอบคุณ


0

นี่เป็นวิธีแก้ปัญหาของฉันในการเลื่อนไปยัง div / anchor อย่างราบรื่นโดยใช้ jQuery ในกรณีที่คุณมีส่วนหัวคงที่เพื่อที่จะไม่เลื่อนไปข้างใต้ นอกจากนี้ยังใช้งานได้หากคุณเชื่อมโยงจากหน้าอื่น ๆ

เพียงแค่แทนที่ ".site-header" เพื่อ div ที่มีส่วนหัวของคุณ

$(function() {

$('a[href*="#"]:not([href="#"])').click(function() {
var headerheight = $(".site-header").outerHeight();
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 - headerheight)
    }, 1000);
    return false;
  }
}
});

//Executed on page load with URL containing an anchor tag.
if($(location.href.split("#")[1])) {
var headerheight = $(".site-header").outerHeight();
  var target = $('#'+location.href.split("#")[1]);
  if (target.length) {
    $('html,body').animate({
      scrollTop: target.offset().top - headerheight
    }, 1);
    return false;
  }
}
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.