Vue Animations

উপাদান যোগ করা বা সরানো হলে অ্যানিমেশন সম্পাদন করার জন্য একটি <ট্রানজিশন> উপাদান কনফিগার করা হয়

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-from
v-enter-active
v-enter-to
ছেড়ে দিন (উপাদানটি সরানো হয়েছে)
v-leave-from
v-leave-active
v-leave-to
v-enter-from
প্রাথমিক পর্যায়
v-enter-active
অ্যানিমেশন হচ্ছে
v-enter-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

নীচের বিকল্পগুলি থেকে সঠিক উত্তর চয়ন করুন:

enter, enter, enter
✓ ঠিক আছে! 'এন্টার' ক্লাস ব্যবহার করা হয় যখন একটি উপাদান DOM এ যোগ করা হয়। অর্ডার: 1. ভি-এন্টার-ফ্রম (শুরু অবস্থা), 2. ভি-এন্টার-সক্রিয় (অ্যানিমেশন ঘটে), 3. ভি-এন্টার-টু (শেষ অবস্থা)
show, show, show
✗ ভুল! 'শো' Vue ট্রানজিশনে ব্যবহৃত একটি শ্রেণীর নাম নয়
leave, leave, leave
✗ ভুল! 'লিভ' ক্লাস ব্যবহার করা হয় যখন একটি উপাদান DOM থেকে সরানো হয়, যোগ করার সময় নয়
start, during, end
✗ ভুল! Vue ট্রানজিশন ক্লাসের নাম দেওয়া হয়েছে 'এন্টার' এবং 'লিভ', 'শুরু' নয়, 'সময়', 'শেষ'

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>

অ্যানিমেশন সেরা অনুশীলন

CSS ট্রানজিশন ব্যবহার করুন:সাধারণ অ্যানিমেশনের জন্য CSS ট্রানজিশন ব্যবহার করুন, এগুলো খুবই কার্যকর
হার্ডওয়্যার ত্বরণ ব্যবহার করুন:
অ্যানিমেশন সময়কাল নোট করুন:এটিকে 100-300ms এর মধ্যে রাখুন, খুব দীর্ঘ অ্যানিমেশন ব্যবহারকারীকে ধৈর্য হারাবে৷
লেআউট পরিবর্তনের বৈশিষ্ট্যগুলি এড়িয়ে চলুন:উপরের, বাম, প্রস্থ, উচ্চতা ট্রিগার আকার পরিবর্তনের মত বৈশিষ্ট্য
ইজিং ফাংশন ব্যবহার করুন:ইজিং ফাংশন যেমন ইজ-ইন-আউট, কিউবিক-বেজিয়ার() প্রাকৃতিক গতি তৈরি করে
<!-- 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()