Как прокрутить страницу вверх или вниз на якорь, используя jQuery?


176

Я ищу способ включить эффект слайда, когда вы нажимаете ссылку на локальный якорь вверх или вниз по странице.

Я хотел бы что-то, где у вас есть ссылка, например:

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

возможно, с добавлением класса, чтобы вы знали, что эта ссылка должна быть скользящей:

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

Затем, если щелкнуть эту ссылку, страница переместится вверх или вниз в нужное место (это может быть div, заголовок, верх страницы и т. Д.).


Это то, что я имел ранее:

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

Ответы:


427

Описание

Вы можете сделать это, используя jQuery.offset()и jQuery.animate().

Проверьте демонстрацию jsFiddle .

Образец

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

scrollToAnchor('id3');

Больше информации


52
Это также можно сделать общим для работы со всеми внутренними якорными ссылками на странице:$("a[href^=#]").click(function(e) { e.preventDefault(); var dest = $(this).attr('href'); console.log(dest); $('html,body').animate({ scrollTop: $(dest).offset().top }, 'slow'); });
bardo

@ Бардо, как это должно быть реализовано? Я заменил решение dkmaack на ваше, но скольжения там нет (сам якорь работает). Чего мне не хватает?
Якуб

1
@bardo также добавьте, history.pushState(null, null, dest);поскольку вы предотвращаете изменение хэша местоположения по умолчанию
Mike Causer

7
К вашему сведению, в дополнение к решению @ bardo, вы должны экранировать хеш при использовании последней версии jQuery, например, $ ("a [href ^ = \\ #]") stackoverflow.com/questions/7717527/…
jaegs

1
Какова цель анимации как HTML, так и тела? Похоже, ситуация, когда мы не знаем, что делаем, и просто делаем все это. Может ли это начать несколько проклинаний?
ygoe

31

Если предположить , что ваш HREF атрибута ссылки на DIV с тегом идентификатором с таким же именем (как обычно), вы можете использовать этот код:

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
Очень простое, но мощное решение, которое позволяет полностью контролировать. Я думаю, что этот ответ должен получить больше голосов.
cronfy

Согласитесь, это лучшее решение и мне очень помогло
вероятно,

Это работает, но побеждает цель использования name. Когда вы используете <a name="something"></a>, вы также можете ссылаться на него извне, однако ваше решение этого не обеспечивает.
Рамтин

8

Это сделало мою жизнь намного проще. Вы в основном вставляете тэг id элементов и его прокрутки к нему без большого количества кода

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

В JavaScript

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

В вашем HTML

<div id="scroollto1">

Здесь я весь путь вниз по странице


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

3
Подлинный вопрос, + "" что-нибудь делает во второй строке?
Роб

@Rob Javascript не имеет строки интерполяции, поэтому использование +со строками или вары сцепляет их, как: "#some_anchor". Действительно, второй конкат anchor_id + ""не нужен, я считаю.
августа

Спасибо @onebree Это был второй конкат, о котором я задумывался :)
Роб

5

Вам также следует учитывать, что у цели есть отступы и, следовательно, использовать positionвместо offset. Вы также можете учесть потенциальную навигационную панель, которую вы не хотите перекрывать с целью.

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

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

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

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

ИМХО лучшее решение, потому что оно не требует дополнительных классов и надоедливой математики для заполнения в css для фиксированных панелей навигации
KSPR

Но это не переписывает тег привязки в URL. Добавьте, history.pushState({}, "", this.href);чтобы держать URL обновленным
KSPR

3

Мой подход с jQuery просто сделать так, чтобы все встроенные якорные ссылки скользили, а не переходили мгновенно

Это действительно похоже на ответ Санти Нуньес, но это более надежно .

Служба поддержки

  • Многофункциональная среда.
  • До того, как страница закончила загрузку.
<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

Возможно, вы захотите добавить значения offsetTop и scrollTop в случае, если вы анимируете не всю страницу, а скорее некоторое вложенное содержимое.

например:

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

SS Slow Scroll

Это решение не требует привязки тегов, но вам, конечно, нужно сопоставить кнопку меню (например, произвольный атрибут, 'ss') с идентификатором целевого элемента в html.

ss="about" берет вас к 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>

скрипка

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


0

Вот решение, которое сработало для меня. Это универсальная функция, которая работает для всех aтегов, относящихся к именованнымa

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

Примечание 1: убедитесь, что вы используете двойные кавычки " в своем HTML. Если вы используете одинарные кавычки, измените приведенную выше часть кода наvar target = $("a[name='" + name.substring(1) + "']");

Примечание 2: В некоторых случаях, особенно когда вы используете липкую панель из начальной загрузки, имя aбудет скрыто под панелью навигации. В этих случаях (или в любом другом подобном случае) вы можете уменьшить количество пикселей от прокрутки для достижения оптимального местоположения. Например: $('html,body').animate({ scrollTop: $(target).offset().top - 15 }, 'slow');вы попадете на target15 пикселей слева вверху.


0

Я наткнулся на этот пример на https://css-tricks.com/snippets/jquery/smooth-scrolling/, объясняя каждую строку кода. Я нашел это лучшим вариантом.

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

Вы можете перейти на родную:

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

или с помощью 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

Хорошо, самый простой способ:

В функции щелчка (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);
    });
});

Проверьте это здесь:

http://jsbin.com/ucati4


3
Пожалуйста, не включайте подписи, особенно со ссылками ... и особенно с несвязанными ссылками. Вы можете поместить такие вещи в свой профиль.
Эндрю Барбер

Задавался вопрос не о том, как прокрутить страницу вверх, а о том, как прокрутить до якоря с идентификатором
user1380540

Есть ли способ, которым я могу использовать это в WordPress? Я добавляю на свой сайт, но это на самом деле не работает. Вот ссылка: scentology.burnnotice.co.za
пользовательский агент

-1

у меня сработало следующее решение:

$("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);
        }
    );
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.