حرّك على المُركِّب باستخدام transform وopacity، ونظّم @keyframes، واحترم تفضيلات المستخدمين بشأن الحركة.
افتح هذا الدرس في Kodokonقبل اختيار ما ستحرّكه، تذكّر خط أنابيب التصيير: التخطيط (الهندسة)، الرسم (البكسلات)، التركيب (تجميع الطبقات على وحدة معالجة الرسوميات). تحريك width أو top يُطلق تخطيطًا في كل إطار، يتبعه غالبًا رسم: وهذه وصفة للتقطّع دون 60 إطارًا في الثانية. أما transform وopacity فيتولاهما المُركِّب مباشرةً، دون العودة عبر المرحلتين الأوليين. القاعدة المهنية: حرّك هاتين الخاصيتين فقط كلما أمكن، وحاكِ الباقي (translate بدلًا من top، وscale بدلًا من width).
.button {
transform: translateY(0);
transition:
transform 0.2s cubic-bezier(0.2, 0.8, 0.2, 1),
opacity 0.15s ease-out;
}
.button:hover {
transform: translateY(-2px);
}
.button:active {
transform: translateY(0) scale(0.97);
}عندما لا يعود الانتقال كافيًا (خطوات وسيطة، تكرار، بدء تلقائي)، انتقل إلى @keyframes. إعدادان يصنعان الفرق بين رسم متحرك نظيف وخلل بصري: animation-fill-mode يتحكم في الحالة قبل البدء (backwards يطبّق الإطار المفتاحي الأول أثناء التأخير) وبعد النهاية (forwards يجمّد الأخير)؛ وboth يجمع بين الاثنين. لاحظ أيضًا أن دالة التوقيت تُطبَّق بين كل زوج من الأطر المفتاحية، لا على المدة الكلية: يمكنك إعادة تعريفها داخل إطار مفتاحي.
@keyframes slide-in {
from {
transform: translateX(-100%);
opacity: 0;
}
70% {
transform: translateX(8px);
opacity: 1;
}
to {
transform: translateX(0);
}
}
.toast {
animation: slide-in 0.35s ease-out both;
}أداتان متكاملتان تستحقان المعرفة. will-change: transform يرقّي العنصر إلى طبقته الخاصة قبل الرسم المتحرك، متجنبًا رسترة متأخرة؛ لكن كل طبقة تكلّف ذاكرة وحدة معالجة الرسوميات، لذا طبّقه قبيل الرسم المتحرك مباشرةً وأزِله بعده، لا كأسلوب دائم على عشرات العناصر. أما steps(n) فيستبدل الاستكمال المتصل بقفزات منفصلة: ضروري للأشكال المتحركة، ومؤشرات على طريقة الآلة الكاتبة، والساعات.
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}transform: translateX(100px) على left: 100px لحركة مُحرَّكة؟transform مدعوم بشكل أفضل في المتصفحات القديمةtransform يتولاه المُركِّب دون إعادة حساب التخطيط في كل إطارleft يعمل فقط على العناصر المموضعة بشكل مطلق، بينما transform يعمل في كل مكانtransform يقبل قيمًا سالبة، بخلاف leftanimation-fill-mode: both؟will-change؟* لتسريع الصفحة بأكملهاtransform: translateZ(0)transition للتفاعلات الدقيقة