Переходы между view

Плавная прокрутка (Smooth Scroll) используется для создания аккуратных переходов между различными секциями страницы. В JavaScript это реализуется через работу с DOM, событиями и методами прокрутки, такими как scrollTo и scrollIntoView.

document.querySelector('#target').scrollIntoView({
  beh * avior: 'smooth',
  block: 'start'
});

В этом примере beh * avior: 'smooth' обеспечивает анимацию прокрутки. Параметр block отвечает за позиционирование элемента относительно видимой области (start, center, end, nearest).


Использование window.scrollTo для точного контроля

Метод window.scrollTo позволяет задавать координаты и управлять анимацией:

window.scrollTo({
  top: 500,
  left: 0,
  beh * avior: 'smooth'
});
  • top — вертикальная позиция прокрутки в пикселях.
  • left — горизонтальная позиция.
  • behavior — определяет тип прокрутки (auto или smooth).

Этот подход полезен, когда требуется прокрутка к фиксированной позиции страницы, а не к конкретному элементу.


Навигация между секциями с помощью якорей

Для переходов между view часто используют ссылки с атрибутом href на идентификаторы секций:

<a href="#section2" class="scroll-link">Перейти к секции 2</a>
<div id="section2">Секция 2</div>

Чтобы включить плавную прокрутку без перезагрузки страницы, добавляют обработчик события click:

document.querySelectorAll('.scroll-link').forEach(link => {
  link.addEventListener('click', e => {
    e.preventDefault();
    const target = document.querySelector(link.getAttribute('href'));
    target.scrollIntoView({ beh * avior: 'smooth', block: 'start' });
  });
});

Ключевой момент — предотвращение стандартного поведения ссылок e.preventDefault(), чтобы страница не прыгала к элементу мгновенно.


Программная навигация между view

Иногда требуется динамически управлять прокруткой, основываясь на логике приложения. Например, при переключении вкладок или view:

function scrollToView(id) {
  const view = document.getElementById(id);
  if (view) {
    view.scrollIntoView({ beh * avior: 'smooth', block: 'start' });
  }
}

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


Анимация прокрутки с requestAnimationFrame

Для более сложных эффектов можно отказаться от стандартного scrollIntoView и реализовать анимацию вручную:

function smoothScroll(targetY, duration = 600) {
  const startY = window.scrollY;
  const distance = targetY - startY;
  let startTime = null;

  function step(timestamp) {
    if (!startTime) startTime = timestamp;
    const progress = Math.min((timestamp - startTime) / duration, 1);
    window.scrollTo(0, startY + distance * easeInOutCubic(progress));
    if (progress < 1) requestAnimationFrame(step);
  }

  requestAnimationFrame(step);
}

function easeInOutCubic(t) {
  return t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;
}

Этот метод даёт полный контроль над кривой анимации, длительностью и точкой назначения.


Управление смещением и высотой фиксированных элементов

При использовании sticky-меню или фиксированных header важно учитывать смещение:

function scrollToWithOffset(elementId, offset = 80) {
  const element = document.getElementById(elementId);
  const elementPosition = element.getBoundingClientRect().top + window.scrollY;
  window.scrollTo({ top: elementPosition - offset, beh * avior: 'smooth' });
}

Без компенсации фиксированного header элемент может скрываться за шапкой.


События и коллбэки при прокрутке

Для отслеживания завершения прокрутки можно использовать scroll и таймеры:

function onScrollEnd(callback, delay = 100) {
  let timeout;
  window.addEventListener('scroll', () => {
    clearTimeout(timeout);
    timeout = setTimeout(callback, delay);
  });
}

Такой подход полезен для подгрузки данных, анимаций при достижении определённой секции или синхронизации интерфейса.


Интеграция с фреймворками и SPA

В одностраничных приложениях (SPA) Smooth Scroll помогает переключать view без перезагрузки. Для этого:

  • Сохраняются идентификаторы секций.
  • Прокрутка инициируется при изменении маршрута.
  • Используются дополнительные offsets для fixed header.
  • При необходимости анимация управляется через requestAnimationFrame.

Оптимизация и производительность

  • Использовать requestAnimationFrame вместо таймеров для плавной анимации.
  • Минимизировать количество обработчиков scroll.
  • Избегать heavy DOM-операций внутри события прокрутки.
  • Кэшировать координаты элементов при возможных повторных прокрутках.

Такой подход обеспечивает плавность анимации даже на страницах с большим количеством элементов и сложным интерфейсом.


Плавная прокрутка между view становится инструментом не только для эстетики, но и для улучшения UX, облегчая восприятие переходов, синхронизацию элементов и контроль над поведением страницы.