每当有一些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);
}
当这种执行,我们得到如下顺序:
update
注册为回调
- 背景的变化,计划需要重新粉刷
- 该调用栈变空
- 浏览器就可以开始重新绘制工作,但考虑到没有登记的回调。 因此它删除该登记(因为它只应该运行一次)和执行
update
之前做什么。
- 宽度的变化计划需要重新粉刷。 列表中的更改,现在包括背景的变化,和此宽度的变化和任何连带效应的影响,已经计算的。 (这是如何表示的是浏览器的依赖)
- 的
update
功能是登记作为回调。
- 浏览器现在检查什么需要做的一部分作为这种重新绘制工作,并执行所有需要想象的影响的背景和宽度的变化。
- 油漆工作结束。 所有剩下的是已注册的
update
回调。
- 当浏览器进行其下一次漆周期,我们再次开始从第4步,但是现在没有排队的背景变化。 对于剩下的,它将以同样的处理。
raf(()=>raf(fn2))
将日程安排fn2
火在 下一个 框架。 否则这个答案是正确的。