问题 完全合格的CSS样式是否有效?


在创建CSS样式时,一种方法似乎是完全合格的样式,例如

#pnlImage div.ipd-imageInfo div.ipd-tags span.ipd-tag

与较短的定义相比,如

div.ipd-tags span.ipd-tag

这也将唯一地标识风格。但是,如果站点已展开或更改,则第二种样式存在无法唯一标识元素的风险。

完全限定风格是否会影响性能,即它会更长?风格命名是否有一些指导/最佳实践参考?

谢谢


11926
2017-08-14 01:21


起源

什么是ipd-tags? - Ape-inago
我想某些应用具体 - nickf
如果网站发生变化,那么 第一 方法还存在不识别正确元素的风险。 - nickf
ipd-tags是类名,带有“ipd-”前缀,用于封装所有类,避免与第三方css类命名冲突。 - ChrisP


答案:


谷歌(不是搜索,实际上是他们)似乎认为它确实会导致性能下降。

此外,Mozilla基金会有一篇文章“编写高效的CSS以在Mozilla UI中使用“它概述了浏览器中CSS选择器可能存在的性能缺陷,以及如何优化渲染引擎的样式规则。他们的文章中有很多关于什么是好的和什么是坏的例子。请记住这只是相关的但是,他们的浏览器。

还有一些公开可用的基准测试,关于CSS选择器对渲染速度的影响:

然而,我认为这在很大程度上是马粪。通过使用其他一些简单的优化,您可以对页面的加载/渲染速度进行更大的FAR更改。我相信你的理智,以及组织良好的代码库应该是第一位的。如果这和某些事情一样重要,我们都会回来使用HTML <4属性(bgcolor =,border =等)来设置我们的网页样式。


7
2017-08-14 01:48





  1. 抬头看 #id 很快
  2. 抬头一看 tag 有点慢。
  3. 抬头一看 .class 是最慢的。

使用更快的查找启动选择器将减少下一部分所需的查找次数。也就是说,如果我写的话 p.myClass,那么浏览器可以很快找到所有的 p 标签,然后它只需循环通过那些来检查类名。

也就是说,它会将CSS文件的可维护性评定为高于其渲染速度。 Blah blah blah过早优化等等等等。


5
2017-08-14 01:26



我的实现并不像那样。我实现的算法是“对于DOM中的每个元素,查看选择了哪些规则(即从规则集中获取其选择器与元素匹配的规则),然后应用级联算法”。因此,任何简单的选择器(标记,类,ID)花费大约相同的时间(以测试它是否与所讨论的DOM元素匹配)。复合选择器需要更长的时间(花费的时间与DOM元素具有的祖先数量成线性比例)。 - ChrisW
你的 算法?你在编写自己的CSS引擎吗? - nickf
对,我是。但这是我在规范中建议的算法:我的HTML渲染器和我的CSS解析器之间的API就像 w3.org/TR/DOM-Level-2-Style/css.html#CSS-ViewCSS 我为DOM中的每个元素调用(作为性能优化,对于足够相似的DOM元素,CSS解析器从缓存返回结果)。你真的说其他浏览器实现使用的算法是“为每个CSS规则,找到DOM元素”而不是“为每个DOM元素,找到CSS规则”?如果是这样,你知道为什么他们这样做吗? - ChrisW
所以...为什么 你的 与现实世界相关的算法,在这里? - jason
@jason nickf在我看来是说浏览器实现了某种算法(即他似乎在暗示,作为使用给定规则的一部分,浏览器可能“非常快速地找到所有p标签,然后它只需要循环通过那些检查班级名称的人“)。这是一个令我惊讶的算法。至少我想查询/仔细检查他是否真的说(所有?大多数?)其他浏览器实现他所说的算法。 - ChrisW


您可能对David Baron(Mozilla)感兴趣 Google Tech谈话


1
2017-08-14 11:59



+1非常相关。 CSS选择器匹配的描述从大约时间0:15:40开始。 - ChrisW


我有一个网站,其他设计师使用严格的风格和维护是一个噩梦。 (合格的样式只是其中的一部分)

基本上,你不能触摸或简化html结构而不破坏一半的样式,并且样式通常不能正确地级联到新的内容添加。如果你添加新的css,你必须重新限定你的新规则,或者其中一半最终被某些现有规则覆盖,因为它包含如此多的特异性。

因此从维护的角度来看,它效率不高。从打字的角度来看也无效率。


1
2017-09-29 02:50





我不明白理论答案是如何可能的:答案是依赖于实现的;所以我建议你把它描述一下。


0
2017-08-14 01:29





完全限定风格是否会影响性能,即它会更长?

是的,在DOM树的每次动态更改时,必须至少针对某些节点重新匹配CSS表达式。不过,我怀疑这会导致任何明显的延迟。

您声明的目标(使选择器对页面结构的更改具有可靠性)并不十分可靠:将关于站点结构的复杂细节硬编码到CSS中只意味着在页面结构更改时您将有更多语句来维护和更新。

如果它在你的控制之下,坚持使用简单的类(即使你有更多的类)和尽可能少的级别(做一些相对大小的字体是我用过几个级别的唯一用例,甚至这有点多余)。它只是浪费了太多的认知能力来跟踪你头脑中的页面结构。


0
2017-08-14 01:34





虽然你的问题是关于性能,(我建议,测量它...)我真的想补充一点,你应该总是尝试使用最短的定义来识别正确的元素。

原因不是文件大小,而是在不改变主要CSS的情况下扩展站点的能力。

例如,你在html网站上有这个部分:

<div id="Header">
    <h1>Css example</h1>
    <h2>Welcome to the css example site</h2>
    <p>An example page by davy</p>
</div>

这是css:

#Header 
{
    background-color: #ffeedd;
    padding: 1em;
}
#Heading h1
{
    font-size: 3em;
    color: #333;
}
#Heading h2
{
    font-size: 1.5em;
    color: #666;
}
#Heading p
{
    margin: 0 0.5em 1.5em 1em;
    font-size: 1.1em;
    color: #999;
}

之后你会进入一个页面,你希望你的标题有不同的背景。

你选择使用 div#Header 在你的主css文件中,你要么必须更改html(这取决于你的系统可能意味着创建一个不同的模板/母版页)来添加一个额外的类,或者创建一个更合格的css选择器,如 body div#Header

使用最短的选择器,你仍然可以使用 div#Header { background : ... } 改变你的标题。您可以创建一个额外的css文件并将其加载到该页面上的标题中(如果允许)或直接向您的样式添加样式定义 <head> 部分。关于这一点的好处是你的css文件不会随着每个不同页面的选择器而增长,你可以保持清醒 classitis

您还可以使用它来切换页面的大小调整方法(静态/流体),以便一个模板/母版页使用默认的css,另一个来自该模板/母版页,只需链接一个名为FluidWitdth90.css的css即可更改模板到90%宽度的流体布局。


0
2017-08-14 12:22



为了确保我理解正确,您提供的示例是首选方法?而不是我使用的更长的完全限定的样式,使它们更短,更具体到只有那个元素,所以它们可以被替换? - ChrisP
我的规则是始终使用最不具体的选择器。所以你有大约3/4次用其他css文件覆盖样式更具体。 - Davy Landman