当拖动包含数千个子节点的Div元素时,提高浏览器性能

Improve Browser Performance When Dragging Div Element Containing Thousands of Child Nodes

本文关键字:元素 Div 性能 浏览器 子节点 包含数 拖动 千个      更新时间:2023-09-26

这个问题与使用javascript创建复杂的用户界面有关,同时保持浏览器的高性能。

具体来说,当在屏幕上拖动包含数千个节点的元素时,如何使浏览器的FPS不会明显下降。

我使用javascript来生成基于一些事情的表单输入:首先,这个表单有几个级别,每个级别然后包含3个子级别,其中所有包含3个子级别。确切地说,有3个父级,每个父级有3个子级,这些子级有3个子级。这使得总共有27个容器,然后生成表单元素。

一旦为这27个容器中的每个容器生成了输入,主容器中就有超过2600个输入,这个容器是一个jquery对话框。

我希望我已经解释清楚了。我所拥有的是一个包含数千个输入的jQuery对话框,当你在屏幕上拖动这个对话框时,它非常起伏,不光滑。

我认为这种缓慢是由于容器中有成千上万的DOM节点在移动。

我怎么能允许如此大量的元素被拖拽而不显著降低浏览器的FPS ?

一开始我打算称这个问题为"当拖拽包含数千个输入的jQuery对话框时如何提高浏览器FPS",但我将其重命名为更准确一点。

编辑:无论我使用jQuery dialog()来使主容器可拖动,还是我使用普通的javascript,性能都非常缓慢。

编辑2:(我到底在做什么)成千上万的输入永远不会像网页表单那样被填写。输入可能包含也可能不包含实时生成样式表的用户输入的值。可以说,我正在构建一个视觉元素构建器。使用充满输入的对话框,用户可以在元素数组上设置样式。基本上,我通过表单对许多元素提供了完整的CSS控制。的确,这有点疯狂,如果不是不可能的话…但就像爱因斯坦说的,"如果一开始,这个想法不是荒谬的,那么它就没有希望"……不管怎样,如果我能把它完成,它就会像以前从未建造过的东西一样。正如我在下面的评论中所指出的,实际上一次只有100个输入是可见的。

编辑3:作为测试,我删除了所有输入的2/3,性能显著提高。既然所有的元素都不需要一次显示,只有当用户导航到表单的那个部分时才需要显示,那么是否有某种方法可以让DOM忽略它们,直到真正需要它们为止?用户看到的只是实际存在的输入的一小部分。

感谢每个回答我问题的人,我感谢你们的投入(尽管我已经收到了几千条……LOL)。

通过在当前视图之外的任何输入上设置display: none, DOM会忽略这些节点,并且可以毫无延迟地拖动表单。

所以解决方案真的很简单。在所有不需要显示的容器上设置display: none(因为你一次只能看到大约100个输入),并且DOM在拖拽主容器时重新绘制时忽略节点。

问题解决了