css - 使用 CSS 生成的内容(即伪元素)是否比添加更多 DOM 元素更有效(即解析/渲染速度更快)?

标签 css performance dom pseudo-element shadow-dom

为了让我的移动网络应用程序保持精简和高效,我试图在任何给定时间限制 DOM 上的元素数量。我打算限制使用 DOM 元素的一种方法是尽可能使用伪 :before:after 元素来生成内容。

例如,与其用这样的元数据表示列表项:

<dd class="item">
    <div class="name">Name</div>
    <div class="desc">Description</div>
    <div class="location">Location</div>
    <div class="genre">Genre</div>
</dd>

我可以这样表示(并使用 content: 属性来显示元数据):

<dd class="child" 
    data-name="Name" 
    data-desc="Description" 
    data-location="Location" 
    data-genre="Genre">
</dd>

因此,一个 DOM 元素具有数据属性,而不是 5 个单独的元素和可以说更清晰的标记。
此处演示:http://jsfiddle.net/quc8b/2/

这项技术真的会提高性能吗?我的想法是,DOM 元素越少,javascript 的解析速度就越快,而且我应该能够更快地添加/删除列表项节点。但是渲染(即绘画、布局和回流)会发生得更快吗?换句话说,CSS 生成的内容呈现/解析速度是否比传统元素和文本节点更快或更有效?

我不知道浏览器如何在渲染树和文档树中内部处理 CSS 生成的内容(也许是影子 DOM?)。有没有讨论这个的文章?

最佳答案

我也有兴趣解决这个问题。所以我做了一个简单的小测试用例。

我创建了两个 html 页面进行比较:

A.伪选择器:

  • HTML:其中 50.000 个:<p>paragraph</p>

  • CSS:p:before { display: inline-block; width: 10px; height: 10px; margin-right: 5px; background-color: red; content: ""; }

B.许多 DOM 元素:

  • HTML:其中 50.000 个:<p><span class="icon"></span> paragraph</p>

  • CSS:.icon { display: inline-block; width: 10px; height: 10px; margin-right: 5px; background-color: red; }


测试:

我使用了在 2015 Macbook Pro 上运行的 Chrome Devtools 性能监视器。

测试 1:“开始分析并重新加载页面”

选项 B 输了大约 400 毫秒。 解析花费了 2452 毫秒,而“伪”变体花费了 2033 毫秒。 我进行了三次此测试,结果相似。

screenshot

测试2:调整窗口大小

为了测量重新布局,我开始了一个单独的记录,通过从全屏更改为半屏(使用窗口管理器中的快捷键)将浏览器窗口的大小调整了 3 次

“许多 DOM 元素”是赢家,渲染时间为 1136 毫秒,而“伪元素”则为 1463 毫秒。

enter image description here

测试 3:回流

我试图通过使用这段 Javascript 测量页面高度来引起回流:document.body.offsetHeight;

但执行时间从未超过 4 毫秒……没有足够的时间来可靠地衡量性能。

显然 50.000 个元素不足以导致该区域的任何显着减速。

PS:选题不是很科学,刚好是我第一个想到的

关于css - 使用 CSS 生成的内容(即伪元素)是否比添加更多 DOM 元素更有效(即解析/渲染速度更快)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16024238/

相关文章:

javascript - 动画不适用于列表项

css - 网格 float 断点 css 示例

performance - Flash 文本引擎的显示速度是否比典型的文本字段快?

创建 DOM 节点的 Javascript 流程

html - CSS 选择器 : styling link which contains img

jquery - HTML:尝试从外部 div 获取内部 div 并将该 div 放在外部 div 之外

c - 比较两个相同长度字符串的最快方法

performance - 空白何时会影响性能?

javascript - 从 XML DOM 对象中获取完整的 XML 源

java - 使用 DOM 解析器解析 XML 文档,每个标签有多个元素