Vue.js: الانتقالات والرسوم المتحركة

آخر تحديث: 2026-10-20

تجعل الانتقالات والرسوم المتحركة تطبيق Vue الخاص بك أكثر ديناميكية — حيث تحدث انتقالات سلسة عند دخول العناصر إلى منطقة العرض أو خروجها منها، وإعادة ترتيب أنيقة عند تغير القوائم. يتضمن Vue مكوني <Transition> و<TransitionGroup>، اللذين يعملان مع أسماء فئات CSS أو ربطات JavaScript لتحقيق تأثيرات رسوم متحركة متنوعة.

يُعد إتقان الرسوم المتحركة الانتقالية عاملاً أساسياً في تحسين تجربة المستخدم — فالرسوم المتحركة الجيدة تجعل التطبيق يبدو «سلساً وسريع الاستجابة ومحترفاً».

1. ما ستتعلمه


2. الإحراج الناجم عن زر «تبديل tag التبويب» الثابت

(1) المشكلة: اختفاء المكونات أو ظهورها فجأة؛ وميض واجهة المستخدم

كان لدى المسؤول عن حساب أليس أداة لتبديل علامات التبويب:

تجربة المستخدم:

(2) حل الانتقال في Vue: tag واحدة، 6 فئات

تجربة المستخدم:

(3) الإيرادات

بعد إضافة المؤثرات الانتقالية:


3. الانتقال: عنصر واحد

(1) الاستخدام الأساسي

(2) شرح مفصل لـ 6 فئات CSS

الفئة شرط التشغيل الغرض
v-enter-from قبل إدراج العنصر الstatus الأولية
v-enter-active العملية الكاملة لإدراج العناصر عملية الانتقال
v-enter-to بعد إدراج عنصر الstatus النهائية
v-leave-from قبل خروج العنصر الstatus الأولية
v-leave-active يخرج العنصر من العملية بأكملها عملية الانتقال
v-leave-to بعد مغادرة العنصر الstatus النهائية

(3) قواعد تسمية الملفات

VUE
<!-- v-bind:name="fade" → 6 classes are .fade-xxx -->
<Transition name="fade">...</Transition>

<!-- Don't write name → Default v-xxx (6 classes are .v-xxx) -->
<Transition>...</Transition>

<!-- News name -->
<Transition :name="transitionName">...</Transition>

(4) 3 أوضاع

VUE
<!-- 1. Default Mode:Entry and exit occur simultaneously(Overlap) -->
<Transition name="fade">
  <div v-if="show">Content</div>
</Transition>

<!-- 2. out-in:Leave first, then enter(Recommendations,Avoid Overlapping) -->
<Transition name="fade" mode="out-in">
  <div v-if="show">Content</div>
</Transition>

<!-- 3. in-out:Enter first, then leave(Rare) -->
<Transition name="fade" mode="in-out">
  <div v-if="show">Content</div>
</Transition>

▶ مثال: التبديل بين تبويبين بـ Transition وmode="out-in"

▶ جرّب الكود

الإخراج:

TEXT
العرض الأول: لوحة A وشفافيتها 1
النقر على B: تخرج لوحة A بتلاشي 0.3s أولًا، ثم تدخل لوحة B بتلاشي بفضل mode="out-in"

4. 5 أنواع من الرسوم المتحركة في CSS

(1) التدرج في الظهور والتلاشي (الأكثر شيوعًا)

CSS
.fade-enter-active, .fade-leave-active {
  transition: opacity 0.3s;
}
.fade-enter-from, .fade-leave-to {
  opacity: 0;
}

(2) الانزلاق

CSS
.slide-enter-active, .slide-leave-active {
  transition: transform 0.3s;
}
.slide-enter-from {
  transform: translateX(-100%);
}
.slide-leave-to {
  transform: translateX(100%);
}

(3) تكبير/تصغير

CSS
.scale-enter-active, .scale-leave-active {
  transition: transform 0.3s;
}
.scale-enter-from, .scale-leave-to {
  transform: scale(0);
}

(4) الدوران

CSS
.rotate-enter-active {
  transition: transform 1s;
}
.rotate-enter-from {
  transform: rotate(0deg);
}
.rotate-leave-active {
  animation: bounce 0.5s;
}
@keyframes bounce {
  0% { transform: scale(0); }
  50% { transform: scale(1.2); }
  100% { transform: scale(1); }
}

(5) الرسوم المتحركة المركبة

CSS
.combo-enter-active, .combo-leave-active {
  transition: all 0.3s;
}
.combo-enter-from {
  opacity: 0;
  transform: translateX(-50px) scale(0.8);
}
.combo-leave-to {
  opacity: 0;
  transform: translateX(50px) scale(0.8);
}

▶ مثال: 5 أنواع من الرسوم المتحركة في CSS

CSS
/* 1. Fade In, Fade Out */
.fade-enter-active, .fade-leave-active { transition: opacity 0.3s; }
.fade-enter-from, .fade-leave-to { opacity: 0; }

/* 2. Slide */
.slide-enter-active, .slide-leave-active { transition: transform 0.3s; }
.slide-enter-from { transform: translateX(-100%); }
.slide-leave-to { transform: translateX(100%); }

/* 3. Zoom */
.scale-enter-active, .scale-leave-active { transition: transform 0.3s; }
.scale-enter-from, .scale-leave-to { transform: scale(0); }

/* 4. Rotation */
.rotate-enter-active { transition: transform 1s; }
.rotate-enter-from { transform: rotate(0deg); }
.rotate-leave-active { animation: spin 0.5s; }

/* 5. Combination */
.combo-enter-active, .combo-leave-active { transition: all 0.3s; }
.combo-enter-from { opacity: 0; transform: translateX(-50px) scale(0.8); }
▶ جرّب الكود

الإخراج:

TEXT
مع Transition name="fade": يدخل العنصر بتلاشي 0.3s ويخرج بنفس المدة
slide يزيح العنصر أفقيًا، وscale يبدأ من 0، وcombo يجمع الشفافية والإزاحة والحجم

5. الرسوم المتحركة لقائمة TransitionGroup

(1) الاستخدام الأساسي

(2) نقطة أساسية: .list-move

CSS
/* When the position of a list item changes(As sorted),Apply Automatically .list-move */
.list-move {
  transition: transform 0.5s;
}

(3) 5 سيناريوهات رئيسية للرسوم المتحركة في القوائم

المشهد الرسوم المتحركة
إضافة عنصر ظهور تدريجي + انزلاق لأسفل
حذف العنصر التلاشي + التمرير إلى اليسار
الفرز الانتقال السلس إلى الموضع الجديد
التصفية تلاشي تدريجي للعناصر التي يتم إزالتها، وانتقال سلس للعناصر التي يتم الاحتفاظ بها
السحب تتبع حركة الماوس في الوقت الفعلي

6. خطافات جافا سكريبت

(1) 8 ربطات جافا سكريبت

VUE
<template>
  <Transition
    @before-enter="beforeEnter"
    @enter="enter"
    @after-enter="afterEnter"
    @before-leave="beforeLeave"
    @leave="leave"
    @after-leave="afterLeave"
    :css="false"  <!-- Disable CSS class -->
  >
    <p v-if="show">Hello</p>
  </Transition>
</template>

<script setup>
import gsap from 'gsap'

function beforeEnter(el) {
  console.log('Before enter:', el)
}

function enter(el, done) {
  gsap.to(el, {
    opacity: 1,
    y: 0,
    duration: 0.5,
    onComplete: done  // Notification Complete
  })
}

function afterEnter(el) {
  console.log('After enter:', el)
}

// leave / beforeLeave / afterLeave Similar
</script>

(2) تكامل GSAP (موصى به)

BASH
npm install gsap
VUE
<template>
  <Transition :css="false" @enter="onEnter" @leave="onLeave">
    <p v-if="show">Hello GSAP</p>
  </Transition>
</template>

<script setup>
import gsap from 'gsap'

function onEnter(el, done) {
  gsap.fromTo(el, 
    { opacity: 0, y: 50 },
    { opacity: 1, y: 0, duration: 0.5, onComplete: done }
  )
}

function onLeave(el, done) {
  gsap.to(el, { opacity: 0, y: -50, duration: 0.3, onComplete: done })
}
</script>

7. مكتبات الرسوم المتحركة التابعة لجهات خارجية

(1) دمج Animate.css

BASH
npm install animate.css
JS
// main.js
import 'animate.css'

(2) @vueuse/motion

BASH
npm install @vueuse/motion
JS
// main.js
import { MotionPlugin } from '@vueuse/motion'
app.use(MotionPlugin)

(3) حالات الاستخدام الموصى بها لـ GSAP

المكتبة التقييم مناسب لـ
الرسوم المتحركة في CSS ⭐⭐⭐⭐⭐ انتقالات بسيطة، وتلاشي
Animate.css ⭐⭐⭐⭐ مجموعة متنوعة من الحركات المتحركة المعدة مسبقًا
@vueuse/motion ⭐⭐⭐⭐ أسلوب تعريفي، يتكامل جيدًا مع Vue
GSAP ⭐⭐⭐⭐⭐ خطوط زمنية معقدة، رسوم متحركة قائمة على قوانين الفيزياء

8. تمرين شامل: رسوم قائمة TransitionGroup

▶ مثال: الرسوم المتحركة لقائمة TransitionGroup

VUE
<TransitionGroup name="list" tag="ul">
  <li v-for="item in items" :key="item.id">
    {{ item.name }}
  </li>
</TransitionGroup>

<style>
.list-enter-active, .list-leave-active {
  transition: all 0.5s;
}
.list-move { transition: transform 0.5s; }
</style>
▶ جرّب الكود

الإخراج:

TEXT
عند إضافة عنصر: يدخل بتلاشي 0.5s، وعند الحذف: يخرج بتلاشي
عند إعادة الترتيب: تنتقل العناصر بسلاسة لأن list-move يفعّل transform

(1) 📊 2. شرح مفصل لـ 6 فئات CSS

الفئة المشغل
.fade-enter-from قبل إدراج عنصر
.fade-enter-active عملية إدراج العناصر
.fade-enter-to بعد إدراج العنصر
.fade-leave-from قبل رحيل العنصر
.fade-leave-active عملية انطلاق العناصر
.fade-leave-to بعد رحيل العنصر

(2) 📊 4. 5 مكتبات رئيسية للرسوم المتحركة من جهات خارجية

المكتبة الأمر قابل للتطبيق
CSS لا شيء (مدمج) بسيط
Animate.css npm i animate.css الرسوم المتحركة المعدة مسبقًا
@vueuse/motion npm i @vueuse/motion أسلوب إعلاني
GSAP npm i gsap خط زمني معقد
Motion One npm i motion رسوم متحركة خفيفة الوزن على الويب

(3) 📊 5. مرجع سريع لـ 5 أخطاء شائعة

الخطأ الأعراض الحل
لا يتم تطبيق الانتقال يختفي العنصر على الفور إضافة غلاف <Transition> + v-if
v-for بدون رسوم متحركة لا توجد انتقالات بين عناصر القائمة باستخدام <TransitionGroup>
لا تظهر الرسوم المتحركة عند الفرز تقطع الحركة عند التحرك إضافة فئة .list-move
التبديل المتزامن بين مكونات متعددة التداخل إضافة key للتمييز + mode="out-in"
الرسوم المتحركة في CSS سريعة جدًّا/بطيئة جدًّا تجربة مستخدم سيئة اضبط مدة الانتقال على 0.2–0.5 ثانية

(4) 📊 6. 5 سيناريوهات عملية

المشهد الرسوم المتحركة
التبديل بين علامات التبويب تلاشي + من الخارج إلى الداخل
مربع حوار نمطي تكبير + تلاشي
إضافة/حذف من القائمة الرسوم المتحركة للقائمة
تبديل المسار تلاشي + انزلاق
إشعار منبثق ينزلق من الأعلى + إغلاق تلقائي

❓ أسئلة شائعة

س كيف أختار بين انتقالات CSS و@keyframes في CSS؟
ج استخدم انتقالات CSS للانتقالات البسيطة (الشفافية/التحويل). استخدم @keyframes أو GSAP للرسوم المتحركة المعقدة (متعددة الخطوات، القائمة على قوانين الفيزياء). يدعم Vue Transitions كلا الخيارين.
س هل يتطلب TransitionGroup استخدام محدد :key؟
ج نعم. <TransitionGroup> يجب تحديد العناصر الفرعية بشكل فريد باستخدام :key؛ وإلا فلن يتم تشغيل الرسوم المتحركة.
س كيف يمكنني تنفيذ حركة "انتقال الصفحة"؟
ج ضعها بين <router-view v-slot="{ Component }"> + <Transition>. في كل مرة يتغير فيها المسار، يتغير المكون، مما يؤدي إلى تشغيل الانتقال.
س ما الغرض من mode="out-in"?
ج يضمن أن ينهي المكون المغادر حركة الرسوم المتحركة الخاصة به قبل أن يبدأ المكون الداخِل. وهذا يمنع عرض كلا المكونين في نفس الوقت (التداخل).
س هل يمكن استخدام «الخطافات» في جافا سكريبت وفئات CSS معًا؟
ج نعم. <Transition :css="false" @enter="onEnter"> قم بتعطيل فئات CSS واستخدم «الخطافات» في جافا سكريبت فقط. أو قم بتمكين كليهما (استخدم فئات CSS للتنسيق و«الخطافات» في جافا سكريبت لعمليات الاستدعاء المرتدة).
س ماذا يمكنني أن أفعل إذا كانت الرسوم المتحركة بطيئة؟
ج (1) استخدم transform وopacity (مع تسريع بواسطة وحدة معالجة الرسومات)؛ (2) تجنب الخصائص التي تؤدي إلى إعادة تخطيط العناصر (العرض، الارتفاع، الموضع العلوي)؛ (3) قلل عدد العناصر التي يتم تحريكها في وقت واحد.
س كيف يمكنني استخدام Animate.css مع Vue؟
ج استخدم enter-active-class="animate__animated animate__fadeIn" لربط أسماء فئات Animate.css بخطافات Vue.

📖 ملخص


📝 تمارين

  1. أسئلة أساسية (مستوى الصعوبة: ⭐)

    تنفيذ نافذة منبثقة بسيطة تعمل بنظام الظهور التدريجي/الاختفاء التدريجي:

    • انقر على الزر لفتح النافذة المنبثقة
    • ظهور تدريجي خلال 0.3 ثانية
    • انقر لإغلاق (التلاشي التدريجي)
    • ظهور وتلاشي القناع الخلفي بشكل متزامن
  2. مسائل متقدمة (مستوى الصعوبة: ⭐⭐)

    تنفيذ حركة رسومية لقائمة TransitionGroup:

    • 5 مهام يجب إنجازها
    • ظهور العنصر الجديد تدريجيًا (0.5 ثانية)
    • إخفاء العناصر المحذوفة تدريجيًا (0.5 ثانية + position: absolute)
    • يتم نقل العناصر الأخرى بسلاسة عند الفرز (.list-move)
  3. مسألة التحدي (مستوى الصعوبة: ⭐⭐⭐)

    تنفيذ نظام «الرسوم المتحركة لانتقال الصفحات» بشكل كامل:

    1. تأثير تلاشي + انزلاق عند التبديل بين المسارات
    2. ثلاثة أنواع من الرسوم المتحركة لإضافة العناصر وحذفها وفرزها في قائمة
    3. تركيبة «التكبير + التلاشي» للنوافذ المنبثقة النموذجية
    4. الرسوم المتحركة المعقدة للخط الزمني مع تكامل GSAP
    5. اختبار مقارن لخمس مكتبات رسوم متحركة تابعة لجهات خارجية
    6. تحسين الأداء (تسريع وحدة معالجة الرسومات + قيد التغيير)
Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%