الرسوم المتحركة في CSS
درس الانتقالات علّمك من A إلى B عند محفّز. درس Transform حدّد أين يذهب الصندوق المرسوم. الرسوم المتحركة تكتب خطاً زمنياً: نبض نقطة حالة، دوران loader بلا توقف، دخول البطاقات واحدةً واحدة — بـ @keyframes للخطوات وanimation للتشغيل.
ما هي الرسوم المتحركة؟
للحركة جزآن: مجموعة keyframes مسماة (@keyframes) تسرد الأنماط عند النسب المئوية (أو from / to)، وقاعدة تشغّل ذلك الاسم بمدة، وتأخير اختياري، وعدد تكرار، واتجاه، ودالة توقيت، وfill-mode. المتصفح يُكمل القيم بين محطات الـ keyframe.
تطابق الاسم صارم: animation-name: pulse يعمل فقط إذا وُجد @keyframes pulse. غيّر أحد الاسمين دون الآخر — ولن يتحرّك شيء.
عناصر التحكم في لمحة
📊 أجزاء الرسوم المتحركة الأساسية
| الجزء | الدور |
|---|---|
@keyframes name { … } |
خط زمني لقيم الخصائص عند % / from / to |
animation-name |
أي مجموعة keyframes تُشغَّل |
animation-duration |
مدة دورة واحدة (s أو ms) |
animation-timing-function |
تنعيم داخل الدورة (ease، linear، …) |
animation-delay |
انتظار قبل الدورة الأولى |
animation-iteration-count |
عدد الدورات (number أو infinite) |
animation-direction |
normal، reverse، alternate، alternate-reverse |
animation-fill-mode |
أنماط قبل/بعد (none، forwards، backwards، both) |
animation shorthand |
name → duration → timing → delay → iteration → direction → fill-mode (ترتيب شائع) |
نادراً ما تحتاج كل longhand معاً. ابدأ بالاسم + المدة؛ أضف infinite للـ loaders، وalternate للارتداد، وforwards عندما يجب أن يبقى آخر keyframe.
أول خط زمني — نبض هادئ
opacity وtransform ودودان على طبقة الرسم. النبض الناعم تمرين كلاسيكي لأول @keyframes.
@keyframes pulse {
0%,
100% {
opacity: 1;
transform: scale(1);
}
50% {
opacity: 0.55;
transform: scale(0.92);
}
}
.status-dot {
display: inline-block;
width: 0.75rem;
height: 0.75rem;
border-radius: 50%;
background: #16a34a;
animation: pulse 1.4s ease-in-out infinite;
}
0% و100% متطابقان ليُغلق الحلقة بسلاسة. infinite يُبقي الدورة — مناسب لمؤشر حالة صغير؛ مزعج إن حرّكت hero كامل الصفحة.
دوران بلا نهاية — الـ loaders تحب linear
الدوران مع linear وinfinite يُقرأ كـ spinner متواصل. أرفق مساراً لـ prefers-reduced-motion يخفّي الدوران أو يجمّده.
@keyframes spin {
to {
transform: rotate(360deg);
}
}
.loader {
width: 2rem;
height: 2rem;
border: 3px solid #e5e7eb;
border-top-color: #2563eb;
border-radius: 50%;
animation: spin 0.8s linear infinite;
}
@media (prefers-reduced-motion: reduce) {
.loader {
animation: none;
border-top-color: #e5e7eb;
}
}
to اختصار لـ 100%. البدء من 0% الافتراضي (بدون transform) يكفي عندما يهمّك نهاية الدورة فقط.
التأخير والتدريج — نفس keyframes، بدايات مختلفة
مجموعة keyframes واحدة يمكن أن تُحرّك عناصر كثيرة. وزّع البدايات بـ animation-delay ليشعر القائمة بالتتابع دون كتابة ثلاث رسوم متحركة مختلفة.
@keyframes fade-up {
from {
opacity: 0;
transform: translateY(0.75rem);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.reveal-list li {
opacity: 0;
animation: fade-up 0.45s ease forwards;
}
.reveal-list li:nth-child(1) { animation-delay: 0s; }
.reveal-list li:nth-child(2) { animation-delay: 0.08s; }
.reveal-list li:nth-child(3) { animation-delay: 0.16s; }
forwards يُبقي أنماط آخر keyframe بعد انتهاء الدورة — بدونه قد تعود العناصر إلى opacity: 0 من القاعدة. هنا animation-fill-mode يعمل فعلياً.
fill-mode لدخول لمرة واحدة
حركات الدخول غالباً تُشغَّل مرة. fill-mode يقرّر ما إذا تُطبَّق الأنماط قبل التأخير وبعد الإطار الأخير.
@keyframes card-in {
from {
opacity: 0;
transform: translateY(1rem) scale(0.98);
}
to {
opacity: 1;
transform: translateY(0) scale(1);
}
}
.card-enter {
animation: card-in 0.5s ease 0.1s both;
}
الاختصار هنا: الاسم card-in، المدة 0.5s، التنعيم ease، التأخير 0.1s، fill-mode both. both يطبّق أول keyframe أثناء التأخير ويُثبت الأخير بعدها.
الاتجاه وحالة التشغيل ومتى لا تُحرّك
animation-direction: alternate يُشغّل الدورات الفردية للأمام والزوجية للخلف — مفيد لارتداد لطيف دون تكرار keyframes. animation-play-state: paused يجمّد رسوماً قيد التشغيل (مثلاً إيقاف مؤقت عند hover للحلقات الزخرفية).
لتغيير لون hover بسيط، ابقَ على transitions. استخدم الرسوم المتحركة عندما تحتاج حلقات، أو قصة متعددة الخطوات، أو حركة غير مربوطة بتبديل حالة واحد. فضّل transform وopacity داخل keyframes؛ تحريك width أو height أو top أثقل وغالباً يهزّ التخطيط.
جرّب بنفسك
- ابنِ نبضاً بثلاث محطات (
0%/50%/100%) علىopacityفقط؛ ثم أضفscaleصغيراً. - اصنع spinner بـ
spin+linear+infinite؛ بدّل إلىeaseولاحظ عدم التساوي. - وزّع ثلاث badges بنفس keyframes
fade-upوتأخيرات0s،0.1s،0.2s— قارن مع وبدونforwards. - استخدم الاختصار
animation: card-in 0.5s ease 0.15s bothعلى لوحة؛ أزلbothوراقب العودة المفاجئة. - تحت
prefers-reduced-motion: reduce، ضعanimation: none(أو fade قصير واحد) على الحلقات الزخرفية.
أخطاء شائعة
- توقّع أن fade hover من A إلى B «يتكرر» — هذا مجال الرسوم المتحركة، لا transition وحيد
- خطأ مطابقة بين
animation-nameواسم@keyframes— صمت تام infiniteعلى مناطق كبيرة جاذبة للانتباه دون خطة إيقاف أو reduced-motion- تحريك خصائص التخطيط (
width،margin،top) بينما يكفي transform/opacity - نسيان
forwards/bothعلى reveals لمرة واحدة تبدأ منopacity: 0في القاعدة
ملخص
@keyframesتحدّد الخط الزمني؛animation(أو longhands) تشغّله- استخدم التكرار والاتجاه والتأخير وfill-mode للحلقات والارتداد والتدريج والنهايات الثابتة
- فضّل transform/opacity؛ احترم prefers-reduced-motion للحركة الزخرفية
- transitions للتغييرات البسيطة؛ الرسوم المتحركة للخطوات المتعددة والتكرار
- التالي في Effects & Motion: CSS Filters
🧠 اختبر معرفتك
اختبر معرفتك
تحدى نفسك مع هذا الاختبار التفاعلي واكتشف مدى فهمك للموضوع
📝 التعليمات
- اقرأ كل سؤال بعناية
- اختر أفضل إجابة لكل سؤال
- يمكنك إعادة الاختبار عدة مرات كما تريد
- سيتم عرض تقدمك في الأعلى