0Pricing
React Academy · درس

مكوّنات Motion والرسوم المتحركة الأساسية

استبدل div بـ motion.div واستخدم خصائص animate وinitial وexit للرسوم المتحركة البسيطة.

مكوّنات Motion والرسوم المتحركة الأساسية درس مجاني في React Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.

ما هي Framer Motion؟

Framer Motion هي مكتبة تحريك لـ React. استبدل عناصر HTML بنظائرها motion.* لإضافة تحريكات تصريحية عبر الخصائص بدلًا من إطارات CSS الرئيسية.

التثبيت

ثبّت Framer Motion واستورد motion منها.

npm install framer-motion

import { motion } from 'framer-motion';

أول تحريك لك

استبدل <div> بـ <motion.div> وأضف خصائص initial وanimate وtransition.

<motion.div
  initial={{ opacity: 0, y: -20 }}
  animate={{ opacity: 1, y: 0 }}
  transition={{ duration: 0.4 }}
>
  Hello, Framer Motion!
</motion.div>

الخاصية initial

تحدّد initial حالة بدء التحريك — أي الموضع الذي يبدأ منه العنصر قبل تحريكه إلى حالة animate.

// Fade in from left
<motion.div
  initial={{ opacity: 0, x: -50 }}
  animate={{ opacity: 1, x: 0 }}
/>

// Scale up from center
<motion.button
  initial={{ scale: 0 }}
  animate={{ scale: 1 }}
/>

الخاصية animate

تحدّد animate الحالة المستهدفة. ويُجري Framer Motion استيفاءً بين initial وanimate باستخدام فيزياء النوابض أو دالة تسهيل محددة.

<motion.h1
  initial={{ opacity: 0 }}
  animate={{ opacity: 1, color: '#4f46e5' }}
  transition={{ duration: 0.6, ease: 'easeOut' }}
>
  Welcome
</motion.h1>

خيارات الانتقال

تتحكم خاصية transition في كيفية تنفيذ التحريك: duration وease وdelay وtype ('spring' | 'tween' | 'inertia').

transition={{
  type: 'spring',
  stiffness: 300,
  damping: 20,
  delay: 0.2,
}}

الإطارات الرئيسية في animate

مرّر مصفوفة إلى أي قيمة متحركة لإنشاء تحريكات بإطارات رئيسية تمر عبر حالات متعددة.

<motion.div
  animate={{ x: [0, 30, 0] }}
  transition={{ duration: 1, repeat: Infinity, ease: 'easeInOut' }}
/>

حالتا التحويم والنقر

تحدّد whileHover وwhileTap حالات متحركة لتفاعلات التحويم والضغط، وتعودان تلقائيًا إلى الحالة السابقة عند انتهاء الإيماءة.

<motion.button
  whileHover={{ scale: 1.05, backgroundColor: '#4f46e5' }}
  whileTap={{ scale: 0.95 }}
  style={{ backgroundColor: '#6366f1' }}
>
  Press me
</motion.button>

التحريك عند التمرير باستخدام inView

استخدم الخاصية whileInView لبدء التحريك عندما يدخل العنصر إطار العرض أثناء التمرير.

<motion.section
  initial={{ opacity: 0, y: 40 }}
  whileInView={{ opacity: 1, y: 0 }}
  viewport={{ once: true, amount: 0.3 }}
  transition={{ duration: 0.5 }}
>
  <h2>Revealed on scroll</h2>
</motion.section>

الخاصية exit مع AnimatePresence

تحدّد exit التحريك الذي يحدث عند إزالة تركيب مكوّن. ولا تعمل إلا عند تغليفه داخل <AnimatePresence>.

import { motion, AnimatePresence } from 'framer-motion';

<AnimatePresence>
  {isVisible && (
    <motion.div
      key="modal"
      initial={{ opacity: 0 }}
      animate={{ opacity: 1 }}
      exit={{ opacity: 0, scale: 0.95 }}
    />
  )}
</AnimatePresence>

استخدام useAnimate للتحكم الإجرائي

تعيد useAnimate() مرجع scope ودالة animate للتحكم البرمجي في التحريك خارج نظام الخصائص التصريحي.

import { useAnimate } from 'framer-motion';

function ShakeButton() {
  const [scope, animate] = useAnimate();
  const handleClick = async () => {
    await animate(scope.current, { x: [-10, 10, -10, 0] }, { duration: 0.3 });
  };
  return <motion.button ref={scope} onClick={handleClick}>Shake</motion.button>;
}

تقليل الحركة

احترم تفضيل المستخدم لتقليل الحركة باستخدام الخطاف useReducedMotion().

import { useReducedMotion } from 'framer-motion';

function AnimatedCard() {
  const shouldReduce = useReducedMotion();
  return (
    <motion.div
      animate={{ opacity: 1, y: shouldReduce ? 0 : -20 }}
    />
  );
}

تحقّق سريع

ما خاصية Framer Motion التي تحدّد حالة التحريك التي ينبغي أن يصل إليها المكوّن، أي الحالة المستهدفة؟

مراجعة

استبدل عناصر HTML بنظائر motion.*. استخدم initial لحالة البدء، وanimate للحالة المستهدفة، وtransition للتوقيت، وwhileHover/whileTap للإيماءات، وwhileInView للتحريكات التي يبدأها التمرير.

الأسئلة الشائعة

هل درس «مكوّنات Motion والرسوم المتحركة الأساسية» مجاني؟

نعم — نص درس «مكوّنات Motion والرسوم المتحركة الأساسية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.

ماذا ستتعلم في «مكوّنات Motion والرسوم المتحركة الأساسية»؟

استبدل div بـ motion.div واستخدم خصائص animate وinitial وexit للرسوم المتحركة البسيطة. تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟

لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «مكوّنات Motion والرسوم المتحركة الأساسية»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟

نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مكوّنات Motion والرسوم المتحركة الأساسية
  2. Variants للرسوم المتحركة المنسقة
  3. رسوم الإيماءات: التحويم والنقر والسحب
  4. رسوم التخطيط المتحركة وAnimatePresence
← العودة إلى React Academy