会发生什么,如果我们操纵DOM在requestAnimationFrame?

0

的问题

我的理解是,只要有一些DOM操作的喜欢插入一个DOM件的触发一个回流和最有可能的随后重新绘制。 请纠正我,如果我错误的。 引用 MDN网Docs,

窗口。requestAnimationFrame() 方法告诉浏览器,你愿意执行一个动画,并请浏览器呼叫一个指定的功能的更新动画之前的下一个重新绘制

该requestAnimationFrame(a。k.a. ae)回被称为之前只是浏览器是关于重新绘制。 那么这是否意味着如果我们在某种程度上能做到DOM操纵这里面的皇家空军(编辑和队列中的另一个英国皇家空军在结束),其中触发一回流;因而重新绘制,我们会被困在一个无限循环,而实际上不呈现任何东西在屏幕上。

或是这种情况下,一旦浏览器中的决定做了重新绘制,它将坚持下去,适用的任何更新的事发生在英国皇家空军的回调在未来的画?

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

最好的答案

1

每当有一些DOM操作的喜欢插入一个DOM件的触发一个回流和最有可能的随后重新绘制

这幅画作中发生异步,所以"触发"应被理解以这种方式。 第一JavaScript code将完成之前,实际情况。

如果我们在某种程度上能做到DOM操纵这里面的皇家空军(编辑和队列中的另一个英国皇家空军在结束),其中触发一回流;因而重新绘制,我们会被困在一个无限循环,而实际上不呈现任何东西在屏幕上。

需要重新绘制的积累和不同步履行。 第一你的代码已完成直到呼叫堆是空的。 因此,没有无限循环在这里。

或是这种情况下,一旦浏览器中的决定做了重新绘制,它将坚持下去,适用的任何更新的事发生在英国皇家空军的回调在未来的画?

是的。 当RAF回被称为代码得到一个最后的机会,使更新DOM,这可能积累的进一步需求的绘画。 如果在这回你还记册的另一个回调RAF,它将不会执行,在这段时间,但后来:在 下一 次的浏览器将准备重新绘制的任务-所以不是当前的一个。

简化实例

让我们说你有这个代号:

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. 背景的变化,计划需要重新粉刷
  3. 该调用栈变空
  4. 浏览器就可以开始重新绘制工作,但考虑到没有登记的回调。 因此它删除该登记(因为它只应该运行一次)和执行 update 之前做什么。
  5. 宽度的变化计划需要重新粉刷。 列表中的更改,现在包括背景的变化,和此宽度的变化和任何连带效应的影响,已经计算的。 (这是如何表示的是浏览器的依赖)
  6. update 功能是登记作为回调。
  7. 浏览器现在检查什么需要做的一部分作为这种重新绘制工作,并执行所有需要想象的影响的背景和宽度的变化。
  8. 油漆工作结束。 所有剩下的是已注册的 update 回调。
  9. 当浏览器进行其下一次漆周期,我们再次开始从第4步,但是现在没有排队的背景变化。 对于剩下的,它将以同样的处理。
2021-11-21 12:57:10

"4. 浏览器开始其布局/重新绘制的工作",这是一个相当令人困惑制,我想说"浏览器开始更新呈现的"可能有点小混乱。 布局和重新绘制是分开的,可以很好地强制布局,同时从用户的土地法,则不能强制重新绘制,这将始终是最后一步渲染的步骤。 还有,我觉得答案的第一点将是一个很简单的提醒从一开始, raf(()=>raf(fn2)) 将日程安排 fn2 火在 下一个 框架。 否则这个答案是正确的。
Kaiido

@Kaiido,感谢你的评论。 "你可以很好地强制布局,同时从用户土地法":你的意思是一个用户可感知的改变布局? 你可以给一个码的例子?
trincot

任何种方式,我删除提到的布局。
trincot

gist.github.com/paulirish/5d52fb081b3570c81e3a 这里是什么触发的布局,是的,这是"用户可感知的": stackoverflow.com/questions/55134528/...
Kaiido

好吧,Kaiido!
trincot

其他语言

此页面有其他语言版本

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