1. Transition และ Animation ใน Vue.js คืออะไร?
Vue.js มีระบบ Transition และ Animation ที่ทำให้คุณสามารถเพิ่มเอฟเฟกต์การเปลี่ยนแปลงเมื่อแสดงผลหรือซ่อน Component หรือ DOM Element ได้อย่างง่ายดาย โดยใช้ <transition>
และ <transition-group>
2. การใช้ <transition>
การเพิ่ม Transition เบื้องต้น
<template>
<div>
<button @click="toggle">Toggle Box</button>
<transition name="fade">
<div v-if="isVisible" class="box"></div>
</transition>
</div>
</template>
<script>
export default {
data() {
return {
isVisible: false
};
},
methods: {
toggle() {
this.isVisible = !this.isVisible;
}
}
};
</script>
<style>
.fade-enter-active, .fade-leave-active {
transition: opacity 0.5s;
}
.fade-enter, .fade-leave-to {
opacity: 0;
}
.box {
width: 100px;
height: 100px;
background-color: blue;
}
</style>
คำอธิบาย:
- ใช้
<transition>
ครอบ Element ที่ต้องการเพิ่ม Transition - กำหนดคลาส CSS สำหรับสถานะต่าง ๆ เช่น
*-enter
,*-leave
3. การใช้ Transition แบบกำหนดเอง
การใช้ JavaScript Hooks
<template>
<div>
<button @click="toggle">Toggle Box</button>
<transition @before-enter="beforeEnter" @enter="enter" @leave="leave">
<div v-if="isVisible" class="box"></div>
</transition>
</div>
</template>
<script>
export default {
data() {
return {
isVisible: false
};
},
methods: {
toggle() {
this.isVisible = !this.isVisible;
},
beforeEnter(el) {
el.style.opacity = 0;
},
enter(el, done) {
setTimeout(() => {
el.style.opacity = 1;
done();
}, 500);
},
leave(el, done) {
setTimeout(() => {
el.style.opacity = 0;
done();
}, 500);
}
}
};
</script>
<style>
.box {
width: 100px;
height: 100px;
background-color: red;
}
</style>
คำอธิบาย:
- ใช้ JavaScript Hooks เพื่อควบคุม Transition ด้วยฟังก์ชัน เช่น
beforeEnter
,enter
,leave
4. การใช้ <transition-group>
<transition-group>
ใช้สำหรับการเพิ่ม Transition ให้กับรายการ (List) ที่มีการเพิ่มหรือลบ
ตัวอย่าง:
<template>
<div>
<button @click="addItem">Add Item</button>
<transition-group name="list" tag="ul">
<li v-for="(item, index) in items" :key="item" class="list-item">
{{ item }}
<button @click="removeItem(index)">Remove</button>
</li>
</transition-group>
</div>
</template>
<script>
export default {
data() {
return {
items: []
};
},
methods: {
addItem() {
this.items.push(`Item ${this.items.length + 1}`);
},
removeItem(index) {
this.items.splice(index, 1);
}
}
};
</script>
<style>
.list-enter-active, .list-leave-active {
transition: all 0.5s;
}
.list-enter, .list-leave-to {
opacity: 0;
transform: translateY(20px);
}
.list-item {
margin: 10px 0;
padding: 10px;
background-color: lightgray;
border: 1px solid #ccc;
}
</style>
คำอธิบาย:
- ใช้
<transition-group>
แทน<transition>
สำหรับการจัดการรายการ - ใช้
tag
เพื่อกำหนด Element ที่ครอบรายการ เช่น<ul>
- เพิ่มและลบรายการพร้อม Transition เอฟเฟกต์
5. การใช้ Animation Framework
คุณสามารถใช้ Framework เช่น Animate.css หรือ GSAP ร่วมกับ Vue.js เพื่อสร้าง Animation ที่ซับซ้อน
ตัวอย่างการใช้ Animate.css
npm install animate.css
<template>
<div>
<button @click="toggle">Toggle Box</button>
<transition name="animated" enter-active-class="animate__animated animate__fadeIn" leave-active-class="animate__animated animate__fadeOut">
<div v-if="isVisible" class="box"></div>
</transition>
</div>
</template>
<script>
import 'animate.css';
export default {
data() {
return {
isVisible: false
};
},
methods: {
toggle() {
this.isVisible = !this.isVisible;
}
}
};
</script>
<style>
.box {
width: 100px;
height: 100px;
background-color: green;
}
</style>
6. สรุป
ในบทนี้ คุณได้เรียนรู้:
- การใช้
<transition>
และ<transition-group>
เพื่อเพิ่ม Transition และ Animation - การใช้ CSS และ JavaScript Hooks สำหรับการควบคุม Transition
- การจัดการรายการด้วย
<transition-group>
- การประยุกต์ใช้ Animation Framework ร่วมกับ Vue.js
ในบทถัดไป เราจะศึกษาการใช้ Slot เพื่อสร้าง Component ที่ยืดหยุ่นและปรับแต่งได้!