<Transition> анімує один елемент чи компонент, коли той з'являється або зникає через v-if, v-show, зміну динамічного компонента чи key.
<Transition name="fade">
<p v-if="visible">Збережено</p>
</Transition>
<style>
.fade-enter-active,
.fade-leave-active { transition: opacity 0.2s ease; }
.fade-enter-from,
.fade-leave-to { opacity: 0; }
</style>
Класи, які Vue додає по черзі (name - префікс):
-enter-from→-enter-active→-enter-to- поява;-leave-from→-leave-active→-leave-to- зникнення.
Vue сам визначає, коли анімація закінчилася (за transitionend/animationend), і лише тоді прибирає елемент з DOM.
З Tailwind - класи напряму через props:
<Transition
enter-active-class="transition duration-200 ease-out"
enter-from-class="opacity-0 -translate-y-2"
leave-active-class="transition duration-150 ease-in"
leave-to-class="opacity-0"
>
Режими для заміни одного елемента іншим: mode="out-in" - спершу зникає старий, потім з'являється новий (без накладання).
<TransitionGroup> - для списків (v-for): анімує додавання, видалення й переміщення елементів:
<TransitionGroup name="list" tag="ul">
<li v-for="item in items" :key="item.id">{{ item.title }}</li>
</TransitionGroup>
<style>
.list-move { transition: transform 0.3s; } /* плавне переміщення при зміні порядку */
.list-leave-active { position: absolute; } /* щоб сусіди плавно зсувалися */
</style>
Обов'язково :key на кожному елементі - без нього Vue не знає, що анімувати.
JavaScript-хуки (@before-enter, @enter, @leave з колбеком done) - для анімацій бібліотеками (GSAP, Web Animations API).
Пастки:
<Transition>очікує рівно один кореневий елемент - компонент з кількома коренями всередині не анімується;- анімація не запускається при першому рендері - для цього атрибут
appear; prefers-reduced-motion- користувачі, які вимкнули анімації в системі, мають їх не бачити:@media (prefers-reduced-motion: reduce)чиmotion-reduce:у Tailwind;- для переходів між сторінками в сучасних браузерах можна використати View Transitions API.