Vue 3 is in beta and it’s subject to change.
Vue 3 is the up and coming version of Vue front end framework.
It builds on the popularity and ease of use of Vue 2.
In this article, we’ll look at how to add transitions with Vue 3.
Transitions
We can add transitions to our Vue app with various components
The transition
component helps us add enter and leave transitions which are triggered by v-if
.
Transition modes let us change the ordering of a transition.
Transitions with multiple components can be added with the transition-group
component.
We can transition to different states in an app with watchers
.
Class-based Animations & Transitions
We can add transitions by binding to a class.
For example, we can write:
<!DOCTYPE html>
<html lang="en">
<head>
<title>App</title>
<script src="https://unpkg.com/vue@next"></script>
<style>
.shake {
animation: shake 1s cubic-bezier(0.31, 0.07, 0.39, 0.97) both;
transform: translate3d(0, 0, 0);
backface-visibility: hidden;
perspective: 1000px;
}
@keyframes shake {
10%,
90% {
transform: translate3d(-1px, 0, 0);
}
20%,
80% {
transform: translate3d(2px, 0, 0);
}
30%,
50%,
70% {
transform: translate3d(-4px, 0, 0);
}
40%,
60% {
transform: translate3d(4px, 0, 0);
}
}
</style>
</head>
<body>
<div id="app">
<div :class="{ shake: on }">
<button @click="on = !on">toggle</button>
<p v-if="on">hello world!</p>
</div>
</div>
<script>
const app = Vue.createApp({
data() {
return {
on: false
};
}
});
app.mount("#app");
</script>
</body>
</html>
to add the shaking transition effect to our div.
We have the translate3d
to add the shaking left and right,
Negative is left and positive is right.
The shake
class has the shake
transition.
cubic-bezier
is the easing function, which makes the transition non-linear.
transform
keeps the div in place.
We apply the shake
class when on
is true
, so when we click the toggle button to set on
to true
, we’ll see the elements shake.
Transitions with Style Bindings
We can also add transitions with style bindings.
For example, we can write:
<!DOCTYPE html>
<html lang="en">
<head>
<title>App</title>
<script src="https://unpkg.com/vue@next"></script>
</head>
<body>
<div id="app">
<div
@mousemove="onMouseMove"
:style="{ backgroundColor: `rgb(${x}, 80, 50)` }"
class="movearea"
>
<p>x: {{x}}</p>
</div>
</div>
<script>
const app = Vue.createApp({
data() {
return {
x: 0
};
},
methods: {
onMouseMove(e) {
this.x = e.clientX;
}
}
});
app.mount("#app");
</script>
</body>
</html>
When our mouse moves, then the onMouseMove
method is called.
This gets the x coordinate of the mouse and set it to the this.x
state.
Then we used x
to set the background color by changing the first value of rgb
.
Therefore, when we move our mouse, the background color will change.
Performance
CSS animations has better performance than using JavaScript to change the position of our elements.
Every redraw with JavaScript is an expensive operation, so we try to eliminate them if we can.
CSS animations is also faster because browsers have hardware acceleration capabilities.
Properties like perspective
, backface-visibility
, and transform: translateZ(x)
will trigger a browser’s hardware acceleration capabilities.
Conclusion
Vue lets us animate our elements with CSS and class or style bindings.