【问题标题】:What does and doesn't cause repaints/reflows when inside requestAnimationFrame?在 requestAnimationFrame 中,什么会导致重绘/重排?
【发布时间】:2016-07-27 17:36:33
【问题描述】:

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

requestAnimationFrame(function() {
    el.appendChild(otherEl)
    el.appendChild(anotherEl)
    anotherEl.removeChild(someOtherEl)
    anotherEl.appendChild(yetAnotherEl)
})

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

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

在 requestAnimationFrame 中,哪些事情会导致重绘/重排,并且我们希望避免这样做?

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

【问题讨论】:

  • 您是按帧执行的,即定期添加子项吗?
  • @TahirAhmed 不一定。它可能每隔几秒钟,甚至可能不到一秒钟。不过,我不想对其施加限制。用例可以是任何东西(例如,每帧添加删除元素以产生某种快速闪烁的效果)。
  • 每帧添加删除元素 我认为你会因为浏览器倾向于每秒渲染 60 帧而在视觉上注意到任何东西太快了。
  • 但是,我知道这是一个示例场景,rAF 在这里没有目的。您只想了解在单个帧上,上述添加和删除子操作将如何执行。
  • 另一个问题,你在这里使用repaints这个词是因为一个框架由许多操作组成,其中一个是Paint。看看 Paul Lewis 的这篇 videothis 文章。

标签: javascript html animation graphics requestanimationframe


【解决方案1】:

这是否会导致在此期间发生(同步?)重绘 当我们试图避免造成油漆,从而使 requestAnimationFrame?

我不太明白你是第一个问题,但我还是会尽力回答。

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

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

鉴于您所有的附加和删除都在同一个 rAF 调用中,浏览器(据我所知)应该将它们全部绘制在一个帧中。

有哪些因素会导致重绘/回流,以及我们 想要避免在 requestAnimationFrame 中执行操作吗?

任何会导致可见性变化但不影响布局的事情都会触发重绘。不透明度不会触发重绘,因此动画成本要低得多。

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

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

最后,为了澄清最后一个问题,无论是在 rAF 内部还是外部,都会发生重绘和布局。请记住这一点。

【讨论】:

  • 我相信我的意思是“重绘和/或重排”,而不仅仅是我感兴趣的重绘。重排会导致重绘正确,因为事情已经重新布局,它们需要重新-画我想。所以,我想我真的很想知道导致回流(布局)的原因。
  • 这是触发回流(布局)的一个很好的列表。但是,文章并没有提到哪些内容不应该阅读,因为读取属性会导致回流,以确定正在读取的属性的值。
  • @trusktr 我不知道任何在读取时触发重排的属性,特别是考虑到读取属性不会影响它们在 DOM 中的样式。就我而言,所有属性都存储在对象的原型中并从那里检索。也许您指的是在我们请求样式值、更改值、请求值、更改值等的地方进行颠簸以导致强制同步布局?是的,布局会导致重绘,因此对动画性能尤其不利。基本上保持旋转、平移、缩放和不透明度以确保安全。
  • 您绝对可以从读取中触发回流,请参阅:gist.github.com/paulirish/5d52fb081b3570c81e3a
  • @trusktr 据我了解,回流/布局发生在任何改变尺寸的东西上,回流会触发绘画。
猜你喜欢
  • 2014-03-25
  • 1970-01-01
  • 2015-10-23
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 2013-11-27
  • 2021-09-10
  • 1970-01-01
相关资源
最近更新 更多