Анимации в Vue.js обеспечиваются с помощью встроенного компонента
<transition> и сопутствующих инструментов, таких как
<transition-group>. Они позволяют создавать плавные
визуальные эффекты при изменении DOM, добавлении или удалении элементов.
При этом производительность анимаций зависит не только от кода Vue, но и
от правильного использования CSS, JavaScript и браузерных
возможностей.
<transition>Компонент <transition> работает с одним дочерним
элементом и управляет его состояниями: enter,
leave, appear. Каждое состояние может
быть связано с классами CSS:
<transition name="fade">
<div v-if="show">Контент</div>
</transition>
CSS-классы создаются автоматически на основе имени перехода:
.fade-enter-active, .fade-leave-active {
transition: opacity 0.5s ease;
}
.fade-enter-from, .fade-leave-to {
opacity: 0;
}
.fade-enter-to, .fade-leave-from {
opacity: 1;
}
Ключевое значение для производительности — использование
transform и opacity, вместо свойств,
которые вызывают перерасчет layout или перерисовку, например,
width, height или margin.
<transition-group>Для анимации списков используется
<transition-group>, который поддерживает
множественные элементы и их упорядоченное появление или удаление.
Пример:
<transition-group name="list" tag="ul">
<li v-for="item in items" :key="item.id">{{ item.text }}</li>
</transition-group>
CSS-анимации для группы элементов:
.list-enter-active, .list-leave-active {
transition: all 0.3s ease;
}
.list-enter-from, .list-leave-to {
transform: translateY(30px);
opacity: 0;
}
.list-enter-to, .list-leave-from {
transform: translateY(0);
opacity: 1;
}
В случаях, когда CSS ограничен или требуется сложная логика, Vue позволяет управлять анимацией через хуки:
methods: {
beforeEnter(el) {
el.style.opacity = 0;
el.style.transform = 'translateY(-20px)';
},
enter(el, done) {
const delay = el.dataset.index * 50;
setTimeout(() => {
el.style.transition = 'all 0.5s ease';
el.style.opacity = 1;
el.style.transform = 'translateY(0)';
done();
}, delay);
},
leave(el, done) {
el.style.transition = 'all 0.3s ease';
el.style.opacity = 0;
el.style.transform = 'translateY(20px)';
setTimeout(done, 300);
}
}
Такой подход позволяет точно контролировать порядок и скорость анимации, однако нужно учитывать затраты на ререндер и layout, особенно при больших списках.
Использование requestAnimationFrame
Все сложные расчеты или анимации на JavaScript следует синхронизировать
с рендером браузера через requestAnimationFrame для
плавности кадров.
Аппаратное ускорение через GPU Применение
свойств transform и opacity задействует GPU,
что значительно повышает производительность. Избегать анимаций,
изменяющих размеры элементов (width, height)
или позицию через top/left.
Разделение анимаций на микропереходы Длинные и сложные анимации можно разбивать на отдельные стадии, что снижает нагрузку на композитный слой.
Использование v-show вместо
v-if для часто обновляемых элементов
v-show просто скрывает элемент через
display: none, не разрушая DOM, что уменьшает затраты на
ререндер.
Дебаунс и троттлинг событий При привязке анимации к событиям (например, scroll или mousemove) следует ограничивать частоту вызова функций, чтобы не перегружать основной поток браузера.
Браузерные инструменты разработчика (DevTools) позволяют проверять FPS и узкие места. Вкладка Performance в Chrome помогает выявить:
Layout Thrashing)Long Tasks)Для Vue есть дополнение Vue Devtools, которое показывает актуальное обновление компонентов, что помогает понять, какие анимации вызывают лишние ререндеры.
requestAnimationFrame.Правильная организация анимаций во Vue.js позволяет создавать плавные и отзывчивые интерфейсы, одновременно снижая нагрузку на браузер и улучшая пользовательский опыт.