बेहतर परफ़ॉर्मेंस वाले सीएसएस ऐनिमेशन बनाने का तरीका

इस गाइड में, अच्छी परफ़ॉर्मेंस वाले सीएसएस ऐनिमेशन बनाने का तरीका बताया गया है.

इन सुझावों से जुड़ी सिद्धांत जानने के लिए, कुछ ऐनिमेशन धीमे क्यों होते हैं? देखें.

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

इस गाइड में जिन सीएसएस प्रॉपर्टी का सुझाव दिया गया है वे क्रॉस-ब्राउज़र के साथ अच्छी तरह से काम करती हैं.

transform

ब्राउज़र के इस्तेमाल से जुड़ी सहायता

  • Chrome: 36.
  • Edge: 12.
  • Firefox: 16.
  • Safari: 9.

सोर्स

opacity

ब्राउज़र के इस्तेमाल से जुड़ी सहायता

  • Chrome: 1.
  • Edge: 12.
  • Firefox: 1.
  • Safari: 2.

सोर्स

will-change

ब्राउज़र के इस्तेमाल से जुड़ी सहायता

  • Chrome: 36.
  • Edge: 79.
  • Firefox: 36.
  • Safari: 9.1.

सोर्स

किसी एलिमेंट को एक जगह से दूसरी जगह ले जाना

किसी एलिमेंट को एक से दूसरी जगह ले जाने के लिए, transform प्रॉपर्टी की translate या rotation कीवर्ड वैल्यू का इस्तेमाल करें.

उदाहरण के लिए, किसी आइटम को स्लाइड करके व्यू में लाने के लिए, translate का इस्तेमाल करें.

.animate {
  animation: slide-in 0.7s both;
}

@keyframes slide-in {
  0% {
    transform: translateY(-1000px);
  }
  100% {
    transform: translateY(0);
  }
}

एलिमेंट को घुमाने के लिए rotate का इस्तेमाल करें. इस उदाहरण में, किसी एलिमेंट को 360 डिग्री घुमाया गया है.

.animate {
  animation: rotate 0.7s ease-in-out both;
}

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

किसी एलिमेंट का साइज़ बदलना

किसी एलिमेंट का साइज़ बदलने के लिए, transform प्रॉपर्टी की scale कीवर्ड वैल्यू का इस्तेमाल करें.

.animate {
  animation: scale 1.5s both;
}

@keyframes scale {
  50% {
    transform: scale(0.5);
  }
  100% {
    transform: scale(1);
  }
}

किसी एलिमेंट के दिखने की सेटिंग बदलना

किसी एलिमेंट को दिखाने या छिपाने के लिए, opacity का इस्तेमाल करें.

.animate {
  animation: opacity 2.5s both;
}

@keyframes opacity {
  0% {
    opacity: 1;
  }
  50% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}

लेआउट या पेंट को ट्रिगर करने वाली प्रॉपर्टी का इस्तेमाल न करें

ऐनिमेशन के लिए transform और opacity के अलावा किसी भी सीएसएस प्रॉपर्टी का इस्तेमाल करने से पहले, रेंडरिंग पाइपलाइन पर प्रॉपर्टी के असर का पता लगाएं. जब तक ज़रूरी न हो, तब तक लेआउट या पेंट को ट्रिगर करने वाली किसी भी प्रॉपर्टी का इस्तेमाल न करें.

लेयर बनाने के लिए फ़ोर्स करना

कुछ ऐनिमेशन धीमे क्यों होते हैं? में बताया गया है कि किसी नई लेयर पर एलिमेंट डालने से, ब्राउज़र बाकी लेआउट को फिर से पेंट किए बिना ही उन्हें फिर से पेंट कर सकता है.

आम तौर पर, ब्राउज़र इस बारे में अच्छे फ़ैसले ले सकते हैं कि किन आइटम को नई लेयर पर रखना है. हालांकि, will-change प्रॉपर्टी का इस्तेमाल करके मैन्युअल तरीके से लेयर बनाई जा सकती है. जैसा कि नाम से पता चलता है, यह प्रॉपर्टी ब्राउज़र को बताती है कि इस एलिमेंट को किसी तरह से बदला जाएगा.

सीएसएस में, किसी भी सिलेक्टर पर will-change लागू किया जा सकता है:

body > .sidebar {
  will-change: transform;
}

हालांकि, स्पेसिफ़िकेशन के मुताबिक, आपको ऐसा सिर्फ़ उन एलिमेंट के लिए करना चाहिए जो हमेशा बदलते रहते हैं. उदाहरण के लिए, ऐसा किसी ऐसे साइडबार के लिए हो सकता है जिसे उपयोगकर्ता स्लाइड इन और स्लाइड आउट कर सकता है. जिन एलिमेंट में अक्सर बदलाव नहीं होता है उनके लिए, हमारा सुझाव है कि जब भी बदलाव होने की संभावना हो, तब JavaScript का इस्तेमाल करके will-change लागू करें. पक्का करें कि ब्राउज़र को ज़रूरी ऑप्टिमाइज़ेशन करने के लिए ज़रूरत के मुताबिक समय दिया जाए. साथ ही, बदलाव रुकने के बाद प्रॉपर्टी को हटा दें.

अगर आपको किसी ऐसे ब्राउज़र में लेयर बनाने के लिए मजबूर होना है जो will-change (ज्यादातर मामलों में Internet Explorer) के साथ काम नहीं करता, तो transform: translateZ(0) सेट किया जा सकता है.

धीमे या खराब ऐनिमेशन डीबग करना

Chrome DevTools और Firefox DevTools में ऐसे कई टूल हैं जिनकी मदद से आप पता लगा सकते हैं कि आपके ऐनिमेशन धीमे या खराब क्यों हैं.

यह देखना कि कोई ऐनिमेशन लेआउट को ट्रिगर करता है या नहीं

किसी एलिमेंट को transform के बजाय किसी और चीज़ का इस्तेमाल करके मूव करने वाला ऐनिमेशन, धीमा हो सकता है. इस उदाहरण में, transform का इस्तेमाल करने वाले ऐनिमेशन की तुलना, top और left का इस्तेमाल करने वाले ऐनिमेशन से की गई है.

यह न करें
.box {
  position: absolute;
  top: 10px;
  left: 10px;
  animation: move 3s ease infinite;
}

@keyframes move {
  50% {
     top: calc(90vh - 160px);
     left: calc(90vw - 200px);
  }
}
यह करें
.box {
  position: absolute;
  top: 10px;
  left: 10px;
  animation: move 3s ease infinite;
}

@keyframes move {
  50% {
     transform: translate(calc(90vw - 200px), calc(90vh - 160px));
  }
}

इसकी जांच करने के लिए, यहां दिए गए Glitch के दो उदाहरण देखें. साथ ही, DevTools का इस्तेमाल करके परफ़ॉर्मेंस के बारे में जानें.

Chrome DevTools

  1. परफ़ॉर्मेंस पैनल खोलें.
  2. ऐनिमेशन चलने के दौरान, रनटाइम की परफ़ॉर्मेंस रिकॉर्ड करें.
  3. खास जानकारी टैब देखें.

अगर आपको खास जानकारी टैब में रेंडरिंग के लिए कोई शून्य मान दिखाई देता है, तो इसका मतलब यह हो सकता है कि आपका ऐनिमेशन ब्राउज़र के लेआउट के साथ काम कर रहा है.

समरी पैनल में रेंडरिंग के लिए 37 मि॰से॰ और पेंटिंग के लिए 79 मि॰से॰ दिखते हैं.
animation-with-top-left उदाहरण के लिए, रेंडरिंग की प्रोसेस शुरू होती है.
खास जानकारी वाले पैनल में, रेंडरिंग और पेंटिंग के लिए शून्य वैल्यू दिखती हैं.
ऐनिमेशन-विद-ट्रांसफ़ॉर्म उदाहरण में, रेंडरिंग की प्रोसेस नहीं होती.

Firefox DevTools

Firefox DevTools में, वॉटरफ़ॉल से यह समझने में मदद मिलती है कि ब्राउज़र किस काम में समय बर्बाद कर रहा है.

  1. परफ़ॉर्मेंस पैनल खोलें.
  2. ऐनिमेशन चलने के दौरान, परफ़ॉर्मेंस रिकॉर्ड करना शुरू करें.
  3. रिकॉर्डिंग बंद करें और वॉटरफ़ॉल टैब की जांच करें.

अगर आपको स्टाइल फिर से कैलकुलेट करें के लिए एंट्री दिखती हैं, तो इसका मतलब है कि ऐनिमेशन को रेंडर करने के लिए, ब्राउज़र को रेंडरिंग वॉटरफ़ॉल की शुरुआत पर वापस जाना होगा.

ड्रॉप किए गए फ़्रेम की जांच करना

  1. Chrome DevTools में रेंडरिंग टैब खोलें.
  2. FPS मीटर चेकबॉक्स को चालू करें.
  3. एनिमेशन चलने के दौरान वैल्यू देखें.

FPS मीटर यूज़र इंटरफ़ेस (यूआई) में सबसे ऊपर मौजूद फ़्रेम लेबल पर ध्यान दें. इससे 50% 1 (938 m) dropped of 1878 जैसी वैल्यू दिखती हैं. बेहतरीन परफ़ॉर्मेंस वाले ऐनिमेशन का प्रतिशत बहुत ज़्यादा होता है, जैसे कि 99%. इसका मतलब है कि कुछ फ़्रेम छूट गए हैं और ऐनिमेशन अच्छा दिख रहा है.

फ़्रेम प्रति सेकंड (FPS) मीटर से पता चलता है कि 50% फ़्रेम नहीं दिखाए गए
animation-with-top-left उदाहरण में, 50% फ़्रेम हटा दिए जाते हैं
फ़्रेम प्रति सेकंड (FPS) मीटर से पता चलता है कि सिर्फ़ 1% फ़्रेम ड्रॉप हुए
animation-with-transform उदाहरण में, सिर्फ़ 1% फ़्रेम हटा दिए जाते हैं.

यह देखना कि कोई ऐनिमेशन, पेंट को ट्रिगर करता है या नहीं

कुछ प्रॉपर्टी को ब्राउज़र पर दिखाने में, अन्य प्रॉपर्टी की तुलना में ज़्यादा समय लगता है. उदाहरण के लिए, किसी धुंधले हिस्से (जैसे, परछाई) को हटाने में, लाल बॉक्स को हटाने से ज़्यादा समय लगता है. सीएसएस में ये अंतर हमेशा साफ़ तौर पर नहीं दिखते. हालांकि, ब्राउज़र के DevTools की मदद से यह पता लगाया जा सकता है कि किन हिस्सों को फिर से पेंट करना है. साथ ही, पेंट करने से जुड़ी परफ़ॉर्मेंस से जुड़ी अन्य समस्याओं का पता भी लगाया जा सकता है.

Chrome DevTools

  1. Chrome DevTools में रेंडरिंग टैब खोलें.
  2. पेंट फ़्लैशिंग चुनें.
  3. कर्सर को स्क्रीन पर एक जगह से दूसरी जगह ले जाएं.
हरे रंग से हाइलाइट किया गया यूज़र इंटरफ़ेस (यूआई) एलिमेंट, जो दिखाता है कि उसे फिर से पेंट किया जाएगा
Google Maps के इस उदाहरण में, एलिमेंट को फिर से पेंट करते हुए देखा जा सकता है.

अगर आपको पूरी स्क्रीन फ़्लैश करती हुई दिखती है या ऐसे हिस्से हाइलाइट किए जाते हैं जिनमें बदलाव नहीं करना है, तो इसकी जांच करें.

अगर आपको यह पता लगाना है कि किसी खास प्रॉपर्टी की वजह से, पेंट करने से जुड़ी परफ़ॉर्मेंस की समस्याएं आ रही हैं या नहीं, तो Chrome DevTools में पेंट प्रोफ़ाइलर की मदद ली जा सकती है.

Firefox DevTools

  1. सेटिंग खोलें और पेंट फ़्लैश करने की सुविधा को टॉगल करने के लिए, टूलबॉक्स बटन जोड़ें.
  2. जिस पेज की जांच करनी है उस पर, बटन को टॉगल करके चालू करें. इसके बाद, हाइलाइट किए गए हिस्सों को देखने के लिए, माउस को घुमाएं या स्क्रीन पर स्क्रोल करें.

नतीजा

जहां भी हो सके, ऐनिमेशन को opacity और transform पर सीमित करें, ताकि रेंडरिंग पाथ के कॉम्पोज़िंग चरण में ऐनिमेशन बनाए रखा जा सके. DevTools का इस्तेमाल करके देखें कि ऐनिमेशन की वजह से, पाथ के किस चरण पर असर पड़ रहा है.

पेंट प्रोफ़ाइलर का इस्तेमाल करके देखें कि क्या पेंट करने से जुड़ा कोई काम बहुत महंगा है. अगर आपको कुछ मिलता है, तो देखें कि क्या किसी दूसरी सीएसएस प्रॉपर्टी से, बेहतर परफ़ॉर्मेंस के साथ वही लुक और फ़ील मिलता है.

will-change प्रॉपर्टी का इस्तेमाल कम से कम करें. साथ ही, सिर्फ़ तब करें, जब आपको परफ़ॉर्मेंस से जुड़ी कोई समस्या आ रही हो.