จะเกิดอะไรขึ้นถ้าเราจัดการ DOM ใน requestAnimationFrame?

0

คำถาม

ฉันเข้าใจว่าคือเมื่อไรก็ตามที่มันมีบางอย่า DOM หุ้นเหมือนฤติกรรมโรคจิต--การแทรเป็น DOM อีลีเมนต์จะกระตุ้นเป็น reflow และส่วนใหญ่ตามมาด้ repaint. โปรดแก้ไขให้ถูกต้องฉันหรอถ้าฉันผิดเอง พูดเรื่องที่ MDN เว็บ Docs,

งหน้าต่างrequestAnimationFrame() วิธีการบอกเบราว์เซอร์ที่คุณต้องแสดงภาพอนิเมชั่นและขอร้องให้คนเรียกเบราว์เซอร์เป็นที่ระบุฟังก์ชันต้องปรับปรุงการให้มีการเคลื่อนไหวเมื่อก่อนหน้า repaint

ที่ requestAnimationFrame(งเค.เป็น. aAF)เรียกกลับก็คือเรียกว่าแค่ก่อนที่เบราว์เซอร์เป็นเรื่องที่ repaint. งั้นนี่หมายความว่าถ้าพวกเราก็จัดการเพื่อทำ DOM ยหุ้นอยู่ในนี้ rAF(แก้ไข:แล้วก็คิวอีก rAF ตอนท้าย)ซึ่งตัวกระตุ้นเป็น reflow everytime และนั่นเป็น repaint เราจะติดอยู่ในๆโดยไม่มีอันที่จริการแสดงผลอะไรบนหน้าจอ

หรือเป็นคดีที่ครั้งนึงเบราว์เซอร์ได้ตัดสินใจเพื่อทำ repaint มันจะอยู่กับมันและปรับใช้อะไรคืบหน้าเรื่องที่เกิดขึ้นใน RAF เรียกกลับในอีก repaint?

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

คำตอบที่ดีที่สุด

1

เมื่อไรก็ตามที่มันมีบางอย่า DOM หุ้นเหมือนฤติกรรมโรคจิต--การแทรเป็น DOM อีลีเมนต์จะกระตุ้นเป็น reflow และส่วนใหญ่ตามมาด้ repaint

ภาพเขียนการกระทำเกิดขึ้น asynchronously ดังนั้น"ปุ่ม"น่าจะเข้าใจอยู่ในทางนั้น คนแรกของคุณรหัสจาวาสคริปต์จะทำให้เสร็จก่อนหน้านั้นที่จริงมันจะเกิดขึ้น

ถ้าพวกเราก็จัดการเพื่อทำ DOM ยหุ้นอยู่ในนี้ rAF(แก้ไข:แล้วก็คิวอีก rAF ตอนท้าย)ซึ่งตัวกระตุ้นเป็น reflow everytime และนั่นเป็น repaint เราจะติดอยู่ในๆโดยไม่มีอันที่จริการแสดงผลอะไรบนหน้าจอ

ที่ต้องการสำหรับ repaint accumulate และไม่ synchronously นส่วนเติมเต็ม. คนแรกของคุณต้องมีสิ่งที่ไขรหัสสมบูรณ์จนกระทั่งเรียกสแต็กว่างเปล่า ดังนั้นไม่มีทางๆอยู่ที่นี่

หรือเป็นคดีที่ครั้งนึงเบราว์เซอร์ได้ตัดสินใจเพื่อทำ repaint มันจะอยู่กับมันและปรับใช้อะไรคืบหน้าเรื่องที่เกิดขึ้นใน RAF เรียกกลับในอีก repaint?

ใช่แล้ว ตอนที่ RAF เรียกกลับคือโทรมาว่ารหัสได้ตรวจสอบครั้งสุดท้ายโอกาสที่จะทำให้ปรับปรุงที่ DOM ซึ่งอาจจะ accumulate ไกลกว่านี้ที่ต้องการสำหรับภาพวาด ถ้าอยู่ในนั้นเรียกกลับคุณยังลงทะเบียนอีกเรียกกลับขึ้น RAF มันจะไม่ใช่ประมวลผลในตอนนั้นแต่หลัง:อยู่ที่ตำแหน่ง ต่อ เวลานั้นเบราว์เซอร์จะเตรียมพร้อมของมัน repaint งาน--ไม่ใช่ปัจจุบันหนึ่ง

ตัวอย่างเช่นประยุกต์@item text character set

เอาเป็นว่าคุณมีรหัส:

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

ตอนนี้ executes เราไปตามลำดับ:

  1. update นั่นจดทะเบียนในชื่อของมือเรียกกลับ
  2. เบื้องหลังเปลี่ยนชุต้องการสำหรับ repainting
  3. ที่ callstack กลายเป็นว่างเปล่า
  4. เบราว์เซอร์เริ่มต้นของมัน repaint งานแต่ต้องเข้าไปในบัญชีนั่นคือจดทะเบียนเรียกกลับมา ดังนั้นมันเอานี่ลงทะเบียน(เพราะมันควรจะเดียวที่หนีไปครั้งนึงและ executes update ก่อนที่จะทำอย่างอื่น
  5. ความกว้างของเปลี่ยนชุต้องการสำหรับ repainting. รายการของเปลี่ยนแปลงตอนนี้รวมถึงการเบื้องหลังเปลี่ยนแปลงและนี่ความกว้างเปลี่ยนแปลงและมีเรียงลดหลั่นลูกเล่นที่จะถูกคำนวณไว้แล้ว (ยังไงนี่เป็นตัวแทนคือราต้องพึ่งเบราว์เซอร์)
  6. คน update ฟังก์ชันนั่นจดทะเบียนในชื่อของมือเรียกกลับอีกครั้ง
  7. เบราว์เซอร์แล้วเช็คว่ามันจะต้องทำอย่างเป็นส่วนหนึ่งของ repaint องงานและ performs ทั้งหมดนั่นคือต้องการที่จะ visualise งผลกระทบของพื้นหลังและความกว้างของการเปลี่ยนแปลง
  8. สีงานจบสิ้น ทุกอย่างที่เหลืออยู่คือที่จดทะเบียน update เรียกกลับมา
  9. ตอนที่เบราว์เซอร์ performs ของมันต่อวาดวังวนเราเริ่มต้นอีกครั้งจากขั้นตอน 4 แต่ตอนนี้ไม่มีรายการในคิวการพิมพ์พื้นหลัง-เปลี่ยนอีกแล้ว สำหรับที่เหลือมันจะเป็นคนเดียวกับการประมวลผล
2021-11-21 12:57:10

"4. เบราว์เซอร์เริ่มองผังแป้นพิมพ์/repaint งาน"นั่นมันค่อนข้างสับสน formulation ฉันคิดว่าพูดว่า"เบราว์เซอร์เริ่มทำการปรับปรุงการแสดงผล"ออกจะเป็นค่อยๆน้อยลสับสน ที่ผังแป้นพิมพ์และ repaint นเราแยกทางกัน,คุณทำได้ดีมากบังคับผังแป้นพิมพ์ synchronously จากผู้ใช้-ดินแดนรหัสคุณไม่สามารถบังคับให้เป็น repaint ซึ่งจะเป็นการครั้งสุดท้ายขั้นตอนของการแสดงผลจะค่อยเป็นค่อยไป แล้วก็ฉันรู้สึกที่รู้คำตอบก่อนคะแนนก็จะเป็นอะไรที่ง่ายมากโดยการให้ฉันเตือนจากทางเดียวที่จะช่วยฉันไป raf(()=>raf(fn2)) จะตารางเวลา fn2 ต้องการยิงที่ หน้า กรอบ. ไม่อย่างนั้นนี่คำตอบคือถูกต้อง
Kaiido

@Kaiido ขอบคุณสำหรับความเห็นของเธอ. "คุณทำได้ดีมากบังคับผังแป้นพิมพ์ synchronously จากผู้ใช้-ดินแดนรหัส":คุณหมายถึงเป็นของผู้ใช้-perceivable รเปลี่ยนผังแป้นพิมพ์? คุณสามารถให้รหัสตัวอย่างของมัน?
trincot

มีทางที่ฉันถูกลบออที่จะอ้างอิงผังแป้นพิมพ์.
trincot

gist.github.com/paulirish/5d52fb081b3570c81e3a นี่เป็นรายการของเยื่อผังแป้นพิมพ์และใช่มันคือ"user-perceivable": stackoverflow.com/questions/55134528/...
Kaiido

เอาล่ะ Kaiido!
trincot

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่