javascript - JavaScript 创建的内联样式和 JavaScript 创建的样式表之间的性能差异

标签 javascript css performance dom

我想在我的 DOM 中动态设置给定选择器的所有元素的样式。我看到或多或少有两种方式。对于下面的示例,我将使用 p 元素和它的 text-align 属性,但我更感兴趣的是两种可能的方法的优缺点比我在专门的文本对齐段落中要多。

1。内联(每个元素)样式

var nodes = document.getElementsByTagName('p');
Array.prototype.forEach.call (nodes, function (node) {
     node.style.textAlign = "center";
});

2。样式表

var sheet = (function() {
  // Create the <style> tag
  var style = document.createElement("style");

  // WebKit hack :(
  style.appendChild(document.createTextNode(""));

  // Add the <style> element to the page
  document.head.appendChild(style);

  return style.sheet;
})();

sheet.insertRule("p { text-align: center; }");

通常我会走内联样式的路线,因为它看起来更简单并且它确保样式更改将覆盖现有样式表。但我想到,一方面:有时不覆盖样式表可能更可取,另一方面:修改一个 style 元素可能比修改未知数量的 p 元素。但这只是我的假设。

在性能方面,是否存在将内联样式应用于每个单独元素会比创建样式表更好的情况?假设答案可能取决于我要设置样式的元素数量,那么在某一时刻创建样式表会变得更有效率吗?

编辑:为了澄清我为什么要问这个问题,我将稍微解释一下我为什么要问:我最近将一些我经常在元素之间复制粘贴和改编的 JS hack 变成了一组可重用的 CommonJS 模块。它们会做一些事情,比如将给定选择器的所有元素设置为与集合中最高或最宽的元素相同的高度或宽度,在这种情况下最高或最宽的度量可能会因窗口大小调整或其他触发器而发生变化。

这是一篇关于它的博文:http://davejtoews.com/blog/post/javascript-layout-hacks

以下是模块的 GitHub 存储库:

此时,所有这些模块都使用内联样式,但我正在考虑将它们切换为样式表。我找不到关于这两种方法的优缺点的好答案,所以我在此处发布了问题。

最佳答案

对于您的问题,我没有一个好的通用答案(我不确定是否有),但我使用开发工具对您在 Chrome 57.0.2987.98 beta 上发布的示例进行了一些实验时间轴。


这是在更新 10,000 <p> 的单帧中完成的工作的细目分类具有内联样式(左)和动态样式表(右)的元素:

inline stylesheet


为了比较,以下是使用 100 <p> 进行的相同测试的结果元素:

inline stylesheet


综上所述,对于少量元素,差异可以忽略不计。对于大量元素,当使用内联样式时,浏览器会花更多时间编写脚本(这是意料之中的,因为有一个重循环)和重新计算样式 (我认为这可以解释为浏览器必须为每个元素解析一个样式规则而不是单个通用样式规则)。

所有其他步骤花费的时间大致相同。特别是,使用内联样式时绘制时间不会增加。


作为引用,我使用了以下测试页。

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <button id="add-stylesheet">Stylesheet</button>
    <button id="add-inline-styles">Inline</button>
    <script type="text/javascript">
        let stylesheet = document.getElementById('add-stylesheet');
        let inline = document.getElementById('add-inline-styles');

        stylesheet.addEventListener('click', addStylesheet);
        inline.addEventListener('click', addInlineStyles);

        function addStylesheet() {
            let style = document.createElement("style");
            style.appendChild(document.createTextNode(""));
            document.head.appendChild(style);
            style.sheet.insertRule('p { text-align: center }', 0);
        }

        function addInlineStyles() {
            let nodes = document.getElementsByTagName('p');
            for (let node of nodes) {
                node.style.textAlign = 'center';
            }
        }

        // initialize <p> elements
        init(10000);
        function init(numElements) {
            for (let i = 0; i < numElements; ++i) {
                let p = document.createElement('p');
                p.innerText = 'testing'
                document.body.appendChild(p);
            }
        }
    </script>
</html>

关于javascript - JavaScript 创建的内联样式和 JavaScript 创建的样式表之间的性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42428311/

相关文章:

javascript - 如何使用 jquery 获取 gridview 中标签的文本值

javascript - 如何更改 Django 应用程序中的 DIV 内容

css - 在 Firefox 中垂直居中

mysql - 我如何知道何时应该优化我的查询?

c - 跳到时间量子结束

javascript - "value === false"更优雅的替代方案?

javascript - Moment JS - 如何从当前日期减去 7 天?

jquery - &lt;input type ="text"/>中的文字描边

css - GWT PushButton 图像/文本对齐

mysql - 构建关注者/关注 MySQL 数据库的最佳实践