Как прокрутить страницу вверх или вниз на якорь, используя 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');
    });
});
ade123
источник

Ответы:

427

Описание

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

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

Образец

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

scrollToAnchor('id3');

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

dknaack
источник
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">

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

bobthenob
источник
7
function scroll_to_anchor(anchor_id){
    var tag = $("#"+anchor_id+"");
    $('html,body').animate({scrollTop: tag.offset().top},'slow');
}
ipegasus
источник
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 });
})
Matt
источник
ИМХО лучшее решение, потому что оно не требует дополнительных классов и надоедливой математики для заполнения в 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);
Тимо Хуовинен
источник
2

Я придерживался своего оригинального кода, а также включил ссылку «исчезновение» в начало страницы, используя этот код, а также немного отсюда:

http://webdesignerwall.com/tutorials/animated-scroll-to-top

Работает хорошо :)

ade123
источник
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);
TuxujPes
источник
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 пикселей слева вверху.

Ramtin
источник
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);
      }
    }
  });
Frankey
источник
0

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

В функции щелчка (Jquery): -

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

HTML

<div id="resultsdiv">Where I want to scroll to</div>
Mikeys4u
источник
-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);
        }
    );
Behrouz.M
источник