Smooth Scroll — это библиотека, обеспечивающая плавную анимацию прокрутки страницы к якорным элементам или произвольным координатам. Для корректной работы плавной прокрутки крайне важно, чтобы целевой контент был полностью загружен до начала анимации. Предзагрузка контента позволяет избежать «скачков» и некорректного позиционирования элементов, особенно на страницах с динамическими изображениями, шрифтами и ленивой загрузкой.
Поскольку Smooth Scroll вычисляет позицию элементов относительно
документа, все ресурсы, влияющие на высоту страницы, должны быть
загружены заранее. Для этого можно использовать событие
load окна или промисы для отдельных изображений:
function preloadImages(images) {
const promises = images.map(src => new Promise(resolve => {
const img = new Image();
img.src = src;
img.onl oad = () => resolve(img);
img.oner ror = () => resolve(img);
}));
return Promise.all(promises);
}
const images = [
'/img/banner.jpg',
'/img/section1.jpg',
'/img/section2.jpg'
];
preloadImages(images).then(() => {
const scroll = new SmoothScroll('a[href*="#"]', { speed: 600 });
});
Ключевой момент: запуск Smooth Scroll после полной загрузки критических ресурсов гарантирует точность расчётов позиции для прокрутки.
Если элементы создаются через JavaScript или загружаются асинхронно (например, через fetch/Ajax), необходимо инициализировать Smooth Scroll только после вставки элементов в DOM.
fetch('/api/sections')
.then(res => res.json())
.then(data => {
data.forEach(section => {
const el = document.createElement('section');
el.id = section.id;
el.innerHTML = section.content;
document.body.appendChild(el);
});
new SmoothScroll('a[href*="#"]', { speed: 500 });
});
Важно: Smooth Scroll не отслеживает динамически добавляемые элементы автоматически, поэтому повторная инициализация или делегирование событий для новых ссылок необходимо.
Для сайтов с постоянно меняющимся контентом можно применять
MutationObserver, чтобы инициализировать прокрутку для
вновь добавленных элементов:
const observer = new MutationObserver((mutationsList) => {
mutationsList.forEach(mutation => {
mutation.addedNodes.forEach(node => {
if (node.nodeType === 1 && node.matches('section[id]')) {
smoothScrollInstance.update(); // обновляет позиции
}
});
});
});
observer.observe(document.body, { childList: true, subtree: true });
Особенность: метод update() Smooth
Scroll пересчитывает позиции якорей, что исключает ошибки при кликах на
ссылки к динамическим секциям.
Иногда требуется отложить плавную прокрутку до полной загрузки всех внешних ресурсов:
window.addEventListener('load', () => {
const scroll = new SmoothScroll('a[href*="#"]', { speed: 800, offset: 50 });
});
offset позволяет корректировать позицию целевого
элемента, если есть фиксированные шапки или панели навигации.
Высота элементов может изменяться после загрузки шрифтов. Для точной
прокрутки рекомендуется использовать FontFaceObserver:
const font = new FontFaceObserver('Roboto');
font.load().then(() => {
const scroll = new SmoothScroll('a[href*="#"]', { speed: 600 });
});
Суть: Smooth Scroll корректно рассчитывает позиции только после того, как все шрифты применены и высота текста зафиксирована.
Если страница использует ленивую загрузку изображений через
loading="lazy" или Intersection Observer, можно вручную
загружать изображения критических секций:
document.querySelectorAll('img[data-src]').forEach(img => {
img.src = img.dataset.src;
img.onl oad = () => {
// при необходимости обновляем Smooth Scroll
smoothScrollInstance.update();
};
});
update() при
динамическом добавлении контента.load
для точной синхронизации с загрузкой ресурсов.Эффективная предзагрузка контента обеспечивает корректное вычисление координат элементов и гладкую работу Smooth Scroll, что особенно важно для больших и динамических веб-страниц с разнообразными медиа и асинхронно загружаемым контентом.