مقدمة عن Web Animations API

يوم جيد يا اصدقاء!

تتطور واجهات برمجة تطبيقات الويب باستمرار. يتم دعم بعضها ، مثل وحدة التحكم أو Canvas ، بشكل جيد من قبل جميع المتصفحات ، والبعض الآخر لا يزال قيد التطوير.

واحدة من واجهات برمجة التطبيقات قيد التطوير هي Web Animations API أو WAAPI. على الرغم من حقيقة أن الإصدار الأول من المواصفات تم نشره في عام 2012 ، وتم تنفيذ واجهة برمجة التطبيقات نفسها لأول مرة في متصفحي Firefox و Chrome في عام 2014 ، اكتشفت ذلك مؤخرًا (لم أسمع به من قبل - تقريبًا لكل.).

يسمح للمطورين بالعمل مع الرسوم المتحركة CSS باستخدام JavaScript. يشبه بناء الجملة بناء الجملة للرسوم المتحركة التقليدية في CSS ، ولكنه يحتوي على بعض الميزات التي تسهل على المطورين إنشاء الرسوم المتحركة وتعديلها.

دعونا نلقي نظرة على واجهة برمجة التطبيقات هذه بمثال بسيط.

أدناه نرى مربعًا دوارًا ، يتغير لونه مع كل دور.



قد تبدو CSS كما يلي:

#cube {
    width: 40px;
    height: 40px;
    margin: 50%;
    background-color: pink;
    animation: rotateCube 1s infinite;
}

@keyframes rotateCube {
    0% {
        transform: rotate(0deg);
    }

    30% {
        background-color: purple;
    }

    100% {
        transform: rotate(180deg);
    }
}

الآن تفعل الشيء نفسه مع WAAPI.

إنشاء الرسوم المتحركة


يبدأ كل شيء بإنشاء كائن Keyframes يحتوي على معلومات مشابهة لتلك الواردة في توجيهkeyframes الخاص بـ CSS:

let cubeRotating = [
    {transform: 'rotate(0deg)', backgroundColor: 'pink'},
    {backgroundColor: 'purple', offset: 0.3},
    {transform: 'rotate(180deg)', backgroundColor: 'pink'}
]

نرى اختلافين رئيسيين:

  • نحتاج إلى إضافة backgroundColor إلى خطوات أخرى.
  • لا نحتاج إلى تحديد الوقت لإكمال كل خطوة كنسبة مئوية.

يقسم WAAPI الرسوم المتحركة تلقائيًا إلى أجزاء متساوية حسب عدد المفاتيح ، لذلك في حالتنا سيتغير لون الخلفية بنحو نصف الرسوم المتحركة.

ومع ذلك ، نريد أن يحدث هذا بنسبة 30٪ ، لذلك نضيف خاصية الإزاحة بقيمة 0.3 في الخطوة الثانية.

هناك شيء واحد مهم يجب تذكره: يجب أن يحتوي كائن Keyframes على مفتاحين على الأقل. خلاف ذلك ، سيتم طرح خطأ NotSupported.

بعد ذلك ، يتم إنشاء كائن يحتوي على خصائص الرسوم المتحركة المسؤولة عن مدة التكرار وعدده:

let cubeTiming = {
    duration: 1000,
    iterations: Infinity
}

يتم تعيين مدة الرسوم المتحركة بالمللي ثانية.

بدلاً من "لانهائي" نستخدم الكلمة الرئيسية "إنفينيتي".

أخيرًا ، لتشغيل الرسوم المتحركة ، نستخدم طريقة Element.animate:

document.getElementById('cube').animate(
    cubeRotating,
    cubeTiming
)

هناك العديد من خيارات بناء الجملة. يمكن العثور على أمثلة هنا .

لكن هذا ليس كل شيء. والحقيقة هي أنه مع WAAPI يمكننا التحكم في تشغيل الرسوم المتحركة!

التحكم في تشغيل الرسوم المتحركة


يؤدي استدعاء الأسلوب المتحرك إلى بدء الرسوم المتحركة على الفور ، ولكن هذا ليس ما نريده دائمًا. لذلك ، يمكننا استدعاء طرق الإيقاف المؤقت والتشغيل لإيقاف الرسوم المتحركة وبدء تشغيلها ، على التوالي:

let cubeAnimation = document.getElementById('cube').animate(
    cubeRotating,
    cubeTiming
)

cubeAnimation.pause()

document.body.onclick = () => cubeAnimation.play()

في مثالنا ، نعمل مع رسم متحرك واحد ، ولكن يمكنك إضافة العديد من "الرسوم المتحركة" إلى الصفحة وإدارتها كما تريد.

من بين طرق WAAPI المتاحة ، هناك أيضًا طرق الإنهاء والإلغاء والعكس.

يمكننا أيضًا التحكم في سرعة تشغيل الرسوم المتحركة:

let cubeAnimation = document.getElementById('cube').animate(
    cubeRotating,
    cubeTiming
)

document.body.onclick = () => cubeAnimation.playbackRate *= 1.5

هذا الرمز يجعل المربع يدور بشكل أسرع عند النقر فوقه.



حتى الآن ، تعلمنا كيفية إنشاء رسم متحرك واحد والتحكم في تشغيله. ميزة أخرى WAAPI هي الوصول إلى جميع الرسوم المتحركة في وقت واحد.

إدارة الرسوم المتحركة المتعددة


لدى WAAPI طريقة getAnimations التي تسمح لك بالوصول إلى جميع الرسوم المتحركة التي تم إنشاؤها.

لنفترض أننا نريد إبطاء جميع الرسوم المتحركة الموجودة على الصفحة إذا قام المستخدم بتمكين حركة مخفضة مفضلة (يمكن استخدام وظيفة وسائط CSS لتقليل الحركة لتقرير ما إذا كان المستخدم قد طلب أن يقوم نظام التشغيل بتقليل مقدار الرسوم المتحركة أو الحركة التي يستخدمها - تقريبا لكل.):

const mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)')

if(mediaQuery.matches){
    document.getAnimations().forEach(animation => {
        animation.playbackRate *= 0.5
    })
}

في المثال أعلاه ، نبحث عن وظيفة الوسائط التي تفضل الحركة المخفضة ، وإذا كانت قيمتها منخفضة ، نحصل على جميع الرسوم المتحركة على الصفحة ونخفض سرعة تشغيلها بمقدار النصف.

هذه إحدى الأشياء التي تجعل WAAPI مفيدة للغاية. يمكننا إجراء تغييرات على العديد من الرسوم المتحركة عن طريق تغيير خاصية واحدة.

التبعيات


ميزة أخرى مثيرة للاهتمام لـ WAAPI هي القدرة على تحديد اعتماد خصائص إحدى الرسوم المتحركة على خصائص أخرى.

على سبيل المثال ، إذا كان لدينا مربعان ، ونريد أن يدور الثاني مرتين أسرع من الأول ، يمكننا القيام بذلك بطريقتين.

الطريقة الأولى:

let cube1Animation = document.getElementById('cube').animate(
    cubeRotating,
    {
        duration: 1000,
        iterations: Infinity
    }
)

let cube2Animation = document.getElementById('cube2').animate(
    cubeRotating,
    {
        duration: 500,
        iterations: Infinity
    }
)

وقت الرسوم المتحركة للمربع الأول هو ثانية واحدة ، والثانية - 500 مللي ثانية.

ومع ذلك ، مع هذا النهج ، عندما نغير وقت الرسوم المتحركة للمربع الأول ، نحتاج إلى القيام بنفس الشيء للمربع الثاني.

تخيل مدى صعوبة الأمر إذا كان لديك العديد من الرسوم المتحركة أو عدد كبير من الكائنات المتحركة؟

أفضل طريقة لحل مشكلتنا هي إثبات اعتماد دوران المربع الثاني على الأول:

let cube1Animation = document.getElementById('cube').animate(
    cubeRotating,
    {
        duration: 1000,
        iterations: Infinity
    }
)

let cube2Animation = document.getElementById('cube2').animate(
    cubeRotating,
    {
        duration: cube1Animation.effect.timing.duration / 2,
        iterations: Infinity
    }
)

وبالتالي ، نستخدم وقت الرسوم المتحركة للمربع الأول لتحديد وقت الرسوم المتحركة للمربع الثاني. الآن ، عند تغيير وقت الرسوم المتحركة في المربع الأول ، سوف تدور الثانية دائمًا مرتين بسرعة!



أداء


بالحديث عن الأداء ، لم ألاحظ فرقًا كبيرًا بين استخدام CSS و WAAPI. ولكن قد يكون هذا بسبب بساطة المثال الذي قدمته.

تتمثل إحدى الميزات المهمة لـ WAAPI على الطرق الأخرى لإنشاء الرسوم المتحركة في JS في أنها تعمل في سلسلة رسائل منفصلة ، مما يسمح لمؤشر الترابط الرئيسي "بنسيان" الرسوم المتحركة والقيام ببقية الكود.

دعم المتصفح


WAAPI في حالة مسودة حاليًا وهو مدعوم جزئيًا في الإصدارات الأخيرة من Firefox و Chrome ، وكذلك في متصفحات الجوال الرئيسية.

الدعم الجزئي يعني أن المتصفحات تدعم طرقًا مثل التشغيل والإيقاف المؤقت والعكس والإنهاء والتشغيل ، ولكن لا تدعم getAnimations.



يوجد ملف متعدد لـ WAAPI في جميع المتصفحات.

هذا كل شيء بالنسبة لي!

مزيد من القراءة:

استخدام واجهة برمجة تطبيقات Web Animations API
Web Animations API
سلسلة رائعة "دعنا نتحدث عن Web Animations API" بقلم دان ويلسون

شكرًا لك على اهتمامك.

Source: https://habr.com/ru/post/undefined/


All Articles