Анимация появления элементов при прокрутке страницы создаёт эффект динамичного взаимодействия и улучшает восприятие контента. Smooth Scroll позволяет интегрировать такие эффекты без сложных вычислений и с минимальными усилиями. Основная идея заключается в отслеживании позиции элемента относительно видимой области окна и запуске анимации, когда элемент становится видимым.
Smooth Scroll чаще всего используется для плавного скролла к якорям, однако его функционал можно расширить для триггера анимаций. Для этого необходимо:
const scroll = new SmoothScroll('a[href*="#"]', {
speed: 600,
offset: 0,
easing: 'easeInOutCubic',
});
window.addEventListener('scroll', () => {
const elements = document.querySelectorAll('.animate-on-scroll');
elements.forEach(el => {
if (isInViewport(el)) {
el.classList.add('active');
}
});
});
Функция isInViewport проверяет, находится ли элемент в
видимой области окна:
function isInViewport(element) {
const rect = element.getBoundingClientRect();
return rect.top < window.innerHeight && rect.bottom > 0;
}
Эффекты появления могут быть различными: плавное появление, сдвиг, масштабирование, поворот. Для этого применяется CSS-анимация:
.animate-on-scroll {
opacity: 0;
transform: translateY(50px);
transition: all 0.8s ease-out;
}
.animate-on-scroll.active {
opacity: 1;
transform: translateY(0);
}
Ключевой момент: элемент остаётся невидимым до момента срабатывания скрипта. Это обеспечивает плавный, естественный визуальный эффект при скролле.
Можно регулировать момент начала анимации с помощью offset, чтобы элемент появлялся чуть раньше или позже:
function isInViewport(element, offset = 100) {
const rect = element.getBoundingClientRect();
return rect.top < window.innerHeight - offset;
}
Изменение значения offset позволяет создавать более
динамичные сценарии: элементы могут появляться, когда пользователь ещё
не доскроллил до конца блока.
Для создания эффекта «ступенчатого появления» нескольких элементов используется задержка через CSS-переменные или Jav * aScript:
elements.forEach((el, index) => {
setTimeout(() => {
el.classList.add('active');
}, index * 200);
});
Это создаёт ощущение движения и глубины, когда каждый последующий элемент появляется чуть позже предыдущего.
Для больших страниц и множественных анимированных блоков важно минимизировать нагрузку:
requestAnimationFrame вместо прямого
прослушивания события scroll:let ticking = false;
window.addEventListener('scroll', () => {
if (!ticking) {
window.requestAnimationFrame(() => {
animateElements();
ticking = false;
});
ticking = true;
}
});
will-change в CSS для элементов с
анимацией:.animate-on-scroll {
will-change: opacity, transform;
}
Smooth Scroll может использоваться совместно с параллаксом, масштабированием и изменением прозрачности. Например:
.animate-on-scroll.active {
opacity: 1;
transform: translateY(0) scale(1);
}
window.addEventListener('scroll', () => {
const elements = document.querySelectorAll('.parallax');
elements.forEach(el => {
const speed = parseFloat(el.dataset.speed);
el.style.transform = `translateY(${window.scrollY * speed}px)`;
});
});
Такой подход позволяет создавать сложные визуальные эффекты без потери производительности.
animate-on-scroll для всех
элементов, требующих анимации, и управлять их состоянием через
.active.transition и
ease функции.Эта методика позволяет создавать плавные, привлекательные и отзывчивые анимации появления элементов, используя Smooth Scroll как основу для триггеров, без необходимости внедрять тяжелые сторонние библиотеки.