【问题标题】:Animating divs makes Edge/Safari repaint/layout parent container动画 div 使 Edge/Safari 重绘/布局父容器
【发布时间】:2016-04-26 14:57:32
【问题描述】:

我有以下场景:

  • 在同一个容器 (#eventContainer) 中有几千个 div (.lifeevent)。它们正在被动画化,并且它们的 lefttop 属性在每一帧中都发生了变化,但彼此之间没有特别的关系(这使得动画父容器而不是所有子容器变得不可能)。
  • 父级有position: absolute,所有子级div也是position: absolute
  • 动画代码很简单(只改变子元素的style属性),使用requestAnimationFrame
  • 在 Chrome 上流畅运行
  • 几乎不可能在 Edge 和 Safari 上使用
  • 使用 Edge 分析动画向我展示了数千个这样的 Layout 事件:

所以我认为这里的问题是每个动画 div 都会重新评估父容器的布局。当每帧发生数千次时,难怪它很迟钝。有谁知道为什么会这样?

【问题讨论】:

  • 只需减少
    的数量。带有附加动画的“几千个”实例将杀死最强大的系统。我对你的 Chrome 处理这个印象深刻:)
  • 不可能。此外,动画发生在一个循环中,它不会单独附加到每个元素。此外,我真的很想了解为什么子 div 会导致父级上的图层布局。
  • 您是否尝试过使用 transforms 而不是设置 topleft
  • 是的,我有,出于某种原因,这些在 Edge 和 Safari 上的效果更差。我还将 transform3d(0, 0, 0) 与 top/left 结合使用,以尽可能触发硬件加速。

标签: javascript css browser safari microsoft-edge


【解决方案1】:

性能问题的罪魁祸首是触发每个动画元素的浏览器布局(这反过来也导致父级布局繁重)。在使用 Chrome 时间线工具进行调试后,我发现这是因为“强制同步布局”而发生的(在我的情况下,由于每个元素的宽度/顶部/左侧样式属性的交替获取和设置)。可以在here 找到处理强制同步布局的出色指南。它确实对我的问题有很大帮助。处理好gets/sets发生的顺序后,所有动画元素的样式更新只发生在一个布局中,解决了Edge和Safari下的性能问题。

【讨论】:

    猜你喜欢
    相关资源
    最近更新 更多
    热门标签