Для начала работы с библиотекой Smooth Scroll необходимо подключить её в проект. Обычно используется через CDN или пакетный менеджер npm:
<script src="https://cdn.jsdelivr.net/npm/smooth-scroll@16/dist/smooth-scroll.polyfills.min.js"></script>
Инициализация производится следующим образом:
const scroll = new SmoothScroll('a[href*="#"]', {
speed: 600,
speedAsDuration: true,
offset: 0,
easing: 'easeInOutCubic'
});
Параметры конфигурации:
speed — скорость прокрутки в миллисекундах.speedAsDuration — определяет, считать ли скорость
фиксированной длительностью анимации.offset — смещение в пикселях от целевого элемента.easing — функция плавности (easeInOutCubic, linear,
easeOutQuad и др.).Инициализация создаёт внутренние обработчики событий, которые привязываются к DOM-элементам. Эти обработчики являются потенциальными источниками утечек памяти, если не управлять ими корректно.
Smooth Scroll при привязке к элементам создаёт:
requestAnimationFrame для плавного перемещения.offset.Каждый обработчик содержит ссылки на DOM-элементы и функции обратного вызова. Если объект Smooth Scroll не уничтожается при удалении элементов из DOM, ссылки сохраняются, препятствуя сборке мусора.
Утечки возникают в следующих случаях:
Долгое существование обработчиков после удаления
элементов. Пример: ссылки с якорями удалены динамически через
innerHTML = '', но экземпляр Smooth Scroll всё ещё хранит
ссылки.
Многократная инициализация. Повторная инициализация без удаления предыдущего экземпляра создаёт новые обработчики, старые остаются в памяти.
Анимации без завершения. Если прервать анимацию
или удалить элемент, requestAnimationFrame продолжает
держать ссылки на функции и DOM.
Кэширование параметров. Smooth Scroll хранит копии позиций элементов и опции анимации. При больших документах это увеличивает использование памяти.
scroll.destroy();
Метод destroy() снимает все события клика и
останавливает активные анимации. После вызова destroy
экземпляр можно безопасно удалить, например:
scroll = null;
Избегать множественной инициализации Создавать экземпляр только один раз для набора ссылок, либо проверять существующий объект перед повторной инициализацией.
Удаление динамически созданных элементов Если
элементы с привязанными якорями удаляются, рекомендуется вызвать
destroy() перед удалением.
Использование делегирования событий Вместо привязки обработчика к каждой ссылке можно использовать делегирование, снижая количество подписок и снижая риск утечек.
document.body.addEventListener('click', function(e) {
const anchor = e.target.closest('a[href^="#"]');
if(anchor) scroll.animateScroll(anchor);
});
requestAnimationFrame
Smooth Scroll позволяет прерывать анимацию:scroll.cancelScroll();
Это важно при динамических SPA, где переход между страницами может происходить без перезагрузки.
requestAnimationFrame и выявлять висящие анимации.Регулярный мониторинг памяти необходим при создании динамических интерфейсов с частым добавлением и удалением контента, чтобы избежать накопления неиспользуемых объектов Smooth Scroll.
destroy() и удалять ссылки на экземпляр.let scroll;
function initSmoothScroll() {
if(scroll) scroll.destroy();
scroll = new SmoothScroll('a[href*="#"]', {
speed: 800,
easing: 'easeInOutQuart'
});
}
// При удалении контента
function removeContent() {
if(scroll) {
scroll.destroy();
scroll = null;
}
const container = document.querySelector('#dynamic-container');
container.innerHTML = '';
}
Такой подход гарантирует отсутствие утечек памяти, даже если элементы создаются и удаляются многократно.
Этот подход позволяет использовать Smooth Scroll в сложных веб-приложениях без риска накопления неиспользуемых обработчиков и анимаций, обеспечивая стабильную производительность и корректное освобождение памяти.