Мерцание (flickering) возникает в момент, когда элемент сначала отображается в обычном состоянии, а затем мгновенно переходит в начальное состояние анимации и только после этого проигрывает эффект. Это связано с тем, что стили, добавляемые библиотекой AOS, применяются не мгновенно при загрузке страницы, а после инициализации JavaScript.
Типичная последовательность:
aos-init,
aos-animate)Этот визуальный скачок и воспринимается как мерцание.
Ключевой подход — заранее задать начальные стили для анимируемых элементов до загрузки AOS. Это позволяет избежать промежуточного состояния.
Базовый принцип:
[data-aos] {
opacity: 0;
transition-property: opacity, transform;
}
[data-aos].aos-animate {
opacity: 1;
}
Такой подход гарантирует, что элемент изначально скрыт, и только
после применения класса aos-animate становится видимым.
Для предотвращения отображения неинициализированных элементов используется глобальное скрытие с последующим показом после полной загрузки AOS.
[data-aos] {
visibility: hidden;
}
[data-aos].aos-animate {
visibility: visible;
}
Особенности:
visibility не влияет на поток документаaos-initAOS автоматически добавляет класс aos-init при
инициализации. Это можно использовать для более точного контроля:
[data-aos].aos-init {
opacity: 0;
}
[data-aos].aos-init.aos-animate {
opacity: 1;
}
Преимущество: исключается ситуация, при которой элементы скрываются до загрузки скрипта.
FOUC возникает, когда стили подключаются позже, чем HTML уже отображён. В контексте AOS это усиливает эффект мерцания.
Решения:
<head>:<link rel="stylesheet" href="aos.css">
<style>Инициализация AOS до полной загрузки ресурсов может вызвать некорректные вычисления позиции элементов.
window.addEventListener('load', function () {
AOS.init();
});
Почему это важно:
Иногда требуется ручной контроль отображения до и после инициализации.
document.documentElement.classList.add('aos-loading');
window.addEventListener('load', function () {
AOS.init();
document.documentElement.classList.remove('aos-loading');
});
.aos-loading [data-aos] {
opacity: 0;
}
Результат:
При добавлении элементов через JavaScript (AJAX, SPA) возможно повторное мерцание.
AOS.refresh();
или
AOS.refreshHard();
Разница:
refresh — пересчитывает позицииrefreshHard — переинициализирует все элементыЧтобы избежать мерцания:
aos-init вручную при
необходимостиopacity vs displaydisplay: none не подходит для предотвращения
мерцания:
/* Не рекомендуется */
[data-aos] {
display: none;
}
Причины:
Предпочтение:
opacityvisibilitytransformАнимации с использованием transform менее подвержены
визуальным артефактам.
[data-aos="fade-up"] {
transform: translateY(20px);
opacity: 0;
}
[data-aos="fade-up"].aos-animate {
transform: translateY(0);
opacity: 1;
}
Преимущества:
На слабых соединениях скрипт может загружаться заметно позже, усиливая эффект мерцания.
Подход:
<script defer src="aos.js"></script>
И параллельно:
[data-aos] {
opacity: 0;
}
Это гарантирует, что даже при задержке JS элементы не появятся преждевременно.
При использовании SCSS или LESS удобно централизовать управление состояниями:
[data-aos] {
opacity: 0;
transition: all 0.6s ease;
&.aos-animate {
opacity: 1;
}
}
Позволяет:
1. Отсутствие начальных стилей Элементы видны до инициализации
2. Подключение CSS после HTML FOUC усиливает мерцание
3. Использование display: none Ломает
анимации и layout
4. Инициализация до загрузки страницы Некорректные позиции элементов
5. Отсутствие refresh при динамическом контенте Элементы анимируются некорректно
<head> подключён CSS AOS[data-aos] {
opacity: 0;
}
window.addEventListener('load', function () {
AOS.init();
});
.aos-loading [data-aos] {
opacity: 0;
}
Использование will-change:
[data-aos] {
will-change: opacity, transform;
}
Польза:
Ограничение анимаций:
AOS.init({
once: true
});
Снижает вероятность повторного мерцания при скролле вверх/вниз.
Контроль задержек:
<div data-aos="fade-up" data-aos-delay="200"></div>
Слишком большие задержки могут визуально усиливать эффект “пустоты”, что воспринимается как мерцание.
Грамотная комбинация CSS-подготовки, правильной инициализации и контроля состояния DOM полностью устраняет визуальные артефакты при использовании AOS, обеспечивая плавное и предсказуемое появление элементов на странице.