返回

长列表滚动再优化:压缩合成层,优化性能

前端

Web 性能优化特别是长列表滚动优化是一个老生常谈的问题,一般我们的思路是通过虚拟滚动、GPU 加速、fragment 复用等方式优化性能。 本文主要讲解另一种方式:压缩合成层。

合成层相关基础概念

合成层和图层

合成层是 CSS 中的概念,它对应一个 layer,也就是硬件中的一个物理层,也是一个个离屏缓存。 在 合成层 中,其中的一个图层,会独立于其他图层,并各自独立更新,最后将所有图层进行合成,呈现在页面上。

合成层与 Web 性能优化

在长列表滚动优化中,绘制和合成是两项主要的性能消耗。而减少合成层的数量可以减少绘制和合成的时间,从而提高滚动性能。

减少合成层数量的方法

避免使用 position: absolute 和 position: fixed

position: absolute 和 position: fixed 会创建一个新的合成层。如果我们能避免使用它们,就能减少合成层的数量。

使用 translate() 和 transform() 代替 position: absolute 和 position: fixed

translate() 和 transform() 不会创建一个新的合成层。我们可以使用它们来代替 position: absolute 和 position: fixed 来减少合成层的数量。

使用 will-change 属性

will-change 属性可以告诉浏览器某个元素的内容即将发生变化。这可以让浏览器提前准备合成层,从而减少合成的时间。

实际案例优化

背景

在一个长列表滚动优化项目中,我们遇到了一个性能问题。当用户滚动列表时,页面会出现明显的卡顿。

优化过程

我们使用 Chrome DevTools 来分析页面性能。我们发现,页面中有大量的合成层。这导致了滚动性能的下降。

我们使用上述方法来减少合成层的数量。我们避免使用 position: absolute 和 position: fixed,并使用 translate() 和 transform() 代替。我们还使用 will-change 属性来告诉浏览器某个元素的内容即将发生变化。

优化结果

经过优化后,页面的合成层数量减少了一半以上。滚动性能也得到了显著的提升。用户滚动列表时,页面再也没有出现卡顿现象。

总结

长列表滚动优化一直是前端领域的研究热点, 本文主要讲解另一种长列表滚动优化方式:压缩合成层。

减少合成层数量的方法有很多,例如避免使用 position: absolute 和 position: fixed,使用 translate() 和 transform() 代替 position: absolute 和 position: fixed,使用 will-change 属性等。

通过减少合成层数量,我们可以提高滚动性能,让页面滚动更加流畅。