外部CSS与内联样式的性能差异?


88

我的一个朋友说,使用开头部分<div style=""></div>代替压缩的css文件可以link href提高性能。真的吗?


1
据我所知,它们(大致)相同,但我无法证实这一点。
Nightfirecat

3
这可能会有所启发
Sudhir Bastakoti 2011年

1
处理嵌入式样式的维护噩梦必须对性能进行重大提升。到目前为止,我还没有看到那种想法。
steveax

1
对于旧版本的IE,性能提升非常明显。我见过HTML表格的行为就像是CSS样式的胶水。
2014年

Answers:


90

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

使用style属性,浏览器仅绘制该特定元素的规则,在这种情况下为<div>元素。这样可以减少CSS引擎查找哪些元素与CSS选择器匹配的查找时间(例如a.hover#someContainer li)。

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

将样式规则放在元素级别也将使您失去对以哪种方式设置样式的元素的跟踪。这也可能会抵消绘画特定元素的性能提升,您可以在其中一起重新绘画多个元素。使用CSS文件可将CSS与HTML分开,从而使您可以确保样式正确,以后更容易修改。

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

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


4
可以使用chrome profiler提供任何统计信息吗?在手机和平​​板电脑上,CPU和GPU的成本很高,而电池消耗是巨大的成本。我认为这是一个折衷方案。缓存的好处是什么?浏览器将必须计算当前元素的样式,如果有许多规则,则解决样式的成本将更高。
Akash Kava

28
请注意,当有一个引擎在发送给客户之前将样式进行内联时,与维护相关的所有缺点就会消失
Moshe Shaham

6
使用React + Radium时,与维护相关的缺点也消失了。
AjaxLeung

1
@AjaxLeung毫无疑问,您和Shaham所说的是真的。这个答案写于2011年,当时还没有最先进的工具。
莫里斯

2
是。我只是为那些今天和以后看到此答案的人添加评论。
AjaxLeung

6

如果使用内联样式与样式表,则页面加载速度更快。在某些情况下必须更快。

当您使用带有href的样式表时,它需要对服务器的另一个请求,然后在响应后解析文件。对于内联样式,没有任何东西,只有直接解析。

如果客户的互联网速度较慢,则该单个请求可能会非常缓慢,从而使页面没有样式,直到交付样式表为止。同样,如果是内联的,则根本不会有延迟。

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


9
这个答案完全忽略了浏览器缓存。样式表仅允许一次请求样式并进行缓存,从而减少了通过网络发送的内容量。
GeekOnCoffee

2
这个答案也忽略了内联样式使HTML文件更大的事实。潜在地,尤其是当使用重复的内联样式时,它比CSS文件大许多倍。顺便说一句,浏览器可以并行加载多个文件(并像上面提到的那样缓存它们)。
Jan Van der Haegen

5

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


5
可以肯定的是,这正在测试节点类或样式属性的更改速度,而不是应用样式的速度,这就是问题的所在
山姆

@Sam“应用样式的速度”是什么意思?您可以提供一种测试该速度的测试吗?如果看一下测试代码,您将看到页面重排在每次迭代中发生,这意味着测试不仅涵盖了类/属性修改,而且还涵盖了对页面的实际影响。
s.ermakovich 2014年

它可能包括添加样式的时间,但也增加了时间。如果文档已经具有类测试或内联样式而不需要JS怎么办呢?无论哪种情况,我都在加快CSS的解决速度,而且(我可能是错的),但我认为此测试不能做到这一点,我认为它会做更多的工作。
山姆

@Sam此测试忽略了通过浏览器加载CSS并对其进行处理的可能资源。我在回答中提到这是一个孤立的案例。它只是使用不同的方式(内联还是外联)来衡量应用样式的性能。这就是当今典型的Web应用程序所要做的-从JavaScript更改HTML文档而无需重新加载页面。
s.ermakovich 2014年

好的,我指的是非动态添加的样式
2014年

3

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


3
这是缓存机制的本质。它不需要证明。

5
它可以被“抛出”并不意味着被“抛出”;和“本质”不是事实。
伊万·卡斯泰拉诺斯

6
伙计们,这已经不是公爵制时代了,我们不兑现人们。另一方面缓存
Sebas

3
缓存参数不适用于单页面应用程序,该应用程序通常会预先加载所有内容并动态生成页面。
MindJuice 2015年

1

真相是“是”

这是个很大的差异。尤其是在自动化用户界面时。请尝试以下代码。我使用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>

28
我使用IE10和记事本进行开发。
xanderiel

1

我认为没有固定答案。

一个inline CSS将载入速度,如果在CSS内容大小比下载服务器更快地将一个响应external CSS file请求(DNS考虑时间,服务器延迟等)。

对于普通大小的CSS,我会将其内联到页面中,对于15-20KB以上的内容,我可能会将其放入外部文件中,并确保可以对其进行缓存。

我敢肯定,我现在还缺少许多其他注意事项,但是对于内联还是外部,没有固定的答案。


-1

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

但是在某些情况下,您可能必须更改特定div的某些属性,然后内联样式才是最佳选择。实际上,一两种内联样式不会改变加载页面的时间。

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


-3

与外部CSS相比,我更喜欢使用内联CSS,在外部CSS中,每个其他元素或图像都有多个小型CSS文件。下载几个CSS文件,每个文件只有5-10行,毫无意义。如果您的元素包含悬停,活动,选中等属性,则应使用外部CSS文件,因为它将避免使开发过程复杂化。


这使得维护非常困难。默认情况下,CSS,JS文件应缓存在用户的浏览器中。
dave2118 '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.