【发布时间】:2012-09-18 18:01:24
【问题描述】:
我有一个关于 dom elmenets 和性能的问题。
假设我在一个页面上有 6000 个 dom 元素,并且元素的数量可以随着用户与页面的交互(用户滚动以创建新的 dom 元素)(如 twitter)而增加。
为了提高页面的性能,我只能想到两点。
- 将不可见项目的显示设置为无以避免重排
- 从 dom 中移除不可见的项目,然后根据需要重新添加它们。
他们还有其他方法可以改进包含大量 dom 元素的页面吗?
【问题讨论】:
-
将显示设置为无会触发回流,如果您想要避免回流,这与您想要的完全相反。不做任何事情不会触发回流。将可见性设置为隐藏也不会触发重排。但是,做任何事情都不是一件容易的事。
-
您还应该知道,您的窗口管理器已经从屏幕上移除了不可见的像素以加快 UI 交互。用 javascript 自己做可能会减慢速度而不是加快速度。
-
@slebetman // 当我将显示设置为无时,它会触发重排。确实如此。但是..当您滚动时,它也会触发重排,并且浏览器必须计算页面上所有元素的布局。我认为对页面上的某些项目设置不显示将有助于减少布局计算时间。
-
不,它没有。您可以通过调试打开并通过探查器运行它来自己检查它。滚动触发重绘,所有程序中的所有滚动甚至 Word 或记事本都会触发重绘。即使移动鼠标指针也会触发重绘。但是重绘很便宜——它们自 1980 年代后期以来已经被优化,并且由操作系统/窗口管理器本身而不是程序实现。滚动不会触发重排。
-
@slebetman // 啊..我从paulirish.com/2011/dom-html5-css3-performance 视频中得到了滚动回流的印象。该视频列出了 window.scrollBy 导致回流。我想知道为什么当用户的滚动没有时它会这样做。
标签: javascript performance dom