【问题标题】:External CSS vs inline style performance difference?外部 CSS 与内联样式的性能差异?
【发布时间】:2012-01-07 05:37:49
【问题描述】:

我的一个朋友说,使用 <div style=""></div> 而不是压缩的 css 文件将 link href 放在 head 部分可以提高性能。这是真的吗?

【问题讨论】:

  • 据我所知,它们(大致)相同,但我无法验证。
  • 处理内联样式的维护噩梦必须显着提高性能。到目前为止,我还没有看到任何证据。
  • 对于旧版本的 IE,性能提升非常显着。我已经看到 HTML 表格在 CSS 样式中表现得像胶水一样。

标签: css performance inline-styles


【解决方案1】:

它可以,但链接或外部样式表的原因是它可以缓存在浏览器中,尤其是当您在网站的多个页面中使用相同的 div 时。这意味着浏览器只需加载一次样式表,而不必在每次浏览器重新加载页面时重新加载代码。它还使代码更简洁,使任何更改或调试变得更容易。

【讨论】:

  • 这是缓存机制的本质。不需要证明。
  • 可以“兑现”不代表“兑现”;和“本质”不是事实。
  • 伙计们,现在已经不是毁灭公爵的时代了,我们不给人们现金。另一方面,缓存...
  • 缓存参数不适用于单页应用程序,单页应用程序通常会预先加载所有内容并动态生成页面。
【解决方案2】:

与使用 CSS 文件的性能提升量(通过其他因素)相比,您朋友提到的性能提升可能太微不足道了。

使用样式属性,浏览器只为特定元素绘制规则,在本例中为<div> 元素。这减少了 CSS 引擎查找与 CSS 选择器匹配的元素(例如 a.hover#someContainer li)的查找时间。

但是,将样式放在元素级别意味着您不能单独缓存 CSS 样式规则。通常将样式放在 CSS 文件中可以完成缓存,从而减少每次加载页面时服务器的负载量。

将样式规则放在元素级别也会使您无法跟踪哪些元素以何种方式设置样式。它也可能会适得其反,因为绘制特定元素可以将多个元素重新绘制在一起,从而提高性能。使用 CSS 文件可以将 CSS 与 HTML 分开,从而确保您的样式正确,并且以后更容易修改。

因此,如果您看一下比较,您会发现使用 CSS 文件比在元素级别设置样式更有好处。

不要忘记,当您有一个外部 CSS 样式表文件时,您的浏览器可以缓存该文件,从而提高您的应用程序效率!

【讨论】:

  • 你能用 chrome profiler 提供任何统计数据吗? CPU和GPU在手机和平​​板电脑上成本很高,电池消耗是巨大的成本。我认为有一个权衡。缓存有什么好处?浏览器必须计算当前元素的样式,如果有很多规则,解析样式的成本会更高。
  • 请注意,当有一个引擎在发送给客户端之前内联样式时,与维护相关的所有缺点都会消失
  • 使用 React + Radium 时,与维护相关的缺点也消失了。
  • @AjaxLeung 毫无疑问,你和沙汉姆所说的是真的。这个答案写于 2011 年,当时还没有大多数现代工具。
  • 是的。我只是为今天及以后看到此答案的人添加评论。
【解决方案3】:

事实是“是”

有很大的不同。特别是当您自动化用户界面时。 试试下面的代码。我用IE10和记事本开发。 我正在学习并进行测试,这是一个缩短版本的测试。 (可能有错误,因为我减少了代码以显示您的答案)

单击您引用的图像并阅读警报消息。 提示:在编辑(测试)之前再次保存此文件作为编辑。

祝你好运,唐

<!DOCTYPE html>
  <head>
    <style>
      div.grid
        {
        width:180px;
        height:42px;
        border:none;
        }
      img
        {
        width:50px;
        height:50px;
        margin:2px;
        float:left;
        border: 1px solid red;
        }
    </style>
    <script>
      function handleSelect(xId)
        {
        //
        // TESTPOINT
        alert("TESTPOINT\r>Grid: " + xId);
        //
        // GET BORDER COLOR
        // NOTE: An empty or blank value when you can see a border means the tag itself does not
        //            have 'border properties' (style="border: 2px{width} solid{style} green{color}").
        //            although there can be a border detailed via css local or external or via code (script).
        //            If the 'border properties' are returned then they were setup at the tag as
        //            above or the 'border properties' were updated by script code not css code.
        //            If the 'border properties' are NOT returned then they were setup via css.
        //            Thus, since everything seems to be heading toward edit on the fly (live) then css is NOT the way to go (learning).
        // HINT: Margin property is also not readable if set via css. Most likely all the properties values are the same way.
        //           Thus, setting the property values of a tag should be set at the tag control.
        // (works) cBorder=document.getElementById(xId).style.borderWidth;
        // (works) cBorder=document.getElementById(xId).style.borderStyle;
        // (works) cBorder=document.getElementById(xId).style.borderColor;
        // (works) cBorder=document.getElementById(xId).style.border;
        //cBorder=document.getElementById(xId).style.border;
        cBorder=document.getElementById(xId).style.margin;
        alert("TESTPOINT\r>Grid: " + xId + "\r>Border: " + cBorder);
        //
        // SELECT IMAGE
        document.getElementById(xId).style.margin="1px";
        document.getElementById(xId).style.border="2px solid gold";
        document.getElementById(xId).innerHTML=xId;
        alert("TESTPOINT\r>Grid: " + xId + "\r>Border: " + cBorder + "\r>[set border color gold]");
        //
        // GET BORDER COLOR
        //var cBorder=document.getElementById(xId).style.border-Color;  //Error
        //var cBorder=document.getElementById(xId).style.border-color;  //Error
        //var cBorder=document.getElementById(xId).style.borderColor;   //Error
        //var cBorder=document.getElementById(xId).style.bordercolor;   //Undefined
        cBorder=document.getElementById(xId).style.border;      //Empty
        alert("TESTPOINT\r>Grid: " + xId + "\r>Border: " + cBorder + "\r>[set border color gold]" + "\r>Border: " + cBorder);
        }
    </script>
  </head>

  <body>
    <div class="grid">
      <img style="border: 2px solid green" id="R0C0" src="someimage.bmp" onclick="handleSelect(id)">
      <img style="border: 2px solid blue" id="R0C1" src="someimage.bmp" onclick="handleSelect(id)">
      <img style="border: 2px solid purple" id="R0C2" src="someimage.bmp" onclick="handleSelect(id)">
    </div>
    <div class="grid">
      <img id="R1C0" src="someimage.bmp" onclick="handleSelect(id)">
      <img id="R1C1" src="someimage.bmp" onclick="handleSelect(id)">
      <img id="R1C2" src="someimage.bmp" onclick="handleSelect(id)">
    </div>
    <div class="grid">
      <img id="R2C0" src="someimage.bmp" onclick="handleSelect(id)">
      <img id="R2C1" src="someimage.bmp" onclick="handleSelect(id)">
      <img id="R2C2" src="someimage.bmp" onclick="handleSelect(id)">
    </div>
  </body>
</html>

【讨论】:

  • 我用IE10和记事本开发。 ?
  • '我使用IE10和记事本开发'...即无视我刚才所说的。
【解决方案4】:

这不是一个容易回答的问题,因为这种情况下的性能取决于许多因素(CSS 选择器的复杂性、文档大小等)。但是,如果我们举一个孤立的例子,那么我们可以看到 CSS 类通常比内联样式快:
Inline style vs CSS class

【讨论】:

  • 很确定这是在测试节点类或样式属性的更改速度,而不是问题所要求的样式应用速度
  • @Sam “应用样式的速度”是什么意思?你能提供一个测量这个速度的测试吗?如果你看一下测试代码,你会发现每次迭代都会发生页面回流,这意味着测试不仅包括类/属性修改,还包括对页面的实际影响。
  • 它可能包括添加样式的时间,但也增加了时间。如果文档已经有类测试或内联样式,而 JS 不需要添加它怎么办。无论哪种情况,我都在加快解决 CSS 的速度,而且(我可能错了)但我不认为这个测试只是这样做,我认为它做了额外的工作。
  • @Sam 这个测试忽略了浏览器加载 CSS 并处理它的可能足迹。我在回答中提到这是一个孤立的案例。它只是衡量使用不同方式(内联与外部)应用样式的性能。这就是当今典型的 Web 应用程序所做的 - 从 JavaScript 更改 HTML 文档而无需重新加载页面。
  • @s.ermakovich 链接现已失效
【解决方案5】:

使用外部样式表绝对是更好的选择,因为它可以帮助您记住您在 div(s) 上应用的样式。它减少了加载页面的时间,因为 HTML 代码越少加载速度越快。

但在某些情况下,您可能需要更改特定 div 的某些属性,那么内联样式是最佳选择。说真的,一两个内联样式不会对页面加载时间产生任何影响。

还有另一种内部样式表选项,但它仅在您有一个单页网站时使用,例如您正在制作模板。这是因为你必须在每个 HTML 页面中编写 CSS

【讨论】:

  • 更少的 html 并不意味着更少的负载,这是一个不同的因素,但第一个内容绘制也需要加载你的 CSS。
【解决方案6】:

如果您使用内联样式而不是样式表,页面加载速度会更快。在某些情况下必须更快。

当您使用带有 href 的样式表时,它需要向服务器发出另一个请求,然后在响应后解析文件。使用内联样式就没有这些,只是直接解析。

如果客户端的互联网速度很慢,那么单个请求可能会很慢,从而导致页面样式较少,直到样式表交付为止。同样,如果它是内联的,就不会有任何延迟。

我们使用样式表的唯一原因是有条理。有时不需要它们,因此内联样式或文档内样式表就足够了。

【讨论】:

  • 这个答案完全忽略了浏览器缓存。样式表只允许请求样式一次并缓存它们,从而减少通过网络发送的内容量。
  • 这个答案也忽略了内联样式会使 HTML 文件变大的事实。可能,尤其是在使用重复的内联样式时,比 CSS 文件大许多倍。顺便说一句,浏览器可以并行加载多个文件(并像上面提到的那样缓存它们)。
  • @GeekOnCoffee 但 HTML 页面有望被缓存 (304),因此缓存并没有真正被忽略。
  • @JanVanderHaegen 如果您不必包含您正在访问的特定页面上未使用的 CSS,则初始加载时间可能会更快。如果将所有 CSS 放在外部文件中,那么 HTML 文件会更小,没错,但外部 CSS 文件可能会更大。优点和缺点。
【解决方案7】:

我更喜欢使用内联 CSS 而不是外部 CSS,其中每个其他元素或图像都有多个小 CSS 文件。下载几个只有 5-10 行代码的 CSS 文件是没有意义的。 如果您的元素包含悬停、活动、选中等属性,那么您应该使用外部 CSS 文件,因为它会避免使您的开发过程复杂化。

【讨论】:

  • 这使得维护非常困难。 CSS、JS 文件应该默认缓存在你用户的浏览器上。
【解决方案8】:

在我看来没有固定的答案。

inline CSS 的加载速度会更快如果 CSS 内容大小的下载速度快于您的服务器响应 external CSS file 请求的速度(考虑 DNS 时间、服务器延迟等)。

对于正常大小的 CSS,我会将它们内联在页面中,对于超过 15-20KB 的内容,我可能会将其放在外部文件中并确保它可以被缓存。

我确信我现在还遗漏了许多其他注意事项,但对于内联与外联没有固定的答案。

【讨论】:

    【解决方案9】:

    当然可以,因为没有服务器请求,css 会与 html 一起加载和呈现,从而更快

    但我建议使用内部 css 而不是内联 css,使用 &lt;head&gt; 标记内的 &lt;style&gt; 以及显示主页所需的核心样式,然后加载外部 CSS 文件

    【讨论】:

    • 你能进一步解释这个建议吗?
    • 是的 ...在头部使用
    猜你喜欢
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多