Làm cách nào để cuộn lên hoặc xuống trang đến một neo bằng jQuery?


176

Tôi đang tìm cách để bao gồm hiệu ứng trượt khi bạn nhấp vào liên kết đến một neo cục bộ lên hoặc xuống trang.

Tôi muốn một cái gì đó mà bạn có một liên kết như vậy:

<a href="#nameofdivetc">link text, img etc.</a>

có lẽ với một lớp được thêm vào để bạn biết bạn muốn liên kết này là liên kết trượt:

<a href="#nameofdivetc" class="sliding-link">link text, img etc.</a>

Sau đó, nếu liên kết này được nhấp, trang sẽ trượt lên hoặc xuống đến vị trí bắt buộc (có thể là div, tiêu đề, đầu trang, v.v.).


Đây là những gì tôi đã có trước đây:

    $(document).ready(function(){
    $(".scroll").click(function(event){
        //prevent the default action for the click event
        event.preventDefault();

        //get the full url - like mysitecom/index.htm#home
        var full_url = this.href;

        //split the url by # and get the anchor target name - home in mysitecom/index.htm#home
        var parts = full_url.split("#");
        var trgt = parts[1];

        //get the top offset of the target anchor
        var target_offset = $("#"+trgt).offset();
        var target_top = target_offset.top;

        //goto that anchor by setting the body scroll top to anchor top
        $('html, body').animate({scrollTop:target_top}, 1500, 'easeInSine');
    });
});

Câu trả lời:


427

Sự miêu tả

Bạn có thể làm điều này bằng cách sử dụng jQuery.offset()jQuery.animate().

Kiểm tra Trình diễn jsFiddle .

Mẫu vật

function scrollToAnchor(aid){
    var aTag = $("a[name='"+ aid +"']");
    $('html,body').animate({scrollTop: aTag.offset().top},'slow');
}

scrollToAnchor('id3');

Thêm thông tin


52
Điều này cũng có thể được tạo thành chung để hoạt động với tất cả các liên kết neo nội bộ trong trang:$("a[href^=#]").click(function(e) { e.preventDefault(); var dest = $(this).attr('href'); console.log(dest); $('html,body').animate({ scrollTop: $(dest).offset().top }, 'slow'); });
bardo

@bardo, làm thế nào để thực hiện? Tôi đã thay thế giải pháp của dkmaack bằng giải pháp của bạn, nhưng trượt không có ở đó (bản thân mỏ neo là chức năng). Tôi đang thiếu gì?
jakub

1
@bardo cũng thêm history.pushState(null, null, dest);khi bạn đang ngăn thay đổi vị trí băm mặc định
Mike Causer 7/8/2015

7
FYI ngoài giải pháp của @ bardo, bạn nên thoát khỏi hàm băm khi sử dụng jQuery mới nhất như vậy, $ ("a [href ^ = \\ #]") stackoverflow.com/questions/7717527/iêu
jaegs

1
Mục đích của hoạt hình cả html và cơ thể là gì? Trông giống như một tình huống mà chúng ta không biết những gì chúng ta làm và chỉ làm tất cả. Điều này có thể bắt đầu nhiều scollings?
ygoe

30

Giả sử rằng thuộc tính href của bạn đang liên kết đến một divid thẻ có cùng tên (như bình thường), bạn có thể sử dụng mã này:

HTML

<a href="#goto" class="sliding-link">Link to div</a>

<div id="goto">I'm the div</div>

JAVASCRIPT - (Jquery)

$(".sliding-link").click(function(e) {
    e.preventDefault();
    var aid = $(this).attr("href");
    $('html,body').animate({scrollTop: $(aid).offset().top},'slow');
});

1
Giải pháp rất đơn giản nhưng mạnh mẽ, cho phép kiểm soát hoàn toàn. Tôi nghĩ rằng câu trả lời này sẽ nhận được nhiều hơn.
thân

Đồng ý, đây là giải pháp tốt nhất và đã giúp tôi rất nhiều
có lẽ là

Nó hoạt động nhưng đánh bại mục đích sử dụng name. Khi bạn sử dụng <a name="something"></a>, bạn cũng có thể tham khảo nó từ bên ngoài, tuy nhiên, giải pháp của bạn không cung cấp điều đó.
Ramtin

8

Điều này làm cho cuộc sống của tôi dễ dàng hơn nhiều. Về cơ bản, bạn đặt thẻ id thành phần và cuộn vào thẻ mà không cần nhiều mã

http://balupton.github.io/jquery-scrollto/

Trong Javascript

$('#scrollto1').ScrollTo();

Trong html của bạn

<div id="scroollto1">

Tôi đang ở đây


7
function scroll_to_anchor(anchor_id){
    var tag = $("#"+anchor_id+"");
    $('html,body').animate({scrollTop: tag.offset().top},'slow');
}

3
Câu hỏi chính hãng, + "" có làm gì trong dòng thứ hai không?
Rob

@Rob javascript không có phép nội suy chuỗi, vì vậy, sử dụng +với chuỗi hoặc vars nối chúng, như : "#some_anchor". Thực sự, concat thứ hai anchor_id + ""là không cần thiết, tôi tin.
onebree

Cảm ơn @onebree Đó là concat thứ hai tôi đã tự hỏi về :)
Rob

5

Bạn cũng nên xem xét rằng mục tiêu có phần đệm và do đó sử dụng positionthay vì offset. Bạn cũng có thể tính đến một thanh điều hướng tiềm năng mà bạn không muốn chồng chéo mục tiêu.

const $navbar = $('.navbar');

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

    const scrollTop =
        $($(this).attr('href')).position().top -
        $navbar.outerHeight();

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

IMHO giải pháp tốt nhất bởi vì nó không cần các lớp bổ sung và toán học đệm khó chịu trong css cho các thanh điều hướng cố định
KSPR

Nhưng điều này không viết lại thẻ neo trong url. Thêm history.pushState({}, "", this.href);để giữ cho url được cập nhật
KSPR

3

Cách tiếp cận của tôi với jQuery để làm cho tất cả các liên kết neo được nhúng thay vì nhảy ngay lập tức

Nó thực sự giống với câu trả lời của Santi Nunez nhưng nó đáng tin cậy hơn .

Ủng hộ

  • Môi trường đa khung.
  • Trước khi trang tải xong.
<a href="#myid">Go to</a>
<div id="myid"></div>
// Slow scroll with anchors
(function($){
    $(document).on('click', 'a[href^=#]', function(e){
        e.preventDefault();
        var id = $(this).attr('href');
        $('html,body').animate({scrollTop: $(id).offset().top}, 500);
    });
})(jQuery);


1

Bạn có thể muốn thêm offsetTopscrollTop giá trị trong trường hợp bạn đang tạo hiệu ứng động không phải là toàn bộ trang, mà đúng hơn là một số nội dung lồng nhau.

ví dụ :

var itemTop= $('.letter[name="'+id+'"]').offset().top;
var offsetTop = $someWrapper.offset().top;
var scrollTop = $someWrapper.scrollTop();
var y = scrollTop + letterTop - offsetTop

this.manage_list_wrap.animate({
  scrollTop: y
}, 1000);

0

Cuộn chậm SS

Giải pháp này không yêu cầu thẻ neo nhưng tất nhiên bạn cần phải khớp nút menu (ví dụ thuộc tính tùy ý, 'ss') với id phần tử đích trong html của bạn.

ss="about" đưa bạn đến id="about"

$('.menu-item').click(function() {
	var keyword = $(this).attr('ss');
	var scrollTo = $('#' + keyword);
	$('html, body').animate({
		scrollTop: scrollTo.offset().top
	}, 'slow');
});
.menu-wrapper {
  display: flex;
  margin-bottom: 500px;
}
.menu-item {
  display: flex;
  justify-content: center;
  flex: 1;
  font-size: 20px;
  line-height: 30px;
  color: hsla(0, 0%, 80%, 1);
  background-color: hsla(0, 0%, 20%, 1);
  cursor: pointer;
}
.menu-item:hover {
  background-color: hsla(0, 40%, 40%, 1);
}

.content-block-header {
  display: flex;
  justify-content: center;
  font-size: 20px;
  line-height: 30px;
  color: hsla(0, 0%, 90%, 1);
  background-color: hsla(0, 50%, 50%, 1);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div class="menu-wrapper">
  <div class="menu-item" ss="about">About Us</div>
  <div class="menu-item" ss="services">Services</div>
  <div class="menu-item" ss="contact">Contact</div>
</div>

<div class="content-block-header" id="about">About Us</div>
<div class="content-block">
  Lorem ipsum dolor sit we gonna chung, crazy adipiscing phat. Nullizzle sapizzle velizzle, shut the shizzle up volutpizzle, suscipizzle quizzle, away vizzle, arcu. Pellentesque my shizz sure. Sed erizzle. I'm in the shizzle izzle funky fresh dapibus turpis tempus shizzlin dizzle. Maurizzle my shizz nibh izzle turpizzle. Gangsta izzle fo shizzle mah nizzle fo rizzle, mah home g-dizzle. I'm in the shizzle eleifend rhoncizzle fo shizzle my nizzle. In rizzle habitasse crazy dictumst. Yo dapibus. Curabitizzle tellizzle urna, pretizzle break it down, mattis izzle, eleifend rizzle, nunc. My shizz suscipit. Integer check it out funky fresh sizzle pizzle.

That's the shizzle et dizzle quis nisi sheezy mollis. Suspendisse bizzle. Morbi odio. Vivamizzle boofron. Crizzle orci. Cras mauris its fo rizzle, interdizzle a, we gonna chung amizzle, break it down izzle, pizzle. Pellentesque rizzle. Vestibulum its fo rizzle mi, volutpat uhuh ... yih!, ass funky fresh, adipiscing semper, fo shizzle. Crizzle izzle ipsum. We gonna chung mammasay mammasa mamma oo sa stuff brizzle yo. Cras ass justo nizzle purizzle sodales break it down. Check it out venenatizzle justo yo shut the shizzle up. Nunc crackalackin. Suspendisse bow wow wow placerizzle sure. Fizzle eu ante. Nunc that's the shizzle, leo eu gangster hendrerizzle, gangsta felis elementum pizzle, sizzle aliquizzle crunk bizzle luctus pede. Nam a nisl. Fo shizzle da bomb taciti gangster stuff i'm in the shizzle i'm in the shizzle per conubia you son of a bizzle, per inceptos its fo rizzle. Check it out break it down, neque izzle cool nonummy, tellivizzle orci viverra leo, bizzle semper risizzle arcu fo shizzle mah nizzle.
</div>
<div class="content-block-header" id="services">Services</div>
<div class="content-block">
Lorem ipsum dolor sit we gonna chung, crazy adipiscing phat. Nullizzle sapizzle velizzle, shut the shizzle up volutpizzle, suscipizzle quizzle, away vizzle, arcu. Pellentesque my shizz sure. Sed erizzle. I'm in the shizzle izzle funky fresh dapibus turpis tempus shizzlin dizzle. Maurizzle my shizz nibh izzle turpizzle. Gangsta izzle fo shizzle mah nizzle fo rizzle, mah home g-dizzle. I'm in the shizzle eleifend rhoncizzle fo shizzle my nizzle. In rizzle habitasse crazy dictumst. Yo dapibus. Curabitizzle tellizzle urna, pretizzle break it down, mattis izzle, eleifend rizzle, nunc. My shizz suscipit. Integer check it out funky fresh sizzle pizzle.

That's the shizzle et dizzle quis nisi sheezy mollis. Suspendisse bizzle. Morbi odio. Vivamizzle boofron. Crizzle orci. Cras mauris its fo rizzle, interdizzle a, we gonna chung amizzle, break it down izzle, pizzle. Pellentesque rizzle. Vestibulum its fo rizzle mi, volutpat uhuh ... yih!, ass funky fresh, adipiscing semper, fo shizzle. Crizzle izzle ipsum. We gonna chung mammasay mammasa mamma oo sa stuff brizzle yo. Cras ass justo nizzle purizzle sodales break it down. Check it out venenatizzle justo yo shut the shizzle up. Nunc crackalackin. Suspendisse bow wow wow placerizzle sure. Fizzle eu ante. Nunc that's the shizzle, leo eu gangster hendrerizzle, gangsta felis elementum pizzle, sizzle aliquizzle crunk bizzle luctus pede. Nam a nisl. Fo shizzle da bomb taciti gangster stuff i'm in the shizzle i'm in the shizzle per conubia you son of a bizzle, per inceptos its fo rizzle. Check it out break it down, neque izzle cool nonummy, tellivizzle orci viverra leo, bizzle semper risizzle arcu fo shizzle mah nizzle.
</div>
<div class="content-block-header" id="contact">Contact</div>
<div class="content-block">
  Lorem ipsum dolor sit we gonna chung, crazy adipiscing phat. Nullizzle sapizzle velizzle, shut the shizzle up volutpizzle, suscipizzle quizzle, away vizzle, arcu. Pellentesque my shizz sure. Sed erizzle. I'm in the shizzle izzle funky fresh dapibus turpis tempus shizzlin dizzle. Maurizzle my shizz nibh izzle turpizzle. Gangsta izzle fo shizzle mah nizzle fo rizzle, mah home g-dizzle. I'm in the shizzle eleifend rhoncizzle fo shizzle my nizzle. In rizzle habitasse crazy dictumst. Yo dapibus. Curabitizzle tellizzle urna, pretizzle break it down, mattis izzle, eleifend rizzle, nunc. My shizz suscipit. Integer check it out funky fresh sizzle pizzle.

That's the shizzle et dizzle quis nisi sheezy mollis. Suspendisse bizzle. Morbi odio. Vivamizzle boofron. Crizzle orci. Cras mauris its fo rizzle, interdizzle a, we gonna chung amizzle, break it down izzle, pizzle. Pellentesque rizzle. Vestibulum its fo rizzle mi, volutpat uhuh ... yih!, ass funky fresh, adipiscing semper, fo shizzle. Crizzle izzle ipsum. We gonna chung mammasay mammasa mamma oo sa stuff brizzle yo. Cras ass justo nizzle purizzle sodales break it down. Check it out venenatizzle justo yo shut the shizzle up. Nunc crackalackin. Suspendisse bow wow wow placerizzle sure. Fizzle eu ante. Nunc that's the shizzle, leo eu gangster hendrerizzle, gangsta felis elementum pizzle, sizzle aliquizzle crunk bizzle luctus pede. Nam a nisl. Fo shizzle da bomb taciti gangster stuff i'm in the shizzle i'm in the shizzle per conubia you son of a bizzle, per inceptos its fo rizzle. Check it out break it down, neque izzle cool nonummy, tellivizzle orci viverra leo, bizzle semper risizzle arcu fo shizzle mah nizzle.
</div>

Vĩ cầm

https://jsfiddle.net/Hastig/stcstmph/4/


0

Đây là giải pháp hiệu quả với tôi. Đây là một hàm chung hoạt động cho tất cả các athẻ tham chiếu đến một tên được đặt têna

$("a[href^=#]").on('click', function(event) { 
    event.preventDefault(); 
    var name = $(this).attr('href'); 
    var target = $('a[name="' + name.substring(1) + '"]'); 
    $('html,body').animate({ scrollTop: $(target).offset().top }, 'slow'); 
});

Lưu ý 1: Đảm bảo rằng bạn sử dụng dấu ngoặc kép " trong html của mình. Nếu bạn sử dụng dấu ngoặc đơn, thay đổi phần trên của mã thànhvar target = $("a[name='" + name.substring(1) + "']");

Lưu ý 2: Trong một số trường hợp, đặc biệt là khi bạn sử dụng thanh dính từ bootstrap, tên được đặt asẽ ẩn bên dưới thanh điều hướng. Trong những trường hợp đó (hoặc bất kỳ trường hợp tương tự nào), bạn có thể giảm số lượng pixel từ cuộn của mình để đạt được vị trí tối ưu. Ví dụ: $('html,body').animate({ scrollTop: $(target).offset().top - 15 }, 'slow');sẽ đưa bạn đến targetvới 15 pixel còn lại ở trên cùng.


0

Tôi tình cờ thấy ví dụ này trên https://css-tricks.com/snippets/jquery/smooth-scrolling/ giải thích mọi dòng mã. Tôi thấy đây là lựa chọn tốt nhất.

https://css-tricks.com/snippets/jquery/smooth-scrolling/

Bạn có thể đi bản địa:

window.scroll({
  top: 2500, 
  left: 0, 
  behavior: 'smooth' 
});

window.scrollBy({ 
  top: 100, // could be negative value
  left: 0, 
  behavior: 'smooth' 
});

document.querySelector('.hello').scrollIntoView({ 
  behavior: 'smooth' 
});

hoặc với jquery:

$('a[href*="#"]').not('[href="#"]').not('[href="#0"]').click(function(event) {

    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) {
        event.preventDefault();
        $('html, body').animate({
          scrollTop: target.offset().top
        }, 1000);
      }
    }
  });

0

Phương pháp đơn giản nhất là: -

Trong chức năng nhấp (Jquery): -

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

HTML

<div id="resultsdiv">Where I want to scroll to</div>

-1
$(function() {
    $('a#top').click(function() {
        $('html,body').animate({'scrollTop' : 0},1000);
    });
});

Kiểm tra nó ở đây:

http://jsbin.com/ucati4


3
Vui lòng không bao gồm chữ ký, đặc biệt là chữ ký có liên kết ... và đặc biệt là chữ ký có liên kết không liên quan. Bạn có thể đặt loại điều đó trong hồ sơ của bạn.
Andrew Barber

Câu hỏi được hỏi không phải là làm thế nào để cuộn lên đầu trang, mà là cách cuộn đến một neo với id
user1380540

Có cách nào tôi có thể sử dụng nó trong WordPress không? Đang thêm vào trang web của tôi nhưng nó không thực sự hoạt động. Đây là đường dẫn: scentology.burnnotice.co.za
tác nhân người dùng

-1

giải pháp sau đây làm việc cho tôi:

$("a[href^=#]").click(function(e)
        {
            e.preventDefault();
            var aid = $(this).attr('href');
            console.log(aid);
            aid = aid.replace("#", "");
            var aTag = $("a[name='"+ aid +"']");
            if(aTag == null || aTag.offset() == null)
                aTag = $("a[id='"+ aid +"']");

            $('html,body').animate({scrollTop: aTag.offset().top}, 1000);
        }
    );
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.