在 requestAnimationFrame 中什么会和不会导致重绘/回流?

tru*_*ktr 5 html javascript graphics animation requestanimationframe

例如,如果我做类似的事情

requestAnimationFrame(function() {
    el.appendChild(otherEl)
    el.appendChild(anotherEl)
    anotherEl.removeChild(someOtherEl)
    anotherEl.appendChild(yetAnotherEl)
})
Run Code Online (Sandbox Code Playgroud)

在我们试图避免导致重绘/回流的时候,这是否会导致(同步?)重绘/回流发生,从而使目的无效requestAnimationFrame

或者,浏览器是否会智能并等到该帧完成后(在所有这些 DOM 操作完成后)才能最终绘制生成的 DOM 结构?

哪些事情会导致重绘/回流,以及我们希望在 requestAnimationFrame 中避免做的事情?

这篇 html5rocks 文章中的样式列表仅提到(我认为)在修改它们时会导致重绘/回流的样式。我也很想知道哪些 JavaScript 属性(以及它们在哪个对象上)在被访问时会导致回流(即发生回流是为了能够获得某个属性的值)。

Fly*_*Emu 2

当我们试图避免引起绘制时,这是否会导致(同步?)重绘发生,从而使 requestAnimationFrame 的目的无效?

我不太明白你的第一个问题,但无论如何我会尽力回答。

从 DOM 中添加或删除元素会触发回流,而 requestAnimationFrame 是强制创建图层的 translateZ(0) 或 translate3d(0,0,0) 技巧的正式版本。从这个意义上说,触发回流与使用 rAF 无关。您提到“当我们试图避免造成油漆时会发生重新油漆”,我认为您指的是无论如何都应该实施的限制。如果我没有正确回答,请告诉我。

或者,浏览器会聪明地等到该帧完成之后(所有这些 DOM 操作完成之后)才能最终绘制生成的 DOM 结构吗?

鉴于所有追加和删除都在同一个 rAF 调用中,浏览器(据我理解)应该将它们全部绘制在一个框架中。

哪些事情可能会导致重绘/回流,并且我们希望在 requestAnimationFrame 内避免做这些事情?

重画是由任何导致可见性变化但不影响布局的因素触发的。不透明度不会触发重新绘制,因此制作动画要便宜得多。

重排会影响整个或部分页面的布局,导致重新计算受影响元素的大小和位置,因此应在动画中避免。平移、旋转和缩放但不会触发回流。

您可以在此处阅读有关此内容的更多信息,并获取触发布局和重绘的 css 属性列表。

最后,为了澄清最后一个问题,无论它们是在 rAF 内部还是外部,都会发生重新绘制和布局。要时刻铭记在心。

  • @trusktr 我不知道任何在读取时触发重排的属性,特别是考虑到读取属性不会影响它们在 DOM 中的样式。就我而言,所有属性都存储在对象的原型中并从那里检索。也许您指的是我们请求样式值、更改值、请求值、更改值等以导致强制同步布局的颠簸?是的,布局会导致重新绘制,因此对动画性能的影响特别大。为了安全起见,基本上保持旋转、平移、缩放和不透明度。 (2认同)