Плавная прокрутка к якорю на JavaScript и jQuery

Плавная прокрутка к якорю на JavaScript и jQuery
Комментарии: 6

При клике по якорной ссылке браузер автоматически устанавливает положение страницы так, чтобы якорный элемент оказаля в самом верху видимой области. Но у этого подхода есть 2 недостатка: прокрутка осуществляется мгновенно и позиционирование нарушается, если на сайте используется плавающая шапка. Проблемы можно решить с помощью библиотеки jQuery или чистого javascript.

Пример якорной ссылки (нажми для перехода)

Для удобства работы с такими ссылками рекомендую установить для них определенный класс, например «scroll-to»:

<a href="#ya1" class="scroll-to">Ссылка 1</a>
<a href="#ya2" class="scroll-to">Ссылка 2</a>
<a href="#ya3" class="scroll-to">Ссылка 3</a>

У элементов, к которым нужно осуществить прокрутку, должны быть прописаны атрибуты: «id="ya1"» и так далее.

Прокрутка на jQuery

Самый простой способ организации плавной прокрутки, это использовать библиотеку jQuery.

$("a.scroll-to").on("click", function(e){
    e.preventDefault();
    var anchor = $(this).attr('href');
    $('html, body').stop().animate({
        scrollTop: $(anchor).offset().top - 60
    }, 800);
});

В примере на все ссылки с классом «scroll-to» навешивается событие «onclick». Двумя важными параметрами в этом коде являются значения «60» и «800».

  • 60 — высота фиксированной плавающей шапки, если она есть. Устанавливается чтобы при прокрутке якорный элемент не перекрывался ей. Если фиксированной шапки нет, то значение убирается или устанавливается в 0.
  • 800 — скорость прокрутки в миллисекундах. Чем меньше значение, тем быстрее будет переход.

Плавная прокрутка на чистом JS

Теперь рассмотрим код на чистом JavaScript без использования сторонних библиотек.

const anchors = document.querySelectorAll('a.scroll-to')

for (let anchor of anchors) {
  anchor.addEventListener('click', function (e) {
    e.preventDefault()
    
    const blockID = anchor.getAttribute('href')
    
    document.querySelector(blockID).scrollIntoView({
      behavior: 'smooth',
      block: 'start'
    })
  })
}

Код вырос незначительно, а функционал остался прежним. Здесь используется стандартный JavaScript метод «scrollIntoView». Он позиционирует прокрутку так, чтобы элемент оказался в видимой области браузера. Метод принимает 2 параметра:

  • behavior — определяет тип анимации — auto или smooth;
  • block — задает в какое место элемента надо переместиться, принимает значения — start, center, end или nearest.
Темы:
JavaScriptjQuery
Ещё интересное — 6
Комментарии —
  1. Евгений
    Евгений24 июня 2020, 18:14#
    document.querySelector(blockID).scrollIntoView({
    behavior: 'smooth',
    block: 'start'
    })

    Не работает в Safari
    1. Andy Si24 июня 2020, 18:31#
      Проверю как будет возможность… Safari та ещё подделка, вместе со всей яблочной продукцией.
      1. Евгений
        Евгений24 июня 2020, 18:52#
        Согласен, иногда натыкаешся на такие артефакты, потом час сидишь и не можешь понять что это только что было )

        scrollIntoView посмотрите в iOS. Я проверял в iOS версии 13.3 — не работает.

        Мне нужна была простая прокрутка страницы вверх по клику на кнопку. В итоге сделал так:

        scrollTo() {
        let element = document.getElementById(«app»),
        isSafari = window.safari !== undefined,
        is_ios = /iP(ad|od|hone)/i.test(window.navigator.userAgent);

        if (isSafari || is_ios) {
        document.body.scrollTop = 0;
        } else {
        element.scrollIntoView({behavior: «smooth», block: «start», inline: «nearest»});
        }
        }

        На iOS прокрутка не плавная, но хотя бы работает. Если найдете решение более интересное, буду благодарен.
        1. Andy Si24 июня 2020, 23:00#
          Спасибо, по возможности попробую найти оптимальное решение и для safari.
    2. Антон
      Антон27 декабря 2020, 10:17(был изменён)#
      Здравствуйте!

      Работает только в FireFox. Хром, Edge — не работает плавная прокрутка.

      Вы пробовали тестировать в разных браузерах?

      PS Нашел проблему. Может кому поможет))
      Оказывается у меня в Win10 в параметрах — Быстродействие — Параметры НЕ стояла галка на Анимированные элементы управления…
      Но FireFox игнорирует эту галку и работает плавно в не зависимости от нее!!!
      1. Andy Si27 декабря 2020, 19:15#
        Добрый день.
        В FireFox и Chrome проверял на разных компьютерах. Не замечал проблем. Спасибо за решение.
      © REALADMIN.RU   2024 г.
      Страница сгенерирована: 0,2046 s | 4 mb.
      На каком уровне Вы играете в шахматы?
      OPROS