Як прокручувати сторінку вгору або вниз до якоря за допомогою jQuery?


176

Я шукаю спосіб включити ефект слайда, коли ви клацаєте посилання на локальний якір або вгору, або вниз по сторінці.

Мені б хотілося щось, де у вас є таке посилання:

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

можливо, з доданим класом, щоб ви знали, що хочете, щоб це посилання було розсувним посиланням:

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

Потім, якщо натиснути це посилання, сторінка ковзає вгору або вниз до потрібного місця (це може бути розділ, заголовок, початок сторінки тощо).


Це те, що я раніше:

    $(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

@bardo, як це потрібно реалізувати? Я замінив рішення dkmaack на ваше, але ковзання немає (сам якор функціональний). Що я пропускаю?
Якуб

1
@bardo також додайте, history.pushState(null, null, dest);оскільки ви заважаєте змінити хеш місцеположення за замовчуванням
Майк Каузер

7
FYI на додаток до @ Бардо рішення, ви повинні уникнути хеша при використанні останньої JQuery , як це так, $ ( «а [HREF = \\ #]») stackoverflow.com/questions/7717527 / ...
jaegs

1
Яка мета анімації як html, так і тіла? Схоже на ситуацію, коли ми не знаємо, що робимо, і просто робимо все. Чи може це почати численні осколки?
ygoe

30

Якщо припустити, що ваш атрибут 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

Дякую @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 });
})

IMHO - найкраще рішення, оскільки йому не потрібні додаткові класи та дратівлива математика накладки в 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 повільна прокрутка

Для цього рішення не потрібні якірні теги, але вам, звичайно, потрібно відповідати кнопку меню (довільний атрибут, наприклад '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.