رسوم التخطيط المتحركة وAnimatePresence
حرّك تغييرات التخطيط تلقائيًا باستخدام خاصية layout وتحكم في التركيب والإزالة باستخدام AnimatePresence.
رسوم التخطيط المتحركة وAnimatePresence درس مجاني في React Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.
تحريكات التخطيط
أضف الخاصية layout إلى مكوّن motion، وسيحرّك Framer Motion تلقائيًا أي تغييرات في التخطيط، مثل الحجم والموضع، الناتجة عن تغييرات الحالة أو تغييرات DOM — دون الحاجة إلى تحديد المواضع يدويًا.
<motion.div layout style={{ width: isExpanded ? 300 : 150 }}>
{/* Width animates smoothly when isExpanded changes */}
</motion.div>قيم خاصية layout
تقبل خاصية layout القيمة true لكل التخطيط، أو 'position' للموضع فقط، أو 'size' للحجم فقط، وذلك لتحديد ما سيُحرّك.
<motion.div layout="position"> {/* only x/y positions animate */}
<motion.div layout="size"> {/* only width/height animate */}استخدام layoutId لانتقالات العناصر المشتركة
امنح عنصرين القيمة نفسها في layoutId، وسيحرّك Framer Motion الانتقال بينهما كما لو كانا عنصرًا واحدًا، حتى إن كانا في مكوّنين مختلفين.
// Thumbnail in list:
<motion.img layoutId={`photo-${id}`} src={src} className="thumbnail" />
// Full-screen view:
<motion.img layoutId={`photo-${id}`} src={src} className="fullscreen" />
// Framer Motion morphs one into the other automaticallyAnimatePresence
تمكّن AnimatePresence تحريكات exit. وبدونها، تختفي المكوّنات عند إزالة تركيبها فورًا. غلّف العرض الشرطي بها لتحريك عمليات إزالة التركيب.
import { AnimatePresence, motion } from 'framer-motion';
<AnimatePresence>
{isVisible && (
<motion.div
key="notification"
initial={{ opacity: 0, y: -20 }}
animate={{ opacity: 1, y: 0 }}
exit={{ opacity: 0, y: -20 }}
/>
)}
</AnimatePresence>الخاصية key مطلوبة
تحتاج AnimatePresence إلى امتلاك كل مكوّن ابن لقيمة مستقرة في key. وبدون مفتاح فريد، لا يستطيع React اكتشاف ما إذا كانت العناصر قد أزيل تركيبها أم جرى تحديثها.
// Animating between pages:
<AnimatePresence mode="wait">
<motion.div key={pathname} ... />
</AnimatePresence>وضع AnimatePresence
تتحكم mode في كيفية تداخل العناصر الخارجة والداخلة. تؤخر 'wait' تحريك الدخول حتى يكتمل الخروج، بينما تشغّل 'sync'، وهي القيمة الافتراضية، التحريكين في الوقت نفسه.
// Page transitions — wait for old page to exit:
<AnimatePresence mode="wait">
<motion.main key={pathname} ... />
</AnimatePresence>
// Toast stack — new toasts appear while old ones exit:
<AnimatePresence mode="sync">
{toasts.map(t => <motion.div key={t.id} ... />)}
</AnimatePresence>تحريك القوائم باستخدام Layout
ادمج بين layout وAnimatePresence لتحريك إعادة ترتيب عناصر القائمة وإزالتها.
<motion.ul>
<AnimatePresence>
{items.map(item => (
<motion.li
key={item.id}
layout
initial={{ opacity: 0, height: 0 }}
animate={{ opacity: 1, height: 'auto' }}
exit={{ opacity: 0, height: 0 }}
>
{item.name}
</motion.li>
))}
</AnimatePresence>
</motion.ul>LayoutGroup
ينسّق LayoutGroup تحريكات التخطيط عبر مكوّنات motion مستقلة متعددة، بحيث تتحرك معًا كمجموعة واحدة.
import { LayoutGroup } from 'framer-motion';
<LayoutGroup>
<Sidebar />
<MainContent />
{/* Both animate layout changes together */}
</LayoutGroup>تصحيح تشوّه التخطيط
قد تؤدي تحريكات التخطيط إلى تشويه الحدود والظلال وborder-radius. استخدم خاصية layoutDependency أو تصحيح مقياس CSS لإصلاح العيوب المرئية.
<motion.div
layout
style={{ borderRadius: 12 }}
// Framer Motion auto-corrects border-radius during scale changes
/>نمط الانتقال على محور مشترك
في خطوات المعالج أو علامات التبويب، حرّك موضع X استنادًا إلى الاتجاه لإنشاء علاقة مكانية واضحة بين الشاشات.
const variants = {
enter: (dir: number) => ({ x: dir > 0 ? '100%' : '-100%', opacity: 0 }),
center: { x: 0, opacity: 1 },
exit: (dir: number) => ({ x: dir < 0 ? '100%' : '-100%', opacity: 0 }),
};
<AnimatePresence custom={direction} mode="wait">
<motion.div
key={step}
custom={direction}
variants={variants}
initial="enter"
animate="center"
exit="exit"
/>
</AnimatePresence>تحقق سريع
ما وضع AnimatePresence الذي يؤخّر حركة الدخول حتى تكتمل حركة الخروج؟
مراجعة
تُحرّك layout تغيّرات الحجم/الموضع تلقائيًا. وتحوّل layoutId عنصرًا إلى عنصر آخر عبر شجرة العناصر. وتتيح AnimatePresence حركات الخروج — احرص دائمًا على منح العناصر الفرعية خصائص key مستقرة، واختر mode='wait' عند الانتقال بين الصفحات.
الأسئلة الشائعة
هل درس «رسوم التخطيط المتحركة وAnimatePresence» مجاني؟
نعم — نص درس «رسوم التخطيط المتحركة وAnimatePresence» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.
ماذا ستتعلم في «رسوم التخطيط المتحركة وAnimatePresence»؟
حرّك تغييرات التخطيط تلقائيًا باستخدام خاصية layout وتحكم في التركيب والإزالة باستخدام AnimatePresence. تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟
لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «رسوم التخطيط المتحركة وAnimatePresence»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟
نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- مكوّنات Motion والرسوم المتحركة الأساسية
- Variants للرسوم المتحركة المنسقة
- رسوم الإيماءات: التحويم والنقر والسحب
- رسوم التخطيط المتحركة وAnimatePresence