【问题标题】:CSS and scroll performanceCSS 和滚动性能
【发布时间】:2018-01-08 16:08:26
【问题描述】:

我有一个由大约 1k 个元素组成的树状 HTML 结构。
页面滚动伴随着低 FPS。
性能测试显示频繁Update Layer Tree,占60%的时间。

我怀疑原因在于 CSS:禁用的 javascript 不会改变任何东西,但删除所有样式可以解决问题。

那么,哪些 CSS 属性或选择器会导致它?

【问题讨论】:

  • 尝试在滚动时在所有元素上设置pointer-events: none - 请参阅此article
  • @OriDrori 我已经尝试过了,但没有帮助
  • 使用overflowcontainment 属性。
  • @wOxxOm 应该如何处理这个overflow 属性?设置一些具体的值?
  • 可以私信给我一个页面链接吗?我正在研究如何在官方 DevTools 文档中更好地涵盖此类内容。直接向@kaycebasques 发送消息对我有用。也欢迎遇到类似情况的朋友给我留言。

标签: css performance google-chrome-devtools


【解决方案1】:

我不知道是否有任何特定的 CSS 规则会导致这种行为。我将不得不查看该页面来检查它。尽管如此,一种使大型列表滚动更顺畅的成熟技术是将transform: translate3d(...) 添加到列表中(至少对我的公司而言,它证明了它的价值)。下面的 sn-p 给出了一个例子。也许这可以在一定程度上解决你的问题。

function createList (id) {
  const container = document.getElementById(id);
  
  for (let i = 0; i < 1e5; i++) {
    const div = document.createElement('div');
    div.textContent = i;
    container.appendChild(div);
  }
}

createList('container-1');
createList('container-2');
body {
  display: flex;
  flex-flow: row no-wrap;
}

section {
  height: 500px;
  width: 500px;
  overflow-y: scroll;
}

#container-1 {
  background: red;
}

#container-2 {
  background: green;
  transform: translate3d(0,0,0);
}
<section id="container-1"></section>
<section id="container-2"></section>

【讨论】:

  • 感谢您的回答。为body 使用displayflex-flow 属性有什么意义?
  • @legotin 我只是想将示例并排显示。可以改用浮点数。然而,唯一重要的是transform: translate3d(0, 0, 0)。这个“把戏”其实很古老,例如见blog.teamtreehouse.com/…
  • 仍然没有帮助(
  • @legotin 你把它应用到实际滚动的元素上了吗?
  • 是的,我尝试将其应用于父容器以及项目。一般来说,我知道这个方法,用过几次。这不是灵丹妙药,但有时会有所帮助。但这次不是。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
  • 2019-08-17
  • 2010-12-18
相关资源
最近更新 更多