पेश है वेब एनिमेशन एपीआई

शुभ दिन, दोस्तों!

वेब एपीआई लगातार विकसित हो रहे हैं। उनमें से कुछ, जैसे कंसोल या कैनवस, सभी ब्राउज़रों द्वारा अच्छी तरह से समर्थित हैं, अन्य अभी भी विकास के अधीन हैं।

विकास के तहत एपीआई में से एक वेब एनिमेशन एपीआई या WAAPI है। इस तथ्य के बावजूद कि विनिर्देश का पहला संस्करण 2012 में प्रकाशित हुआ था, और एपीआई को पहली बार 2014 में फ़ायरफ़ॉक्स और क्रोम ब्राउज़र में लागू किया गया था, मुझे हाल ही में इसके बारे में पता चला (मैंने इसके बारे में पहले भी नहीं सुना है - लगभग।)।

यह डेवलपर्स को जावास्क्रिप्ट का उपयोग करके सीएसएस एनिमेशन के साथ काम करने की अनुमति देता है। इसका सिंटैक्स पारंपरिक सीएसएस एनिमेशन के सिंटैक्स के समान है, लेकिन इसमें कुछ विशेषताएं हैं जो डेवलपर्स के लिए एनिमेशन बनाने और संशोधित करना आसान बनाते हैं।

आइए इस एपीआई को एक साधारण उदाहरण से देखें।

नीचे हम एक घूर्णन वर्ग देखते हैं, जिसका रंग प्रत्येक मोड़ के साथ बदलता है।



सीएसएस इस तरह लग सकता है:

#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 निर्देश में समाहित जानकारी के समान कीफ़्रेम ऑब्जेक्ट के निर्माण के साथ शुरू होता है:

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

हम दो मुख्य अंतर देखते हैं:

  • हमें अन्य चरणों में बैकग्राउंड को जोड़ने की आवश्यकता है।
  • हमें प्रत्येक चरण को प्रतिशत के रूप में पूरा करने के लिए समय निर्धारित करने की आवश्यकता नहीं है।

WAAPI स्वचालित रूप से कुंजियों की संख्या से एनीमेशन को समान भागों में विभाजित करता है, इसलिए हमारे मामले में पृष्ठभूमि का रंग एनीमेशन के लगभग आधे भाग से बदल जाएगा।

हालाँकि, हम चाहते हैं कि यह 30% तक हो, इसलिए हम दूसरे चरण में ऑफसेट संपत्ति को 0.3 के मान के साथ जोड़ते हैं।

याद रखने के लिए एक महत्वपूर्ण बात है: एक कीफ़्रेम ऑब्जेक्ट में कम से कम दो कुंजी होनी चाहिए। अन्यथा, NotSupportedError को फेंक दिया जाएगा।

अगला, एक ऑब्जेक्ट एनीमेशन गुणों से युक्त होता है, जो दोहराव की अवधि और संख्या के लिए जिम्मेदार होता है:

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 विधि है जो आपको सभी बनाए गए एनिमेशन तक पहुंचने की अनुमति देती है।

मान लीजिए कि हम उस सभी एनिमेशन को धीमा करना चाहते हैं जो पेज पर है यदि उपयोगकर्ता ने प्रीफर्स-कम-मोशन को सक्षम किया है (सीएसएस मीडिया फ़ंक्शन प्रीफर-कम-मोशन का उपयोग यह निर्धारित करने के लिए किया जा सकता है कि क्या उपयोगकर्ता ने अनुरोध किया है कि ओएस एनीमेशन या आंदोलन की मात्रा को कम से कम करें जो इसका उपयोग करता है - लगभग।):

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
    }
)

पहले वर्ग का एनीमेशन समय 1 सेकंड, दूसरा - 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 का उपयोग करने के बीच बहुत अंतर नहीं देखा। लेकिन यह मेरे उदाहरण की सादगी के कारण हो सकता है।

JS में एनीमेशन बनाने के अन्य तरीकों पर WAAPI का एक महत्वपूर्ण लाभ यह है कि यह एक अलग थ्रेड में चलता है, जो मुख्य थ्रेड को एनीमेशन के बारे में "भूल" और बाकी कोड को करने की अनुमति देता है।

ब्राउज़र का समर्थन


WAAPI वर्तमान में मसौदा स्थिति में है और फ़ायरफ़ॉक्स और क्रोम के हाल के संस्करणों में और साथ ही प्रमुख मोबाइल ब्राउज़रों में आंशिक रूप से समर्थित है।

आंशिक समर्थन का मतलब है कि ब्राउज़र प्ले, पॉज़, रिवर्स, फिनिश और प्लेबैकरेट जैसे तरीकों का समर्थन करते हैं, लेकिन getAnimations का समर्थन नहीं करते हैं। सभी ब्राउज़रों में WAAPI के लिए



एक पॉलीफ़ाइल है।

मेरे लिए बस इतना ही!

इसके अलावा पढ़ना:

वेब एनिमेशन एपीआई
वेब एनिमेशन एपीआई उदाहरणों का उपयोग करना
महान श्रृंखला "वेब एनिमेशन एपीआई के बारे में बात करते हैं" डैन विल्सन द्वारा

आपका ध्यान देने के लिए धन्यवाद।

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


All Articles