Vuetify предоставляет мощные инструменты для создания анимации
элементов списка, опираясь на возможности Vue Transition
API и собственные компоненты, такие как v-list,
v-list-item и вспомогательные утилиты для плавного
появления, исчезновения и перемещения элементов. Анимация списков делает
интерфейс более динамичным и отзывчивым, улучшая пользовательский
опыт.
v-list и базовые переходыОсновным контейнером для списков является
v-list. В стандартном виде он отображает
элементы без анимации, однако при использовании
v-for с
transition-group можно добавить анимацию
появления и исчезновения:
<template>
<v-list>
<transition-group name="list-fade" tag="div">
<v-list-item
v-for="item in items"
:key="item.id"
>
<v-list-item-content>
<v-list-item-title>{{ item.name }}</v-list-item-title>
</v-list-item-content>
</v-list-item>
</transition-group>
</v-list>
</template>
<style>
.list-fade-enter-active, .list-fade-leave-active {
transition: all 0.5s ease;
}
.list-fade-enter-from, .list-fade-leave-to {
opacity: 0;
transform: translateY(-10px);
}
</style>
Ключевые моменты:
key обязателен для корректной
работы анимации, чтобы Vue отслеживал изменения элементов.*-enter-* и *-leave-* определяют
начальное и конечное состояние анимации.transition управляет продолжительностью и
кривой изменения.v-slide-y-transition и v-fade-transitionVuetify предлагает готовые переходы, которые упрощают работу с анимацией списков:
<template>
<v-list>
<v-slide-y-transition>
<v-list-item v-for="item in items" :key="item.id">
<v-list-item-content>
<v-list-item-title>{{ item.name }}</v-list-item-title>
</v-list-item-content>
</v-list-item>
</v-slide-y-transition>
</v-list>
</template>
Особенности готовых переходов:
v-slide-y-transition – вертикальное
скольжение элементов при добавлении и удалении.v-fade-transition – плавное появление
и исчезновение через изменение прозрачности.Когда список изменяет порядок элементов или применяется фильтр,
стандартная анимация появления недостаточна. Для этого применяют
transition-group с эффектом
перемещения:
<template>
<v-list>
<transition-group name="list-move" tag="div">
<v-list-item v-for="item in sortedItems" :key="item.id">
<v-list-item-content>
<v-list-item-title>{{ item.name }}</v-list-item-title>
</v-list-item-content>
</v-list-item>
</transition-group>
</v-list>
</template>
<style>
.list-move-move {
transition: transform 0.4s ease;
}
</style>
*-move автоматически применяется Vue при
изменении позиции элемента.Для динамических списков важно правильно обрабатывать появление новых элементов и исчезновение старых:
<template>
<v-list>
<v-fade-transition>
<v-list-item v-for="item in items" :key="item.id">
<v-list-item-content>
<v-list-item-title>{{ item.name }}</v-list-item-title>
</v-list-item-content>
</v-list-item>
</v-fade-transition>
</v-list>
<v-btn @click="addItem">Добавить элемент</v-btn>
<v-btn @click="removeItem">Удалить элемент</v-btn>
</template>
<script>
export default {
data() {
return {
items: [
{ id: 1, name: 'Элемент 1' },
{ id: 2, name: 'Элемент 2' },
]
}
},
methods: {
addItem() {
const nextId = this.items.length + 1;
this.items.push({ id: nextId, name: `Элемент ${nextId}` });
},
removeItem() {
this.items.pop();
}
}
}
</script>
push добавляет элемент в конец
списка, pop удаляет последний.transition или готовый
Vuetify переход.Для более выразительной анимации можно использовать стилевую задержку и псевдоэлементы:
.list-fade-enter-active {
transition: all 0.4s ease;
}
.list-fade-enter-from {
opacity: 0;
transform: translateX(-20px);
}
.list-fade-enter-to {
opacity: 1;
transform: translateX(0);
}
.list-fade-enter-active > * {
transition-delay: calc(var(--index) * 50ms);
}
key для
элементов списка.v-slide-y-transition, v-fade-transition) для
простых эффектов.transition-group с кастомными стилями CSS.Анимация списков в Vuetify позволяет создавать интерфейсы с плавными переходами, последовательным появлением элементов и эффектами перемещения, обеспечивая профессиональный и современный вид приложений.