Vue Animations
When elements are added or removed using v-if, v-show, or dynamic components, the built-in <Transition> component in Vue facilitates the creation of animations.
In other situations, there’s nothing wrong with employing standard CSS animations and transitions.
A Short Introduction to CSS Transition and Animation
For this section of the training, a basic understanding of CSS transitions and animations is required.
However, before we develop animations using the built-in <Transition> component particular to Vue, let’s take a look at two instances of basic CSS transitions and animations that work with Vue.
Example
App.vue:
Basic CSS Transition
In the example above, we apply a class to the <div> element using v-bind, causing it to rotate. Because the rotation is defined using the CSS transition feature, it takes one second to complete.
The CSS animation property can be used to move an object, as demonstrated in the example below.
Example
App.vue:
Basic CSS Animation
The < Transition > Component
Using simple CSS animations and transitions, as we did in the last two examples, is perfectly acceptable.
Fortunately, Vue comes with a built-in <Transition> component that we can use to animate an element when it is added or removed from our application using v-if or v-show. This is something that would be difficult to accomplish with simple CSS animation.
First, let’s create an application where a button adds or removes a paragraph mark (<p>).
Example
App.vue:
Add/Remove
Tag
Hello World!
Let’s now encircle the <p> element with the <Transition> component to observe how we may animation the <p> tag being removed.
The <Transition> component comes with six different CSS classes that we may use to animate the addition or removal of components.
In the example below, we will create a fade-out animation when the <p> tag is deleted by utilizing the automatically accessible classes v-leave-from and v-leave-to:
Example
App.vue:
Add/Remove
Tag
Hello World!
The Six < Transition > Classes
The <Transition> component makes six classes instantly available to us.
We can use the first three classes to animate the transition when an element is added to the <Transition> component:
v-enter-from
v-enter-active
v-enter-to
Additionally, we can utilize the following three classes as an element inside the <Transition> component is removed:
v-leave-from
v-leave-active
v-leave-to
Note: The <Transition> component can only have one element at the root level.
Now, let’s employ four of these classes to enable animation for both the addition and removal of the <p> tag.
Example
App.vue:
Add/Remove
Tag
Hello World!
The v-enter-active and v-leave-active properties can also be used to establish style or animation when an element is added or removed:
Example
App.vue:
Add/Remove
Tag
Hello World!
The Transition 'name' Prop
You will need distinct names for the <Transition> components in order to distinguish them if you have many <Transition> components and you would want at least one of them to have a different animation.
To specify alternative CSS animation rules for a particular <Transition> component, we can select the name prop for the component, which also modifies the names of the transition classes.
The automatically available classes will now begin with’swirl-‘ rather than ‘v-‘ if the transition name prop value is set to’swirl’:
- swirl-enter-from
- swirl-enter-active
- swirl-enter-to
- swirl-leave-from
- swirl-leave-active
- swirl-leave-to
The <Transition> components in the example below have different animations applied to them using the name prop. As a result, animations for one <Transition> component are applied using the automatically produced CSS classes that begin with ‘v-‘. We rename the other <Transition> component to’swirl’ so that the automatically generated CSS classes beginning with’swirl-‘ can be used to give it animation rules.
Example
App.vue:
Add/Remove
Tag
The second transition in this example has the name prop "swirl", so that we can keep the transitions apart with different class names.
Hello World!
Hello World!
JavaScript Transition Hooks
As was previously discussed, each Transition class correlates to an event that we may use to perform JavaScript code.
Transition Class | JavaScript Event |
---|---|
v-enter-from | before-enter |
v-enter-active | enter |
v-enter-to | after-enter enter-cancelled |
v-leave-from | before-leave |
v-leave-active | leave |
v-leave-to | after-leave leave-cancelled  (v-show only) |
In the example below, a method is called that shows a red <div> element when the after-enter event occurs.
Example
App.vue:
JavaScript Transition Hooks
This code hooks into "after-enter" so that after the initial animation is done, a method runs that displays a red div.
Hello World!
This appears after the "enter-active" phase of the transition.
In the example below, you may utilize the “Toggle” button to stop the <p> element’s enter transition phase, causing the enter-cancelled event to be triggered:
Example
App.vue:
The 'enter-cancelled' Event
Click the toggle button again before the enter animation is finished to trigger the 'enter-cancelled' event.
Hello World!
You interrupted the "enter-active" transition.
The 'appear' Prop
Use the appear prop on the <Transition> component if you have an element you want to animate when the page loads.
...
In this instance, upon initial page load, the appear prop initiates an animation:
Example
App.vue:
The 'appear' Prop
The 'appear' prop starts the animation when the p tag below is rendered for the first time as the page opens. Without the 'appear' prop, this example would have had no animation.
Hello World!
Transition Between Elements
If we use <v-if> and <v-else-if> to ensure that only one element is displayed at a time, we can also use the <Transition> component to switch between multiple elements:
Example
App.vue:
Transition Between Elements
Click the button to get a new image.
The new image is added before the previous is removed. We will fix this in the next example with mode="out-in".
mode="out-in"
The following image is added in the example above before the preceding image is deleted.
To ensure that an element is removed before another is introduced, we utilize the mode=”out-in” prop and prop value on the <Transition> component.
Example
Apart from the mode=”out-in” setting, the ‘imgActive‘ computed value is also utilized in this example instead of the ‘newImg‘ method from the previous example.
App.vue:
mode="out-in"
Click the button to get a new image.
With mode="out-in", the next image is not added until the current image is removed. Another difference from the previous example, is that here we use computed prop instead of a method.
Transition with Dynamic Components
Additionally, we may animation transitioning between dynamic components by using the <Transition> component:
Example
App.vue:
Transition with Dynamic Components
The Transition component wraps around the dynamic component so that the switching can be animated.