【发布时间】:2017-01-08 17:50:33
【问题描述】:
我有一个 2 列布局,右侧列是一个可滚动的结果列表,最多包含 200 个项目结果(基本上只是一个带有 overflow-y: scroll; 集的 ul)
我发现,当您滚动时,右侧的列会导致一些卡顿(这在低端硬件上尤其明显)。
在 chrome 时间轴中,当我滚动列时,我可以看到一些主要的“更新层树”。 有什么办法可以弄清楚为什么“更新图层树”如此冗长以及哪些 CSS 属性对速度的影响最大? 当我点击它时 - 只告诉我它运行了多长时间而不是其他信息。
我在每个 li 中都有一些表现不佳的 CSS(例如过滤器、变换、框阴影等)- 如果我一个一个地删除每个 SASS 文件,它会提高滚动性能(并最终在我删除所有 CSS 后消除卡顿),但显然很难确定哪些 css 属性没有执行此操作。
我想知道我是否遗漏了 chrome 时间线中对这方面有帮助的内容?
我尝试使用 will-change CSS 属性将滚动提升到不同的层/强制硬件加速 - 但这并没有太大的区别。
我滚动时也没有执行任何 javascript 事件。
限制为少于 200 个项目不是一种选择。
我已经设置了一个示例(我知道它的项目列表较长,但这仅用于演示目的): https://github.com/jooj123/jank/blob/master/scroll.html
真正有趣的是,如果我删除 overflow-y: scroll;(在上例中的 .map-search__results 中),滚动变得非常平滑并且卡顿消失 - 为什么会有这么大的效果?
这是 chrome 时间线(基本上只有很长的“更新层树”部分):
修复:
Paul's answer about will-change: transform is spot on,特别是这条花絮帮助了:
“添加 will-change: transform;。一旦添加,“滚动重绘”矩形就消失了。”
但要小心,因为它并不总是适用于您的代码库,检查滚动性能问题指示器以确保“滚动重绘”已关闭,对我来说,我还必须禁用 -webkit-clip-path 属性(在我的在其中一个子 div 中设置的实际代码库 - 不在提供的演示中,请参阅:
【问题讨论】:
-
可能的领导:stackoverflow.com/questions/25724126/… 如果您需要优化建议,我建议发布与这 200 个元素相关的代码
-
我看过那个帖子,并没有真正给我任何关于如何诊断问题的想法。我在滚动时没有使用 javascript 设置样式,并且在 chrome 时间轴中没有看到图层入侵
-
过去对我来说,将溢出放在包装 div 上比直接放在 ul 上效果更好
-
你看过这篇文章了吗? stackoverflow.com/questions/12969228/…
-
@carol-mckay 感谢您的建议,但这并没有产生巨大的整体差异
标签: html css performance google-chrome google-chrome-devtools