Переход

Vue предлагает два встроенных компонента, которые могут помочь работать с переходами и анимацией в ответ на изменение состояния
  • Transitionдля применения анимации, когда элемент или компонент входит в DOM и покидает его. Об этом рассказывается на этой странице.
  • TransitionGroupдля применения анимации, когда элемент или компонент вставляется в список, удаляется из него или перемещается внутри него v-for
Помимо этих двух компонентов, мы также можем применять анимацию в Vue, используя другие методы, такие как переключение классов CSS или анимацию, управляемую состоянием, через привязки стилей

Компонент <Transition>

Transitionявляется встроенным компонентом: это означает, что он доступен в любом шаблоне компонента без необходимости его регистрации. Его можно использовать для применения анимации входа и выхода к элементам или компонентам, переданным ему через слот по умолчанию
Вход или выход может быть инициирован одним из следующих действий
  • Условный рендеринг через v-if
  • Условное отображение через v-show
  • Переключение динамических компонентов с помощью componentспециального элемента
  • Изменение специального key атрибута
Это пример самого простого использования
Обратите внимание
Transition поддерживает только один элемент или компонент в качестве содержимого слота. Если содержимое является компонентом, компонент также должен иметь только один корневой элемент.
Когда элемент в Transition компоненте вставляется или удаляется, происходит следующее
  • 1. Vue автоматически определит, применены ли к целевому элементу CSS-переходы или анимация. Если это произойдет, в соответствующее время будет добавлено/удалено несколько классов перехода CSS .
  • 2. Если есть прослушиватели перехватчиков JavaScript , эти перехватчики будут вызываться в соответствующие моменты времени.
  • 3. Если переходы/анимации CSS не обнаружены и не предоставлены перехватчики JavaScript, операции DOM для вставки и/или удаления будут выполняться в следующем кадре анимации браузера.

Переходы на основе CSS

Переходные классы
Для переходов входа/выхода применяется шесть классов
  • v-enter-from: Начальное состояние входа. Добавлено до вставки элемента, удалено через один кадр после вставки элемента.
  • v-enter-active: Активное состояние для входа. Применяется на протяжении всей фазы ввода. Добавляется перед вставкой элемента и удаляется после завершения перехода/анимации. Этот класс можно использовать для определения продолжительности, задержки и кривой замедления для входящего перехода.
  • v-enter-to: Конечное состояние входа. Добавлен один кадр после того, как элемент вставлен (одновременно v-enter-fromудален), удален по завершении перехода/анимации.
  • v-leave-from: Начальное состояние отпуска. Добавляется сразу при срабатывании уходящего перехода, удаляется через один кадр
  • v-leave-active: Активное состояние отпуска. Применяется в течение всей фазы ухода. Добавляется сразу при срабатывании покидающего перехода и удаляется после завершения перехода/анимации. Этот класс можно использовать для определения продолжительности, задержки и кривой замедления уходящего перехода.
  • v-leave-to: Конечное состояние отпуска. Добавлен один кадр после срабатывания уходящего перехода (одновременно v-leave-fromудаляется), удаляется при завершении перехода/анимации.
v-enter-active и v-leave-active дайте нам возможность указывать различные кривые замедления для переходов входа/выхода, пример которых мы увидим в следующих разделах.

Именованные переходы

Переход можно назвать с помощью name свойства:
Для именованного перехода его классы перехода будут иметь префикс его имени вместо v. Например, fade-enter-active вместо v-enter-active. CSS для перехода затухания должен выглядеть следующим образом:

CSS-переходы

Transition чаще всего используется в сочетании с собственными CSS-переходами , как показано в базовом примере выше. Свойство CSS transition— это сокращение, которое позволяет нам указать несколько аспектов перехода, включая свойства, которые должны быть анимированы, продолжительность перехода и кривые замедления .
Вот более сложный пример, в котором происходит переход нескольких свойств с разной продолжительностью и кривыми замедления для входа и выхода

CSS-анимации

Нативная CSS-анимация применяется так же, как и CSS-переходы, с той разницей, что *-enter-from она удаляется не сразу после вставки элемента, а по animationendсобытию.
Для большинства CSS-анимаций мы можем просто объявить их в классах *-enter-active и *-leave-active. Вот пример:

Пользовательские классы перехода

Вы также можете указать собственные классы перехода, передав следующие реквизиты Transition
  • enter-from-class
  • enter-active-class
  • enter-to-class
  • leave-from-class
  • leave-active-class
  • leave-to-class
Они переопределят обычные имена классов. Это особенно полезно, если вы хотите объединить систему переходов Vue с существующей библиотекой анимации CSS, такой как Animate.css

Совместное использование переходов и анимации

Vue необходимо подключить прослушиватели событий, чтобы знать, когда переход закончился. Это может быть transitionend или animationend, в зависимости от типа примененных правил CSS. Если вы используете только один или другой тип, Vue может автоматически определить правильный тип.
Однако в некоторых случаях вам может потребоваться использовать оба элемента в одном элементе, например, иметь CSS-анимацию, запускаемую Vue, вместе с эффектом перехода CSS при наведении курсора. В этих случаях вам придется явно объявить тип, о котором вы хотите, чтобы Vue заботился type, передав свойство со значением либо animation или transition

Вложенные переходы и явная длительность перехода

Хотя классы перехода применяются только к прямому дочернему элементу в Transition, мы можем переходить вложенные элементы с помощью вложенных селекторов CSS:
Мы даже можем добавить задержку перехода к вложенному элементу при вводе, что создаст последовательность анимации ввода в шахматном порядке:
Однако это создает небольшую проблему. По умолчанию Transition компонент пытается автоматически определить момент завершения перехода, прослушивая первое transitionend событие или animationend событие в корневом элементе перехода. При вложенном переходе желаемое поведение должно ожидать завершения переходов всех внутренних элементов.
В таких случаях вы можете указать явную продолжительность перехода (в миллисекундах), используя durationсвойство transition компонента. Общая длительность должна соответствовать задержке плюс продолжительности перехода внутреннего элемента:
При необходимости вы также можете указать отдельные значения длительности входа и выхода с помощью объекта

Вопросы производительности

Вы можете заметить, что показанная выше анимация в основном использует такие свойства, как transform и opacity. Эти свойства эффективны для анимации, потому что
  • 1. Они не влияют на макет документа во время анимации, поэтому не вызывают дорогостоящего расчета макета CSS в каждом кадре анимации.
  • 2. Большинство современных браузеров могут использовать аппаратное ускорение графического процессора при анимации transform
Для сравнения, такие свойства, как height или margin будут запускать макет CSS, поэтому их анимация обходится гораздо дороже, и их следует использовать с осторожностью. Мы можем проверить такие ресурсы, как CSS-Triggers , чтобы увидеть, какие свойства будут активировать макет, если мы их анимируем

JavaScript-хуки

Вы можете подключиться к процессу перехода с помощью JavaScript, прослушивая события компонента Transition
Эти хуки можно использовать в сочетании с CSS-переходами/анимацией или отдельно.
При использовании переходов только на JavaScript обычно рекомендуется добавить свойство :css="false". Это явно указывает Vue пропустить автоматическое обнаружение перехода CSS. Помимо большей производительности, это также предотвращает случайное вмешательство правил CSS в переход
С помощью :css="false" мы также несем полную ответственность за контроль завершения перехода. В этом случае doneобратные вызовы необходимы для перехватчиков @enter и @leave. В противном случае хуки будут вызываться синхронно, и переход завершится немедленно.
Вот демонстрация использования библиотеки GreenSock для выполнения анимации. Вы, конечно, можете использовать любую другую библиотеку анимации, например Anime.js или Motion One

Многоразовые переходы

Переходы можно повторно использовать через систему компонентов Vue. Чтобы создать многоразовый переход, мы можем создать компонент, который обертывает компонент Transition и передает содержимое слота:
Теперь MyTransition можно импортировать и использовать так же, как встроенную версию:

Переход при появлении

Если вы также хотите применить переход при первоначальном рендеринге узла, вы можете добавить свойство appear

Переход между элементами

Помимо переключения элемента с помощью v-if / v-show мы также можем переходить между двумя элементами с помощью v-if / v-else / v-else-if, если мы уверены, что в любой момент времени отображается только один элемент:

Режимы перехода

В предыдущем примере входящие и выходящие элементы анимируются одновременно, и нам пришлось сделать их, position: absolute чтобы избежать проблем с макетом, когда оба элемента присутствуют в DOM.
Однако в некоторых случаях это не вариант или просто нежелательное поведение. Мы можем захотеть, чтобы выходящий элемент анимировался первым, а входящий элемент вставлялся только после завершения анимации ухода. Оркестровать такие анимации вручную было бы очень сложно — к счастью, мы можем включить такое поведение, передав Transition свойство mode
Transition также поддерживает mode="in-out", хотя используется гораздо реже

Переход между компонентами

Transition также может использоваться вокруг динамических компонентов

Динамические переходы

Transition реквизит вроде nameтоже может быть динамичным! Это позволяет нам динамически применять различные переходы в зависимости от изменения состояния:
Это может быть полезно, если вы определили CSS-переходы/анимацию, используя соглашения о классах переходов Vue, и хотите переключаться между ними.
Вы также можете применять различное поведение в перехватчиках переходов JavaScript в зависимости от текущего состояния вашего компонента. Наконец, окончательный способ создания динамических переходов — это использование повторно используемых компонентов перехода , которые принимают реквизиты для изменения характера используемых переходов. Это может показаться банальным, но единственным ограничением на самом деле является ваше воображение.

# TransitionGroup

TransitionGroup — это встроенный компонент, предназначенный для анимации вставки, удаления и изменения порядка элементов или компонентов, отображаемых в списке.

Отличия от <Transition>

TransitionGroup поддерживает те же свойства, классы перехода CSS и прослушиватели перехватчиков JavaScript, что и Transition, со следующими отличиями:
  • По умолчанию он не отображает элемент-оболочку. Но вы можете указать элемент, который будет отображаться с помощью tag свойства.
  • Режимы перехода недоступны, поскольку мы больше не чередуем взаимоисключающие элементы.
  • Элементы внутри всегда должны иметь уникальный key атрибут.
  • Классы перехода CSS будут применяться к отдельным элементам в списке, а не к самой группе/контейнеру.
Обратите внимание
При использовании в шаблонах DOM на него следует ссылаться как transition-group

Переходы «Вход/Выход»

Вот пример применения переходов входа/выхода к v-for списку с использованием TransitionGroup

Переместить переходы

У приведенной выше демонстрации есть некоторые очевидные недостатки: когда элемент вставляется или удаляется, окружающие его элементы мгновенно «подпрыгивают» на место, а не перемещаются плавно. Мы можем исправить это, добавив несколько дополнительных правил CSS:
Теперь это выглядит намного лучше — даже анимация плавная, когда весь список перетасовывается

Потрясающие переходы списков

Взаимодействуя с переходами JavaScript через атрибуты данных, можно также расположить переходы в списке в шахматном порядке. Сначала мы визуализируем индекс элемента как атрибут данных элемента DOM:
Затем в хуках JavaScript мы анимируем элемент с задержкой на основе атрибута данных. В этом примере для выполнения анимации используется библиотека GreenSock :