Penerapan Animasi dan Transisi di Vue.js untuk Pengalaman Pengguna yang Lebih Menarik

Dalam pengembangan antarmuka pengguna (UI), respons visual sering kali menjadi pembeda antara aplikasi yang terasa kaku dan yang terasa dinamis serta intuitif. Salah satu cara paling efektif untuk meningkatkan interaksi pengguna adalah dengan menerapkan animasi dan transisi yang halus dan tepat guna.
Vue.js menyediakan dukungan bawaan untuk transisi elemen DOM—baik dengan CSS maupun JavaScript. Fitur ini memungkinkan developer untuk menghidupkan UI tanpa perlu menambahkan dependensi tambahan, meskipun Vue juga fleksibel untuk diintegrasikan dengan library seperti Animate.css atau GSAP bagi yang menginginkan kontrol lebih lanjut.
Artikel ini akan mengulas bagaimana menerapkan transisi dan animasi di Vue 3 menggunakan <transition>
dan <transition-group>
, disertai contoh kode yang langsung bisa digunakan. Kita juga akan bahas beberapa best practice agar animasi tidak hanya menarik secara visual, tetapi juga mendukung usability.
Dasar: Menggunakan <transition>
untuk Elemen Tunggal
Vue menyediakan komponen <transition>
untuk menangani perubahan elemen di DOM—misalnya saat elemen muncul atau menghilang karena kondisi seperti v-if
. Vue akan menambahkan class otomatis yang bisa kita definisikan di CSS.
Contoh: Transisi Fade In/Out
<template>
<button @click="visible = !visible">Toggle</button>
<transition name="fade">
<div v-if="visible" class="box">Animated Box</div>
</transition>
</template>
<script setup>
import { ref } from 'vue'
const visible = ref(false)
</script>
<style scoped>
.fade-enter-active, .fade-leave-active {
transition: opacity 0.3s ease;
}
.fade-enter-from, .fade-leave-to {
opacity: 0;
}
.box {
background-color: #42b983;
color: white;
padding: 16px;
border-radius: 8px;
margin-top: 12px;
}
</style>
Di sini, transisi dilakukan dengan class prefix fade
. Vue akan menambahkan dan menghapus class seperti fade-enter-from
, fade-leave-to
, dan lainnya secara otomatis sesuai siklus hidup elemen.
Animasi pada Daftar: <transition-group>
Ketika berhadapan dengan list yang dinamis—misalnya daftar notifikasi, item belanja, atau elemen hasil pencarian—komponen <transition-group>
sangat berguna. Berbeda dengan <transition>
, komponen ini bisa menangani beberapa elemen sekaligus, serta mendukung animasi saat elemen masuk, keluar, atau berubah urutan.
Contoh: Menambahkan Item Secara Dinamis
<template>
<button @click="addItem">Tambah Item</button>
<transition-group name="slide" tag="ul" class="item-list">
<li v-for="item in items" :key="item" class="item">
{{ item }}
</li>
</transition-group>
</template>
<script setup>
import { ref } from 'vue'
const items = ref<string[]>([])
function addItem() {
items.value.push(`Item ${items.value.length + 1}`)
}
</script>
<style scoped>
.item-list {
margin-top: 20px;
padding: 0;
list-style: none;
}
.item {
margin: 8px 0;
padding: 12px;
background-color: #35495e;
color: #fff;
border-radius: 6px;
}
.slide-enter-active, .slide-leave-active {
transition: all 0.3s ease;
}
.slide-enter-from {
opacity: 0;
transform: translateY(10px);
}
.slide-leave-to {
opacity: 0;
transform: translateY(-10px);
}
</style>
Penting: setiap item harus memiliki :key
unik untuk membantu Vue mengenali mana yang berubah, masuk, atau keluar.
Integrasi dengan Animate.css
Bagi kamu yang ingin menerapkan animasi tanpa menulis CSS sendiri, Animate.css bisa menjadi opsi yang efisien. Library ini menyediakan berbagai animasi siap pakai yang bisa langsung diterapkan pada elemen.
Cara Menggunakan Animate.css
- Install terlebih dahulu:
npm install animate.css
- Implementasi pada Vue:
<template>
<button @click="visible = !visible">Toggle</button>
<transition
enter-active-class="animate__animated animate__fadeIn"
leave-active-class="animate__animated animate__fadeOut"
>
<div v-if="visible" class="animated-box">Animated with Animate.css</div>
</transition>
</template>
<script setup>
import { ref } from 'vue'
import 'animate.css'
const visible = ref(false)
</script>
<style scoped>
.animated-box {
background-color: #f39c12;
padding: 14px;
border-radius: 6px;
margin-top: 10px;
color: white;
}
</style>
Animate.css cocok untuk animasi ringan seperti notifikasi atau transisi halaman sederhana.
Menggunakan GSAP untuk Kontrol Lebih Lanjut
Untuk animasi kompleks dan terkoordinasi, GSAP (GreenSock Animation Platform) menawarkan kontrol yang jauh lebih fleksibel dibandingkan CSS.
Contoh: Transisi dengan JavaScript
<template>
<button @click="visible = !visible">Toggle GSAP</button>
<transition @enter="enterAnim" @leave="leaveAnim">
<div v-if="visible" class="gsap-box">GSAP in action</div>
</transition>
</template>
<script setup>
import { ref } from 'vue'
import gsap from 'gsap'
const visible = ref(false)
function enterAnim(el, done) {
gsap.fromTo(el, { opacity: 0, y: -20 }, { opacity: 1, y: 0, duration: 0.4, onComplete: done })
}
function leaveAnim(el, done) {
gsap.to(el, { opacity: 0, y: 20, duration: 0.4, onComplete: done })
}
</script>
<style scoped>
.gsap-box {
background: #2ecc71;
color: #fff;
padding: 18px;
border-radius: 8px;
text-align: center;
margin-top: 12px;
}
</style>
Dengan GSAP, kamu bisa mengatur detail seperti timing, delay, dan sequence, bahkan mengelola animasi berdasarkan timeline yang kompleks.
Tips Praktis
- Gunakan animasi untuk meningkatkan kejelasan alur aplikasi, bukan sekadar estetika.
- Pertahankan durasi animasi di bawah 500ms untuk menjaga responsivitas.
- Jangan lupa mengatur
:key
di elemen list saat menggunakan<transition-group>
. - Gunakan
transition-mode="out-in"
jika kamu ingin animasi keluar selesai terlebih dahulu sebelum elemen baru muncul. - Hindari animasi berlebihan. Gunakan hanya di tempat yang menambah makna atau interaksi.
Vue menawarkan pendekatan yang sangat praktis dan fleksibel untuk menerapkan animasi dan transisi. Baik kamu ingin transisi sederhana menggunakan CSS, integrasi dengan library seperti Animate.css, maupun kontrol animasi penuh dengan GSAP—Vue mendukung semuanya.
Animasi yang dirancang dengan baik tidak hanya mempercantik tampilan, tetapi juga memperjelas interaksi pengguna. Dengan pemahaman yang kuat terhadap fitur transisi Vue, kamu bisa menciptakan antarmuka yang tidak hanya fungsional, tapi juga menyenangkan untuk digunakan.