我应该在对元素应用多种样式时从 DOM 中分离元素吗?

Posted

技术标签:

【中文标题】我应该在对元素应用多种样式时从 DOM 中分离元素吗?【英文标题】:Should I detach elements from the DOM while I apply many styles to them? 【发布时间】:2017-08-05 08:07:33 【问题描述】:

我担心性能和最佳做法。

    所以我正在构建图形 UI,并了解到在创建许多小元素时我不应该调用 jQuery.append() 无数次。所以我得到了document.createDocumentFragment() 的覆盖。我正在向其中添加元素,然后一旦完成,我将片段插入 DOM(使用appendChild),

    然后,在另一遍中,我计算每个元素的位置。一切都绝对定位,并将通过CSS transform 接收xy 值。不幸的是,对于这些计算,我需要 DOM 中的元素,因为其中一些包含随机长度的文本,并且 我需要测量宽度/高度。否则我会直接在文档片段上执行第 3 步,甚至在它插入 DOM 之前。

    在最后一遍中,我将计算出的样式应用于所有带有 jQuery.css()(可能会替换为 setAttribute 而不是 jQuery)作为循环的一部分(不幸的是,许多调用对此进行了调用 - 每个元素都有不同x/y)。 我是否应该在应用样式时分离包含所有元素的容器,然后将其重新附加到 DOM?

【问题讨论】:

在页面加载之前在 html 中包含 html 内容总是最快的。为什么稍后要向 DOM 添加内容? 您可以在内存中的容器元素上使用jQuery.append(),然后在完成后将容器附加到DOM。这样只有 1 个 DOM 重绘 “一切都在绝对定位”这样就很疯狂 因为这部分 UI 没有 JS 一文不值。我想我可以通过 php 打印元素,但是如果没有启用 JS(或者如果 JS 执行由于错误而停止),那将是一堆无用的无样式未定位对象。甚至我的 CSS 都很短。这只是对内容的增强,它恰好由许多线条和形状组成。不过,这对内容本身并不是必需的。把它想象成一个粒子系统(它不是),但你还会用 PHP 创建粒子吗? 我有我的理由@zzzzBov - 例如jQuery masonry 将所有图块作为绝对定位的元素。我相信这也是合法的用途。 【参考方案1】:

由于缺乏兴趣,我决定自己测试一下。提取一个包含 700 多篇文章(15000 个节点)的元素,在其中大部分应用各种 CSS,然后将元素放回页面实际上慢了 50%。让浏览器只在需要布局时显示更改属性的结果来完成其工作。

我在某处阅读了有关在处理 DOM 时从 DOM 中删除元素的建议。虽然在向其附加元素时可能是这样,但对于样式操作则不成立。

【讨论】:

以上是关于我应该在对元素应用多种样式时从 DOM 中分离元素吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 jQuery.val(value) 不会从 DOM 元素中分派任何事件?

我必须从已删除的元素中分离事件吗? [复制]

拿到内存中dom元素的最后样式进行修改obj下的currentStyle方法

从一个数组元素中分离两个字符串

从元素中分离多行文本

在React Native中分离buttonTouchableOpacity元素?