क्या होता है अगर हम डोम हेरफेर में requestAnimationFrame?

0

सवाल

मेरी समझ यह है जब भी वहाँ कुछ डोम हेरफेर डालने की तरह एक डोम तत्व ट्रिगर करेगा एक reflow और सबसे अधिक संभावना के द्वारा पीछा किया, एक फिर से रंगना. कृपया मुझे सही अगर मैं गलत हूँ. हवाले MDN वेब डॉक्स,

की खिड़की.requestAnimationFrame() विधि ब्राउज़र बताता है कि आप चाहते हैं प्रदर्शन करने के लिए एक एनीमेशन और अनुरोध करता है कि ब्राउज़र के कॉल एक निर्दिष्ट समारोह को अद्यतन करने के लिए एक एनीमेशन से पहले अगले फिर से रंगना

के requestAnimationFrame (एक.कश्मीर.एक. aAF) कॉलबैक कहा जाता है बस से पहले ब्राउज़र है के बारे में करने के लिए फिर से रंगना. तो इसका मतलब यह है अगर हम किसी भी तरह का प्रबंधन करने के लिए एक डोम हेरफेर के अंदर इस आरएएफ (संपादित करें: और भी कतार में एक और आरएएफ अंत में) चलाता है जो एक reflow हर और इस प्रकार एक फिर से रंगना, हम में फँस जाएगा एक अनंत लूप के बिना वास्तव में प्रतिपादन स्क्रीन पर कुछ भी.

या यह मामला है कि एक बार ब्राउज़र का फैसला किया था करने के लिए एक फिर से रंगना है, यह इसके साथ छड़ी और लागू होते हैं कि किसी भी अद्यतन में हुआ आरएएफ कॉलबैक में अगले फिर से रंगना?

dom javascript reflow repaint
2021-11-21 07:17:28
1

सबसे अच्छा जवाब

1

जब भी वहाँ है कुछ डोम हेरफेर डालने की तरह एक डोम तत्व ट्रिगर करेगा एक reflow और सबसे अधिक संभावना के द्वारा पीछा किया, एक फिर से रंगना

पेंटिंग का कार्य होता है asynchronously, तो "ट्रिगर" में समझा जाना चाहिए कि जिस तरह से. पहले अपने जावास्क्रिप्ट कोड से पहले खत्म हो जाएगा कि वास्तव में होता है ।

अगर हम किसी भी तरह का प्रबंधन करने के लिए एक डोम हेरफेर के अंदर इस आरएएफ (संपादित करें: और भी कतार में एक और आरएएफ अंत में) चलाता है जो एक reflow हर और इस प्रकार एक फिर से रंगना, हम में फँस जाएगा एक अनंत लूप के बिना वास्तव में प्रतिपादन स्क्रीन पर कुछ भी.

के लिए की जरूरत है फिर से रंगना जमा है, और नहीं कर रहे हैं synchronously पूरी की. पहले अपने कोड को पूरा करने के लिए है जब तक कॉल स्टैक खाली है । तो वहाँ है कोई अनंत लूप यहाँ.

या यह मामला है कि एक बार ब्राउज़र का फैसला किया था करने के लिए एक फिर से रंगना है, यह इसके साथ छड़ी और लागू होते हैं कि किसी भी अद्यतन में हुआ आरएएफ कॉलबैक में अगले फिर से रंगना?

हाँ. जब आरएएफ कॉलबैक कहा जाता है, कि कोड हो जाता है एक अंतिम मौका करने के लिए अद्यतन बनाने के लिए डोम, जो जमा कर सकते हैं और आगे की जरूरत के लिए चित्रकला. अगर है कि कॉलबैक आप भी रजिस्टर और कॉलबैक पर आरएएफ, यह निष्पादित नहीं होगा उस समय, लेकिन बाद में: में अगले समय है कि ब्राउज़र होगा तैयार अपने फिर से रंगना कार्य-इतना नहीं वर्तमान से एक है.

सरल उदाहरण

चलो कहते हैं कि आप इस कोड के बारे में:

requestAnimationFrame(update);

myElement.style.backgroundColor = "silver"; // This queues a need for repaint

function update() {
    // This queues a need for repaint
    myElement.style.width = Math.floor(Math.random() * 100) + "px";
    requestAnimationFrame(update);
}

जब यह निष्पादित करता है, हम निम्नलिखित क्रम:

  1. update के रूप में पंजीकृत है कॉलबैक
  2. पृष्ठभूमि परिवर्तन कार्यक्रम के लिए एक की जरूरत repainting
  3. Callstack खाली हो जाता है
  4. ब्राउज़र शुरू होता है, अपने को फिर से रंगना, लेकिन खाते में लेता है, वहाँ है एक पंजीकृत कॉलबैक. तो इसे हटा इस पंजीकरण (क्योंकि यह चाहिए केवल एक बार चलाने के लिए) और कार्यान्वित update कुछ भी करने से पहले और.
  5. चौड़ाई बदलने के लिए, कार्यक्रम के लिए एक की जरूरत repainting. परिवर्तन की सूची अब शामिल पृष्ठभूमि बदलने के लिए और यह चौड़ाई बदलने के लिए और किसी भी झरना प्रभाव है कि गणना की गई है. (कैसे यह प्रतिनिधित्व किया है है ब्राउज़र पर निर्भर)
  6. के update समारोह के रूप में पंजीकृत है कॉलबैक फिर से.
  7. ब्राउज़र अब जाँच करता है कि यह क्या करने की जरूरत के भाग के रूप में यह फिर से रंगना नौकरी, और करता है कि सभी की जरूरत है की कल्पना करने के लिए प्रभाव की पृष्ठभूमि और चौड़ाई बदलता है.
  8. रंग नौकरी समाप्त होता है । वह सब छोड़ दिया है है पंजीकृत update कॉलबैक.
  9. जब ब्राउज़र करता है अपने अगले रंग चक्र है, हम से फिर से शुरू 4 कदम है, लेकिन अब वहाँ कोई पंक्तिबद्ध पृष्ठभूमि-परिवर्तन किसी भी अधिक है. बाकी के लिए यह हो जाएगा एक ही प्रक्रिया है ।
2021-11-21 12:57:10

"4. ब्राउज़र शुरू होता है, अपने लेआउट/फिर से रंगना नौकरी," यह काफी एक भ्रामक निरूपण, मुझे लगता है कि कह "ब्राउज़र शुरू होता है को अद्यतन करने के लिए प्रतिपादन" के लिए किया जाएगा थोड़ा कम भ्रामक है । लेआउट और फिर से रंगना अलग कर रहे हैं, आप कर सकते हैं बहुत अच्छी तरह से सेना के एक लेआउट synchronously से उपयोगकर्ता-भूमि कोड, आप मजबूर नहीं कर सकते हैं एक फिर से रंगना है, जो हमेशा हो जाएगा अंतिम चरण के प्रतिपादन कदम है । इसके अलावा, मैं महसूस करने के लिए जवाब के पहले अंक में बहुत आसान हो जाएगा याद दिलाने के द्वारा मिल जाने से उस raf(()=>raf(fn2)) कार्यक्रम होगा fn2 पर आग करने के लिए अगले फ्रेम. अन्यथा इस सवाल का जवाब सही है.
Kaiido

@Kaiido, अपनी टिप्पणी के लिए धन्यवाद. "आप कर सकते हैं बहुत अच्छी तरह से सेना के एक लेआउट synchronously से उपयोगकर्ता-भूमि कोड": क्या आप मतलब है एक उपयोगकर्ता के समझ में परिवर्तन लेआउट? आप दे सकते हैं एक कोड उदाहरण है?
trincot

किसी भी तरह, मैं हटा दिया है करने के लिए संदर्भ के लेआउट.
trincot

gist.github.com/paulirish/5d52fb081b3570c81e3a यहाँ की एक सूची है क्या चलाता है लेआउट, और हाँ, यह "उपयोगकर्ता-perceivable": stackoverflow.com/questions/55134528/...
Kaiido

ठीक है, Kaiido!
trincot

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में