Smooth Scroll — это библиотека для создания плавной
анимации прокрутки в JavaScript. В контексте прокрутки внутри
контейнеров важно понимать, что анимация не всегда происходит на уровне
окна (window), а может быть локализована внутри конкретного
элемента с ограниченной областью видимости.
Прокрутка внутри контейнера предполагает работу с элементами, у
которых задано свойство CSS overflow: auto или
overflow: scroll. Smooth Scroll не ограничивается
прокруткой документа: он позволяет анимировать перемещение к
определённым дочерним элементам внутри контейнера.
Ключевые параметры для контейнера:
easeInOutCubic).Пример инициализации прокрутки внутри контейнера:
import SmoothScroll from 'smooth-scroll';
const scrollContainer = document.querySelector('.scrollable-container');
const scroll = new SmoothScroll(scrollContainer, {
duration: 600,
easing: 'easeInOutCubic',
offset: 20
});
// Прокрутка к дочернему элементу
const target = scrollContainer.querySelector('#target-element');
scroll.animateScroll(target);
Для корректной анимации внутри контейнера важно, чтобы позиция
дочернего элемента вычислялась относительно контейнера, а не окна.
Smooth Scroll автоматически определяет координаты целевого элемента с
учётом scrollTop контейнера:
function getElementPosition(element, container) {
const elementRect = element.getBoundingClientRect();
const containerRect = container.getBoundingClientRect();
return elementRect.top - containerRect.top + container.scrollTop;
}
Далее animateScroll использует это значение для плавной
прокрутки. Это позволяет создавать интерактивные
панели, вкладки и внутренние меню с аккуратной анимацией.
Smooth Scroll поддерживает стандартные easing-функции, а также позволяет задавать пользовательские кривые. Пример функции easing:
function easeInOutQuad(t) {
return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;
}
const scroll = new SmoothScroll(scrollContainer, {
duration: 800,
easing: easeInOutQuad
});
Использование кастомных easing-функций особенно полезно для интерфейсов с большим количеством элементов, где стандартные линейные или cubic кривые выглядят слишком механически.
Smooth Scroll позволяет привязать события до начала анимации, во время неё и по завершении. Для контейнеров это выглядит следующим образом:
scrollContainer.addEventListener('scrollStart', (event) => {
console.log('Прокрутка началась', event);
});
scrollContainer.addEventListener('scrollStop', (event) => {
console.log('Прокрутка завершена', event);
});
Это открывает возможности для динамического подгрузки контента или анимации элементов, которые становятся видимыми при прокрутке.
Для прокрутки к элементам внутри контейнера часто используют внутренние якоря. Smooth Scroll позволяет плавно перемещать контент без перезагрузки страницы и с учётом смещений:
document.querySelectorAll('.scroll-link').forEach(link => {
link.addEventListener('click', function(e) {
e.preventDefault();
const target = scrollContainer.querySelector(this.getAttribute('href'));
scroll.animateScroll(target);
});
});
Такой подход обеспечивает аккуратную навигацию внутри блоков с фиксированной высотой и предотвращает резкие прыжки контента.
Если контент контейнера обновляется динамически (например,
добавляются новые элементы или меняется высота), важно вызывать
пересчёт позиции элементов перед анимацией. Smooth Scroll
корректно работает с обновлёнными координатами, если использовать метод
animateScroll для актуального DOM-элемента.
const newTarget = scrollContainer.querySelector('#new-element');
scroll.animateScroll(newTarget);
Для плавной прокрутки важно, чтобы контейнер имел:
position: relative или position: absolute
для корректного расчёта положения дочерних элементов.overflow: auto или overflow: scroll.Также рекомендуется контролировать scroll-behavior через CSS, чтобы не возникало конфликтов со встроенной анимацией браузера:
.scrollable-container {
scroll-behavior: auto; /* Отключаем стандартную плавную прокрутку */
}
Для контейнеров с большим количеством элементов полезно:
duration) до
600–800 мс.requestAnimationFrame внутри библиотеки
(Smooth Scroll делает это автоматически) для гладкой анимации
без тормозов.Smooth Scroll внутри контейнеров позволяет создавать:
Эффект плавности достигается за счёт комбинации расчёта
позиции элементов, анимации через
requestAnimationFrame и гибкой настройки
easing и duration. Правильная интеграция с DOM и CSS позволяет
получить естественное поведение прокрутки, близкое к
нативной анимации браузера, но с полным контролем разработчика.