Variants للرسوم المتحركة المنسقة
عرّف كائنات variants مسماة ومرّرها عبر أشجار المكوّنات الأب والابن.
Variants للرسوم المتحركة المنسقة درس مجاني في React Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.
ما هي Variants؟
Variants هي حالات تحريك مسماة ومحددة على شكل كائنات. وبدلًا من استخدام قيم مضمّنة، تشير المكوّنات إلى أسماء Variants مثل 'hidden' و'visible'. ويمكن للمكوّنات الأب تنسيق المكوّنات الأبناء تلقائيًا.
تعريف Variants
أنشئ كائن variants يتضمن حالات مسماة. مرّره إلى خاصية variants في مكوّن motion.
const cardVariants = {
hidden: { opacity: 0, y: 30 },
visible: { opacity: 1, y: 0 },
};
<motion.div
variants={cardVariants}
initial="hidden"
animate="visible"
transition={{ duration: 0.4 }}
/>المكوّنات الأبناء المتتابعة
استخدم staggerChildren في انتقال الأب لتحريك المكوّنات الأبناء واحدًا تلو الآخر، مع تأخير بين كل مكوّن وآخر.
const containerVariants = {
hidden: {},
visible: {
transition: {
staggerChildren: 0.1,
delayChildren: 0.2,
},
},
};
const itemVariants = {
hidden: { opacity: 0, x: -20 },
visible: { opacity: 1, x: 0 },
};
<motion.ul variants={containerVariants} initial="hidden" animate="visible">
{items.map(item => (
<motion.li key={item.id} variants={itemVariants}>{item.name}</motion.li>
))}
</motion.ul>انتشار Variant
عندما تتغير حالة Variant لدى الأب، تتحرك تلقائيًا جميع المكوّنات الأبناء التي تشترك معه في اسم Variant نفسه — ولا حاجة إلى تمرير animate إلى كل مكوّن ابن.
// Children inherit animate="visible" from the parent automatically
const parent = { hidden: {}, visible: { transition: { staggerChildren: 0.05 } } };
const child = { hidden: { opacity: 0 }, visible: { opacity: 1 } };
<motion.div variants={parent} initial="hidden" animate="visible">
<motion.p variants={child}>First</motion.p>
<motion.p variants={child}>Second</motion.p>
<motion.p variants={child}>Third</motion.p>
</motion.div>التبديل بين الحالات
تحكّم في Variant النشط باستخدام متغير حالة. وينقل Framer Motion المكوّن بسلاسة بين الحالات المسماة.
const [isOpen, setIsOpen] = useState(false);
const panelVariants = {
closed: { height: 0, opacity: 0 },
open: { height: 'auto', opacity: 1 },
};
<motion.div
variants={panelVariants}
animate={isOpen ? 'open' : 'closed'}
initial="closed"
transition={{ duration: 0.3 }}
/>انتقال مخصّص لكل Variant
أضف مفتاح transition داخل Variant لتخصيص التوقيت لهذه الحالة المحددة فقط.
const menuVariants = {
closed: {
scaleY: 0,
transition: { duration: 0.2, ease: 'easeIn' },
},
open: {
scaleY: 1,
transition: { duration: 0.3, ease: 'easeOut', staggerChildren: 0.05 },
},
};Variants للخروج مع AnimatePresence
أضف مفتاح exit إلى كائن variants وغلّف المكوّن داخل AnimatePresence لتحريكه عند إزالة تركيبه.
const pageVariants = {
initial: { opacity: 0, x: '100%' },
enter: { opacity: 1, x: 0 },
exit: { opacity: 0, x: '-100%' },
};
<AnimatePresence mode="wait">
<motion.div
key={router.pathname}
variants={pageVariants}
initial="initial"
animate="enter"
exit="exit"
transition={{ duration: 0.3 }}
/>
</AnimatePresence>تجاوزات Variants المتداخلة
يمكن للمكوّنات الأبناء تجاوز حالة Variant الموروثة باستخدام خصائص initial أو animate الخاصة بها، والخروج من تنسيق الأب عند الحاجة.
استخدام useAnimation للتحكم الإجرائي في Variants
تعيد useAnimation() كائنًا للتحكم في التحريك. استدعِ controls.start('variantName') برمجيًا لتشغيل Variants.
const controls = useAnimation();
async function sequence() {
await controls.start('wiggle');
await controls.start('bounce');
}
<motion.div animate={controls} variants={{ wiggle: { rotate: 10 }, bounce: { y: -20 } }} />خيارات التنسيق
إضافةً إلى staggerChildren، يمكنك استخدام when ('beforeChildren' | 'afterChildren') لتسلسل تحريكات الأب والمكوّنات الأبناء.
const container = {
hidden: { opacity: 0 },
visible: {
opacity: 1,
transition: {
when: 'beforeChildren', // parent fades in before stagger starts
staggerChildren: 0.1,
},
},
};مكتبات Variants القابلة لإعادة الاستخدام
عرّف Variants في ملف مشترك واستوردها حيثما تحتاج إليها للحفاظ على اتساق إعدادات التحريك في التطبيق.
// lib/variants.ts
export const fadeIn = { hidden: { opacity: 0 }, visible: { opacity: 1 } };
export const slideUp = { hidden: { opacity: 0, y: 20 }, visible: { opacity: 1, y: 0 } };
// Usage:
<motion.div variants={slideUp} initial="hidden" animate="visible" />تحقّق سريع
ما خيار الانتقال في Framer Motion الذي يؤخر تحريكات المكوّنات الأبناء واحدًا تلو الآخر؟
مراجعة
Variants هي حالات مسماة ومحددة على شكل كائنات. عيّن staggerChildren في انتقال الأب لتتتابع التحريكات تلقائيًا عبر المكوّنات الأبناء. استخدم useAnimation() للتحكم الإجرائي، وAnimatePresence مع Variants الخروج لتحريكات إزالة التركيب.
الأسئلة الشائعة
هل درس «Variants للرسوم المتحركة المنسقة» مجاني؟
نعم — نص درس «Variants للرسوم المتحركة المنسقة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.
ماذا ستتعلم في «Variants للرسوم المتحركة المنسقة»؟
عرّف كائنات variants مسماة ومرّرها عبر أشجار المكوّنات الأب والابن. تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟
لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «Variants للرسوم المتحركة المنسقة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟
نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- مكوّنات Motion والرسوم المتحركة الأساسية
- Variants للرسوم المتحركة المنسقة
- رسوم الإيماءات: التحويم والنقر والسحب
- رسوم التخطيط المتحركة وAnimatePresence