Menu
flag Ar iconالعربيةdown icon

الانتقال transition في CSS: الخاصية والمدة والتسارع والتأخير

يحرّك الانتقال في CSS خاصية من قيمتها القديمة إلى الجديدة حين تتغير، مثلًا عند التمرير. تعلّم الاختصار transition، وكل دوال التوقيت جنبًا إلى جنب، وما يمكن تحريكه وما لا يمكن، وحل height: auto، وتقليل الحركة.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

انتقال في مثال واحد

يخبر الانتقال المتصفح: حين تتغير هذه الخاصية، حرّكها خلال هذه المدة بدل التبديل فورًا. ضعه على القاعدة العادية للعنصر، لا على :hover وحدها:

مرّر المؤشر فوق الزر الأول: يتلاشى لونه إلى الأخضر ويرتفع 4px خلال 0.4 ثانية، وإبعاد المؤشر يشغّل الانتقال نفسه بالعكس. أما الزر الثاني فعليه transition: none فيتبدل فورًا. ويحصل مستخدمو لوحة المفاتيح على التأثير نفسه عبر :focus-visible.

الاختصار transition

transition: background-color 0.3s ease-in-out 0.1s;
/*          property         duration timing    delay */
الخاصية المفصلةما تضبطهالافتراضي
transition-propertyالخصائص التي تتحرك (all، أو قائمة)all
transition-durationالمدة، بـ s أو ms0s
transition-timing-functionمنحنى السرعةease
transition-delayالانتظار قبل البدء (يمكن أن يكون سالبًا)0s

القيمة الافتراضية للمدة 0s، ولهذا لا يتحرك شيء حتى تضبطها. في الاختصار تكون قيمة الزمن الأولى دائمًا المدة والثانية التأخير. ولإعدادات مختلفة لكل خاصية افصل بينها بفواصل:

.card {
  transition: transform 0.2s ease-out, box-shadow 0.4s ease-out;
}

دوال التوقيت جنبًا إلى جنب

تقرر دالة التوقيت كيف تتغير السرعة أثناء الانتقال. اضغط Play فتقطع الأشرطة السبعة المسافة نفسها في المدة نفسها، 1.5 ثانية:

دالة التوقيتالإحساس
linearسرعة ثابتة، آلية
ease (الافتراضي)بداية سريعة، وتوقف لطيف
ease-inبداية بطيئة ونهاية سريعة: مناسبة لما يغادر
ease-outبداية سريعة ونهاية بطيئة: مناسبة لما يصل
ease-in-outبطيئة في الطرفين
cubic-bezier(x1, y1, x2, y2)منحناك الخاص؛ قيمة y فوق 1 تتجاوز الهدف ثم تستقر
steps(n)قفزات في n خطوات متساوية، بلا إطارات بينها

لتأثيرات التمرير والقوائم، تبدو ease-out بمدة بين 150ms و300ms سريعة الاستجابة.

ما الذي يمكن تحريكه

الخصائص التي لها قيم وسطى يمكن تحريكها: الألوان، والأطوال (width وpadding وmargin)، وopacity، وtransform، وbox-shadow، وborder-radius، وfilter، وbackground-color. أما الخصائص التي تقفز بين كلمات مفتاحية، مثل display أو font-family، فتتبدل فورًا.

height: auto هي التي يصطدم بها الناس أكثر: اللوحة التي تنفتح من height: 0 إلى height: auto لا تتحرك افتراضيًا، لأن المتصفح لا يحسب القيم بين 0 و«auto». حل موثوق هو غلاف grid يتغير صفه الوحيد من 0fr إلى 1fr:

تخبر aria-expanded مستخدمي قارئات الشاشة هل اللوحة مفتوحة، وهو ما لا تقوله الحركة وحدها.

تشغيل شيفرة حين ينتهي الانتقال

يُطلق الحدث transitionend حين ينتهي الانتقال، مرة لكل خاصية. استخدمه لفعل شيء بعد الحركة، مثل نقل التركيز أو إزالة عنصر:

احترم تقليل الحركة

يفعّل بعض الناس «تقليل الحركة» في إعدادات أنظمتهم لأن الحركة على الشاشة تصيبهم بالدوار أو تشتتهم. أبقِ تلاشي اللون والشفافية، واحذف الحركات الكبيرة، باستعلام وسائط:

@media (prefers-reduced-motion: reduce) {
  .btn { transition: background-color 0.2s ease; } /* no movement, only the color */
}

اجعل الانتقالات سلسة

transform وopacity أرخص الخصائص تحريكًا: يستطيع المتصفح تحريك العنصر وإبهاته من دون إعادة حساب التخطيط. أما تحريك width أو height أو top أو margin فيجعل المتصفح يعيد ترتيب الصفحة في كل إطار، وقد يتقطع ذلك على الهواتف البطيئة. لتحريك شيء، فضّل transform: translate() على left أو margin. تشرح صفحة transform الدوال.

أخطاء شائعة

  • transition في قاعدة :hover وحدها. يتحرك التأثير عند الدخول لكنه يرتد فجأة حين ينتهي التمرير. ضع transition على القاعدة الأساسية.
  • مدة بلا وحدة. transition: opacity 300 غير صالحة. اكتب 300ms أو 0.3s.
  • transition: all. تحرّك كل خاصية تتغير، بما فيها ما لم تقصد تحريكه، وقد تجعل تغييرات التخطيط بطيئة. اذكر الخصائص.
  • توقع أن يتلاشى display: none. تتبدل display فورًا. حرّك opacity بدلًا من ذلك (واضبط visibility: hidden حين ينتهي التلاشي).
  • الانتقال إلى height: auto. يقفز. استخدم طريقة grid-template-rows أعلاه.
  • مدد طويلة للتفاعلات الصغيرة. أي شيء يزيد على نحو 400ms في زر أو قائمة يبدو بطيئًا.

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

كيف تعمل الانتقالات في CSS؟

تصرّح على العنصر بالخصائص التي يجب تحريكها وبمدة ذلك، مثلًا transition: background-color 0.3s ease;. حين تتغير قيمة تلك الخاصية (عبر :hover أو فئة أو JavaScript)، يحرّك المتصفح القيمة القديمة إلى الجديدة بدل التبديل فورًا.

ما ترتيب القيم في الاختصار transition؟

transition: property duration timing-function delay;، مثلًا transition: opacity 0.3s ease-in 0.1s;. القاعدة الصارمة الوحيدة أن قيمة الزمن الأولى هي المدة والثانية هي التأخير. افصل بين عدة انتقالات بفواصل.

لماذا لا يعمل الانتقال في CSS عندي؟

أسباب شائعة: transition موجودة في قاعدة :hover وحدها (فيتحرك التأثير عند الدخول ويرتد فجأة)، أو الخاصية لا يمكن تحريكها (display، أو height إلى auto)، أو المدة بلا وحدة (0.3 بدل 0.3s)، أو القيمة تتغير في اللحظة نفسها التي يُضاف فيها العنصر إلى الصفحة.

هل يمكن تحريك height: auto؟

ليس بانتقال height عادي في كل المتصفحات: الاستيفاء إلى auto يحتاج إلى الخاصية الأحدث interpolate-size، وهي غير مدعومة في كل مكان بعد. الحلول الشائعة: تحريك grid-template-rows من 0fr إلى 1fr على غلاف grid، أو تحريك max-height إلى قيمة أكبر من المحتوى.

ما الفرق بين transition وanimation في CSS؟

يعمل الانتقال مرة واحدة، بين قيمتين، حين تتغير خاصية. أما الحركة animation فتستخدم @keyframes، ويمكن أن تكون لها خطوات كثيرة، وتبدأ من تلقاء نفسها عند تحميل الصفحة، ويمكن أن تتكرر أو تدور بلا توقف.

Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن