Vue অ্যানিমেশন
Vue-এ বিল্ট<Transition>উপাদানগুলি যখন ভি-ইফ, ভি-শো বা গতিশীল উপাদানগুলির সাথে যুক্ত বা সরানো হয় তখন উপাদানটি অ্যানিমেশন সম্পাদন করতে সহায়তা করে।
অন্যান্য ক্ষেত্রে প্লেইন সিএসএস ট্রানজিশন এবং অ্যানিমেশন ব্যবহারে কোনো ভুল নেই।
CSS ট্রানজিশন এবং অ্যানিমেশনের একটি সংক্ষিপ্ত ভূমিকা
টিউটোরিয়ালের এই অংশে মৌলিক CSS অ্যানিমেশন এবং ট্রানজিশনের জ্ঞান প্রয়োজন।
কিন্তু Vue-তে নির্দিষ্ট বিল্ট-ইন রয়েছে<Transition>কম্পোনেন্ট ব্যবহার করে অ্যানিমেশন তৈরি করার আগে, আসুন Vue এর সাথে কীভাবে সাধারণ CSS অ্যানিমেশন এবং ট্রানজিশন ব্যবহার করা যায় তার দুটি উদাহরণ দেখি।
উদাহরণ
আপনার নিজস্ব Vue সার্ভার পান
App.vue:
<template>
<h1>Basic CSS Transition</h1>
<button @click="this.doesRotate = true">Rotate</button>
<div :class="{ rotate: doesRotate }"></div>
</template>
<script>
export default {
data() {
return {
doesRotate: false
}
}
}
</script>
<style scoped>
.rotate {
rotate: 160deg;
transition: rotate 1s;
}
div {
border: solid black 2px;
background-color: lightcoral;
width: 60px;
height: 60px;
}
h1, button, div {
margin: 10px;
}
</style>
CSS রূপান্তর: 1 সেকেন্ড
উপরের উদাহরণে,<div>আমরা ট্যাগ ঘোরানোর জন্য একটি ক্লাস প্রদান করতে v-বাইন্ড ব্যবহার করি। চক্রটি 1 সেকেন্ড সময় নেয় কারণ এটি CSS ট্রানজিশন বৈশিষ্ট্য দ্বারা সংজ্ঞায়িত করা হয়।
নীচের উদাহরণে, আমরা দেখি কিভাবে আমরা CSS অ্যানিমেশন প্রপার্টি দিয়ে একটি বস্তুকে অ্যানিমেট করতে পারি।
<template>
<h1>Basic CSS Animation</h1>
<button @click="this.doesMove = true">Start</button>
<div :class="{ move: doesMove }"></div>
</template>
<script>
export default {
data() {
return {
doesMove: false
}
}
}
</script>
<style scoped>
.move {
animation: move .5s alternate 4 ease-in-out;
}
@keyframes move {
from {
translate: 0 0;
}
to {
translate: 70px 0;
}
}
div {
border: solid black 2px;
background-color: lightcoral;
border-radius: 50%;
width: 60px;
height: 60px;
}
h1, button, div {
margin: 10px;
}
</style>
CSS অ্যানিমেশন: 0.5 সেকেন্ড, 4 বার
<ট্রানজিশন> উপাদান
প্লেইন সিএসএস ট্রানজিশন এবং অ্যানিমেশন ব্যবহারে কিছু ভুল নেই যেমন আমরা উপরের দুটি উদাহরণে করেছি।
কিন্তু সৌভাগ্যবশত Vue-তে বিল্ট-ইন v-if বা v-show আছে যেখানে আপনি অ্যানিমেট করতে চান যখন কোনো উপাদান যোগ করা বা সরানো হয়।<Transition>উপাদানটি রেন্ডার করে কারণ এটি প্লেইন CSS অ্যানিমেশনের সাথে করা কঠিন হবে।
প্রথমে একটি বোতাম<p>আসুন একটি অ্যাপ্লিকেশন তৈরি করি যা একটি ট্যাগ যোগ করে বা সরিয়ে দেয়:
<template>
<h1>Add/Remove <p> Tag</h1>
<button @click="this.exists = !this.exists">{{btnText}}</button><br>
<p v-if="exists">Hello World!</p>
</template>
<script>
export default {
data() {
return {
exists: false
}
},
computed: {
btnText() {
if(this.exists) {
return 'Remove';
}
else {
return 'Add';
}
}
}
}
</script>
এখন<Transition>উপাদান<p>ট্যাগের চারপাশে মোড়ানো,<p>আসুন দেখি কিভাবে আমরা একটি ট্যাগ অপসারণ অ্যানিমেট করতে পারি।
আমরা<Transition>কম্পোনেন্ট ব্যবহার করার সময়, আমরা স্বয়ংক্রিয়ভাবে ছয়টি ভিন্ন CSS ক্লাস পাই যা উপাদান যোগ করা বা সরানো হলে অ্যানিমেট করতে ব্যবহার করা যেতে পারে।
ছয়টি <ট্রানজিশন> ক্লাস
আমরা<Transition>কম্পোনেন্ট ব্যবহার করার সময় আমাদের কাছে স্বয়ংক্রিয়ভাবে উপলব্ধ ছয়টি ক্লাস রয়েছে।
<Transition>যখন একটি উপাদান একটি উপাদান যোগ করা হয়, এই প্রথম তিনটি ক্লাস সেই রূপান্তরকে অ্যানিমেট করতে ব্যবহার করা যেতে পারে:
v-enter-active
v-enter-to
v-leave-active
v-leave-to
দ্রষ্টব্য:
<Transition>একটি উপাদানের মূল অবস্থানে শুধুমাত্র একটি উপাদান থাকতে পারে।
এখন,<p>একটি ট্যাগ যোগ করা এবং সরানো হলে আমরা এই চারটি ক্লাস অ্যানিমেট করতে ব্যবহার করব।
<template>
<h1>Add/Remove <p> Tag</h1>
<button @click="this.exists = !this.exists">{{btnText}}</button><br>
<Transition>
<p v-if="exists">Hello World!</p>
</Transition>
</template>
<script>
export default {
data() {
return {
exists: false
}
},
computed: {
btnText() {
if(this.exists) {
return 'Remove';
}
else {
return 'Add';
}
}
}
}
</script>
<style>
.v-enter-from {
opacity: 0;
translate: -100px 0;
}
.v-enter-to {
opacity: 1;
translate: 0 0;
}
.v-leave-from {
opacity: 1;
translate: 0 0;
}
.v-leave-to {
opacity: 0;
translate: 100px 0;
}
p {
background-color: lightgreen;
display: inline-block;
padding: 10px;
transition: all 0.5s;
}
</style>
Vue অ্যানিমেশন টিউটোরিয়াল
<Transition>উপাদানটি স্বয়ংক্রিয়ভাবে আমাদের 6টি ভিন্ন CSS ক্লাস সরবরাহ করে যা একটি উপাদানকে অ্যানিমেট করতে ব্যবহার করা যেতে পারে।
শূন্যস্থানগুলি পূরণ করুন যাতে একটি উপাদান প্রদর্শিত হলে প্রথম 3টি শ্রেণীর নাম সঠিক ক্রমে পূরণ হয়:
ভিউ ট্রানজিশন ক্লাস টিউটোরিয়াল
1. v-_____-from
2. v-_____-active
3. v-_____-to
নীচের বিকল্পগুলি থেকে সঠিক উত্তর চয়ন করুন:
Transition 'name' Prop
আপনি অনেক আছে<Transition>উপাদান আছে, কিন্তু অন্তত একটি<Transition>যদি উপাদানটির আলাদা অ্যানিমেশন থাকতে হয়, তবে তাদের আলাদা করার জন্য বিভিন্ন নাম প্রয়োজন।
নাম প্রপ সহ একটি<Transition>উপাদানটির নাম নির্বাচন করা যেতে পারে, এবং এটি ট্রানজিশন ক্লাসের নামও পরিবর্তন করে যাতে সেই উপাদানটির জন্য বিভিন্ন CSS অ্যানিমেশন নিয়ম সেট করা যায়।
<Transition name="swirl">
যদি ট্রানজিশন নামের প্রপ মানটি 'swirl' এ সেট করা থাকে, তাহলে স্বয়ংক্রিয়ভাবে উপলব্ধ ক্লাসগুলি এখন 'v-'-এর পরিবর্তে 'swirl-' দিয়ে শুরু হবে:
swirl-enter-from
swirl-enter-active
swirl-enter-to
swirl-leave-from
swirl-leave-active
swirl-leave-to
JavaScript Transition Hooks
প্রতিটি ট্রানজিশন ক্লাস একটি ইভেন্টের সাথে মিলে যায় যা আমরা নির্দিষ্ট করা কিছু জাভাস্ক্রিপ্ট কোড চালানোর জন্য হুক করতে পারি।
| ট্রানজিশন ক্লাস | জাভাস্ক্রিপ্ট ইভেন্ট |
|---|---|
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-শো) |
'appear' Prop
আপনার যদি এমন একটি উপাদান থাকে যা আপনি পৃষ্ঠাটি লোড হওয়ার সময় অ্যানিমেট করতে চান,<Transition>উপস্থিত প্রপ উপাদান ব্যবহার করা উচিত.
<Transition appear>
...
</Transition>
উপাদানগুলির মধ্যে রূপান্তর
<Transition>একটি উপাদান একাধিক উপাদানের মধ্যে স্যুইচ করতে ব্যবহার করা যেতে পারে,<v-if>এবং<v-else-if>আপনি যদি নিশ্চিত করেন যে একবারে শুধুমাত্র একটি উপাদান প্রদর্শিত হচ্ছে ব্যবহার করে:
<template>
<h1>Transition Between Elements</h1>
<button @click="newImg">Next image</button><br>
<Transition>
<img src="/img_pizza.svg" v-if="imgActive === 'pizza'">
<img src="/img_apple.svg" v-else-if="imgActive === 'apple'">
<img src="/img_cake.svg" v-else-if="imgActive === 'cake'">
<img src="/img_fish.svg" v-else-if="imgActive === 'fish'">
<img src="/img_rice.svg" v-else-if="imgActive === 'rice'">
</Transition>
</template>
mode="out-in"
উপরের উদাহরণে, পূর্ববর্তী চিত্রটি সরানোর আগে পরবর্তী চিত্রটি যোগ করা হয়েছে।
একটি উপাদান মুছে ফেলা সম্পূর্ণ হওয়ার আগে পরবর্তী উপাদান যোগ করা থেকে প্রতিরোধ করতে<Transition>বিবৃতিতেmode="out-in"আমরা প্রপ এবং প্রপ মান ব্যবহার করি।
<Transition mode="out-in">
<img src="/img_pizza.svg" v-if="imgActive === 'pizza'">
<img src="/img_apple.svg" v-else-if="imgActive === 'apple'">
<img src="/img_cake.svg" v-else-if="imgActive === 'cake'">
</Transition>
মোড বিকল্প:
mode="out-in":পূর্ববর্তী উপাদান সম্পূর্ণরূপে প্রস্থান করার পরে একটি নতুন উপাদান প্রবেশ করে
mode="in-out":নতুন উপাদান প্রথমে প্রবেশ করে, তারপর পূর্ববর্তী উপাদানটি চলে যায়
কোন মোড নেই:উভয়ই একই সাথে ঘটে (ডিফল্ট)।
গতিশীল উপাদানের সাথে রূপান্তর
গতিশীল উপাদানগুলির মধ্যে পরিবর্তনগুলি অ্যানিমেট করতে<Transition>উপাদান ব্যবহার করা যেতে পারে:
<template>
<h1>Transition with Dynamic Components</h1>
<button @click="toggleValue = !toggleValue">Switch component</button>
<Transition mode="out-in">
<component :is="activeComp"></component>
</Transition>
</template>
<script>
export default {
data () {
return {
toggleValue: true
}
},
computed: {
activeComp() {
if(this.toggleValue) {
return 'comp-one'
}
else {
return 'comp-two'
}
}
}
}
</script>
অ্যানিমেশন সেরা অনুশীলন
<!-- Good: Hardware accelerated -->
.v-enter-active {
animation: slideIn 0.3s ease-out;
transform: translateX(0);
opacity: 1;
}
@keyframes slideIn {
from {
transform: translateX(-100px);
opacity: 0;
}
}
<!-- Avoid: Causes layout reflow -->
.v-enter-active {
animation: slideIn 0.3s;
left: 0;
}
@keyframes slideIn {
from {
left: -100px;
}
}
সাধারণ অ্যানিমেশন নিদর্শন
Slide In/Out
এলিমেন্ট এপাশ থেকে ওপাশে চলে
transform: translateX()
Fade In/Out
উপাদানগুলি ধীরে ধীরে প্রদর্শিত এবং অদৃশ্য হয়ে যায়
opacity: 0 → 1
Scale & Rotate
উপাদান স্কেল এবং ঘোরানো হয়
scale(), rotate()
Bounce
উপাদানগুলি ইলাস্টিক গতির সাথে নড়াচড়া করে
cubic-bezier()