انتقال في مثال واحد
يخبر الانتقال المتصفح: حين تتغير هذه الخاصية، حرّكها خلال هذه المدة بدل التبديل فورًا. ضعه على القاعدة العادية للعنصر، لا على :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 أو ms | 0s |
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، ويمكن أن تكون لها خطوات كثيرة، وتبدأ من تلقاء نفسها عند تحميل الصفحة، ويمكن أن تتكرر أو تدور بلا توقف.