Библиотека AOS (Animate on Scroll) предназначена для анимации элементов при их появлении в области видимости при прокрутке страницы. Для начала необходимо подключить библиотеку к проекту. Можно использовать CDN или установить через npm:
<!-- Подключение через CDN -->
<link href="https://cdn.jsdelivr.net/npm/aos@2.3.4/dist/aos.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/aos@2.3.4/dist/aos.js"></script>
Или через npm:
npm install aos --save
Инициализация производится в Jav * aScript:
import AOS from 'aos';
import 'aos/dist/aos.css';
AOS.init({
duration: 800, // продолжительность анимации в миллисекундах
once: true, // анимация срабатывает один раз при первом скролле
mirror: false, // повторная анимация при прокрутке вверх
});
Анимации применяются к элементам с помощью атрибута
data-aos. Например:
<div data-aos="fade-up" data-aos-delay="200" data-aos-duration="1000">
Контент с анимацией
</div>
Ключевые параметры:
data-aos — тип анимации (fade-up,
fade-down, zoom-in и др.).data-aos-delay — задержка перед началом анимации
(мс).data-aos-duration — продолжительность анимации
(мс).data-aos-offset — смещение от начала видимости для
запуска анимации.data-aos-easing — функция сглаживания анимации
(ease, ease-in-out, linear).В SPA (Single Page Application) страницы не перезагружаются полностью, что требует особого подхода:
AOS.refresh() или AOS.refreshHard() для
пересчёта позиций элементов:// После добавления нового контента
AOS.refresh();
refresh пересчитывает позиции только для новых и
изменённых элементов, тогда как refreshHard полностью
пересоздаёт все элементы анимации.
fetch('/api/data')
.then(response => response.json())
.then(data => {
const container = document.getElementById('dynamic-container');
data.forEach(item => {
const div = document.createElement('div');
div.setAttribute('data-aos', 'fade-up');
div.textContent = item.text;
container.appendChild(div);
});
AOS.refresh(); // пересчёт новых элементов
});
once: true минимизирует повторные вычисления
и улучшает производительность.1. Ограничение количества анимаций: Многочисленные анимированные элементы одновременно могут тормозить прокрутку. Для критических элементов используют анимацию только для ключевого контента.
2. Минимизация использования тяжелых анимаций:
Анимации с масштабированием (scale) или сложным смещением
(translate) требуют больше ресурсов. Предпочтение отдаётся
fade или slide с минимальным количеством
одновременно активных элементов.
3. Lazy loading и виртуализация: Для больших списков рекомендуется использовать ленивую подгрузку элементов и анимацию только видимых элементов. Например, с помощью Intersection Observer:
const observer = new IntersectionObserver(entries => {
entries.forEach(entry => {
if(entry.isIntersecting) {
entry.target.setAttribute('data-aos', 'fade-up');
AOS.refresh();
observer.unobserve(entry.target);
}
});
});
document.querySelectorAll('.lazy-aos').forEach(el => observer.observe(el));
4. Использование AOS.refresh()
экономно: Вызывать refresh только после добавления
значительного количества новых элементов, а не на каждое событие
прокрутки.
5. Настройка offset и
duration: Слишком большие значения смещения или
длительности анимации увеличивают нагрузку. Оптимальные значения:
offset: 100-200, duration: 400-800 мс.
AOS.init() в
useEffect при монтировании компонента, а
AOS.refresh() после динамического обновления контента.mounted(),
обновление через nextTick() после изменения DOM.ngAfterViewInit(), обновление после изменения данных с
помощью ChangeDetectorRef.Performance в Chrome DevTools).once: true и
mirror: true на рендеринг.AOS.init({
disable: 'mobile'
});
Эти подходы обеспечивают стабильную работу AOS в SPA, снижают нагрузку на рендер и предотвращают лаги при прокрутке, сохраняя плавность анимации для пользователей.