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

При клике по якорной ссылке браузер автоматически устанавливает положение страницы так, чтобы якорный элемент оказаля в самом верху видимой области. Но у этого подхода есть 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.
behavior: 'smooth',
block: 'start'
})
Не работает в Safari
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 прокрутка не плавная, но хотя бы работает. Если найдете решение более интересное, буду благодарен.
Работает только в FireFox. Хром, Edge — не работает плавная прокрутка.
Вы пробовали тестировать в разных браузерах?
PS Нашел проблему. Может кому поможет))
Оказывается у меня в Win10 в параметрах — Быстродействие — Параметры НЕ стояла галка на Анимированные элементы управления…
Но FireFox игнорирует эту галку и работает плавно в не зависимости от нее!!!
В FireFox и Chrome проверял на разных компьютерах. Не замечал проблем. Спасибо за решение.