Библиотека AOS (Animate on Scroll) изначально инициализируется на
момент загрузки страницы с помощью функции AOS.init(). В
стандартной конфигурации она сканирует DOM на наличие элементов с
атрибутами data-aos и применяет к ним анимации при
прокрутке. Однако в современных веб-приложениях структура DOM часто
изменяется динамически — элементы добавляются, удаляются или изменяются
через JavaScript. В таких случаях стандартная инициализация AOS не
успевает отследить новые элементы, и анимации не срабатывают. Для
корректной работы требуется автоматическое обновление состояния
AOS после изменений DOM.
AOS.refresh()Метод AOS.refresh() позволяет пересканировать DOM и
зарегистрировать новые элементы с анимациями. Его можно вызывать вручную
после любого изменения структуры страницы:
// Добавление нового элемента через JS
const newElement = document.createElement('div');
newElement.setAttribute('data-aos', 'fade-up');
newElement.textContent = 'Новый элемент';
document.body.appendChild(newElement);
// Обновление AOS
AOS.refresh();
Особенности метода:
data-aos.AOS.init().refresh() на каждой мелкой модификации могут
снижать производительность.AOS.refreshHard()В случаях глобальных изменений DOM можно использовать более «жёсткий»
метод — AOS.refreshHard(). В отличие от
refresh(), он полностью сбрасывает внутренние структуры AOS
и повторно инициализирует все элементы.
AOS.refreshHard();
Когда использовать:
data-aos.AOS.refresh() не корректно применяет новые
атрибуты.Особенности:
refresh().Для динамических приложений удобно настроить автоматическое
обновление AOS без ручного вызова refresh(). Для этого
используется MutationObserver, встроенный в JavaScript.
Он позволяет отслеживать изменения DOM и реагировать на добавление новых
элементов.
const observer = new MutationObserver(mutations => {
mutations.forEach(mutation => {
if (mutation.addedNodes.length) {
AOS.refresh();
}
});
});
observer.observe(document.body, {
childList: true,
subtree: true
});
Пояснение:
childList: true отслеживает добавление или удаление
дочерних элементов.subtree: true позволяет отслеживать изменения на всех
уровнях вложенности.AOS.refresh() только если
новые элементы добавлены, что снижает лишние вызовы и нагрузку.Часто динамический контент добавляется через популярные библиотеки и фреймворки, например:
AOS.refresh() можно
вызывать в lifecycle-методах после монтирования компонентов
(componentDidMount в React, mounted в
Vue)..append() или .html() можно сразу вызывать
AOS.refresh() для корректного отображения анимаций.// jQuery пример
$('#container').append('<div data-aos="fade-left">Новый блок</div>');
AOS.refresh();
При больших объёмах динамически добавляемых элементов частое обновление AOS может снижать плавность страницы. Для оптимизации рекомендуется:
refresh()
Использовать задержку или throttle, чтобы не вызывать обновление слишком
часто:let refreshTimeout;
const refreshAOS = () => {
clearTimeout(refreshTimeout);
refreshTimeout = setTimeout(() => AOS.refresh(), 100);
};
data-aos перед
вызовом refresh().const newElements = Array.from(mutation.addedNodes).filter(node =>
node.nodeType === 1 && node.hasAttribute('data-aos')
);
if (newElements.length) AOS.refresh();
refreshHard() только при
глобальных изменениях Для единичных вставок достаточно
refresh().// Инициализация AOS
AOS.init({
duration: 800,
once: true
});
// Настройка наблюдателя за DOM
const observer = new MutationObserver(mutations => {
mutations.forEach(mutation => {
const newAOSNodes = Array.from(mutation.addedNodes).filter(node =>
node.nodeType === 1 && node.hasAttribute('data-aos')
);
if (newAOSNodes.length) {
AOS.refresh();
}
});
});
observer.observe(document.body, { childList: true, subtree: true });
Такой подход обеспечивает полностью автоматическое обновление анимаций, минимизируя ручное вмешательство, при этом сохраняя производительность и плавность прокрутки.
Автоматическое обновление AOS является ключевым инструментом при
работе с динамическим контентом. Использование методов
refresh(), refreshHard() и интеграция с
MutationObserver позволяет гарантировать, что все новые
элементы с атрибутами data-aos будут анимироваться
корректно, вне зависимости от того, как и когда они появились в DOM.