Для использования AOS в проекте на Vue необходимо установить библиотеку через npm или yarn:
npm install aos --save
или
yarn add aos
После установки подключение AOS выполняется в основном файле
приложения, чаще всего это main.js или
main.ts:
import { createApp } from 'vue';
import App from './App.vue';
import AOS from 'aos';
import 'aos/dist/aos.css';
const app = createApp(App);
// Инициализация AOS с базовыми настройками
AOS.init({
duration: 800, // Длительность анимации в миллисекундах
once: true, // Анимация срабатывает один раз при скролле
easing: 'ease-in-out' // Тип кривой ускорения
});
app.mount('#app');
Чтобы добавить анимацию элементу, достаточно использовать атрибут
data-aos. В Vue компонентах это выглядит следующим
образом:
<template>
<div class="card" data-aos="fade-up">
<h2>Заголовок</h2>
<p>Описание анимированного блока.</p>
</div>
</template>
Можно комбинировать несколько атрибутов для более гибкой настройки:
<div
class="card"
data-aos="fade-left"
data-aos-offset="200"
data-aos-delay="300"
data-aos-duration="1000"
data-aos-easing="ease-in-out"
data-aos-once="false"
>
Контент блока
</div>
Описание основных атрибутов:
data-aos — тип анимации (fade,
fade-up, fade-down, flip-left,
zoom-in и т.д.).data-aos-offset — смещение срабатывания анимации от
верхнего края экрана в пикселях.data-aos-delay — задержка перед началом анимации (в
миллисекундах).data-aos-duration — длительность анимации.data-aos-easing — кривые ускорения (ease,
linear, ease-in, ease-out).data-aos-once — если true, анимация
срабатывает только один раз при скролле вниз.В SPA на Vue часто возникает необходимость повторной инициализации
AOS при динамическом рендеринге компонентов. Для этого используется
метод refresh:
import { onMounted, nextTick } from 'vue';
import AOS from 'aos';
export default {
setup() {
onMounted(() => {
nextTick(() => {
AOS.refresh();
});
});
}
}
onMounted гарантирует, что DOM уже существует.nextTick обеспечивает выполнение
AOS.refresh() после завершения всех реактивных
обновлений.Для компонентов, которые динамически добавляют элементы при изменении
данных, можно вызвать AOS.refreshHard() для полной
переработки всех анимируемых элементов.
При работе с v-for важно, чтобы каждый элемент списка
имел уникальный ключ:
<template>
<div v-for="item in items" :key="item.id" data-aos="fade-up">
{{ item.title }}
</div>
</template>
<script>
import { ref, onMounted, nextTick } from 'vue';
import AOS from 'aos';
export default {
setup() {
const items = ref([]);
onMounted(async () => {
items.value = await fetchItems(); // загрузка данных
nextTick(() => AOS.refresh());
});
return { items };
}
}
</script>
Без nextTick вызов AOS.refresh() может
произойти до рендеринга элементов, и анимация не сработает.
Для удобства можно создать плагин Vue для централизованной настройки AOS:
// plugins/aos.js
import AOS from 'aos';
import 'aos/dist/aos.css';
export default {
install(app, options = {}) {
app.config.globalProperties.$aos = AOS;
AOS.init({
duration: 1000,
easing: 'ease-in-out',
once: true,
...options
});
}
};
Подключение плагина в main.js:
import { createApp } from 'vue';
import App from './App.vue';
import AOSPlugin from './plugins/aos';
const app = createApp(App);
app.use(AOSPlugin, { duration: 1200, once: false });
app.mount('#app');
Теперь доступ к AOS возможен через $aos в любом
компоненте:
this.$aos.refresh();
Иногда требуется отключать анимации на мобильных устройствах. AOS
поддерживает опцию disable:
AOS.init({
disable: function() {
return window.innerWidth < 768; // отключить анимацию на устройствах <768px
}
});
Также можно условно добавлять атрибут data-aos в
шаблоне:
<div :data-aos="isDesktop ? 'fade-up' : null">
Контент
</div>
AOS хорошо сочетается с Vue Transition и Vue Router. Для анимации
переходов между страницами можно вызывать AOS.refresh()
после навигации:
import { onMounted } from 'vue';
import { useRouter } from 'vue-router';
import AOS from 'aos';
export default {
setup() {
const router = useRouter();
router.afterEach(() => {
AOS.refresh();
});
}
}
Это обеспечивает корректное срабатывание анимаций на новых маршрутах без перезагрузки страницы.