Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/91.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 特定于元素的CSS选择器坏吗?_Html_Css_Css Selectors - Fatal编程技术网

Html 特定于元素的CSS选择器坏吗?

Html 特定于元素的CSS选择器坏吗?,html,css,css-selectors,Html,Css,Css Selectors,p.error比.error好还是坏 我已经读到元素特定选择器很糟糕,只有在真正需要时才应该使用,但似乎没有人知道为什么。我的意思是,我确实理解.error更利于代码重用,但是否有某种特定的原因使我不应该总是使用元素来处理类?CSS选择器是从右向左读取的。因此p.error有一个额外的步骤来.error。这可能会导致更小的集合,这取决于您的标记 然而,这是一个微观优化。除非我们讨论的是大量的选择器,否则不会有性能上的冲击 这里有一篇关于CSS选择器的优秀文章,详细介绍了如何评估它们:。error

p.error
.error
好还是坏


我已经读到元素特定选择器很糟糕,只有在真正需要时才应该使用,但似乎没有人知道为什么。我的意思是,我确实理解
.error
更利于代码重用,但是否有某种特定的原因使我不应该总是使用元素来处理类?

CSS选择器是从右向左读取的。因此
p.error
有一个额外的步骤来
.error
。这可能会导致更小的集合,这取决于您的标记

然而,这是一个微观优化。除非我们讨论的是大量的选择器,否则不会有性能上的冲击


这里有一篇关于CSS选择器的优秀文章,详细介绍了如何评估它们:

。error
p.error
更有效


为了理解为什么这更有效,我建议您仔细阅读css技巧。

作为一般经验法则,浏览器评估的选择器越少越好

p.error
不一定比
.error
更“糟糕”,如果
.error
用于多个标记。e、 g.
div.error
(参见底部的脚注)

但是,如果它只用于一个段落,那么使用
p.error
只会让浏览器更难工作

首先,它必须找到class属性为
error
的所有元素,然后只使用
p
的标记来过滤这些元素

下面是谷歌的PageSpeed网站上一些有趣的文章


脚音

但是,如果您需要在多个标记上使用一个类,那么最好只使用应用于这些标记的css样式,而不是尝试将其分离。e、 g

.error
{
   color:red;
}

h1
{
font-size:2em;
}

p
{
   font-size:0.8em;
}


<h1 class="error">Bad Heading!</h1>
<p class="error">bad!</p>
。错误
{
颜色:红色;
}
h1
{
字号:2em;
}
P
{
字号:0.8em;
}
糟糕的航向!

糟糕

这样就不用在类前面加标记了


我希望这有帮助

不,这还不错,但可能并不总是必要的

像谷歌的PageSpeed和YSlow这样的工具!将这些类型的选择器称为“过度合格”,也许这就是你听到的“它不好”部分的原因-

p#myid
为例,一个ID在页面上无论如何都应该是唯一的,因此根本不需要用
p
元素限定它。在计算特定性时,ID已经具有最高的权重,因此再次添加额外的部分来尝试添加更多的特定性是完全多余的

但是,对于像您的示例这样的类名,有时确实需要添加限定符,因为您可能希望该类在不同的类型元素上可重用,但根据它是
div
还是
p
而具有不同的属性。例如,“限定符”会使选择器稍微更具体一些

.error {background: red; margin: 5px;}
p.error {margin: 2px;}
上面的代码意味着您可以在任何元素上使用
error
类,并且它将具有5px的边距。但是,如果您在
p
元素上设置error类,则第二个选择器实际上正在做一些事情,它覆盖了第一个元素的边距,但仍然获得了背景色

所以他们做了一项工作,但你经常会看到太多人在没有必要的情况下对他们的所有要素进行了过度限定。。例如,如果只将
.error
类应用于
p
元素,则不需要第二个选择器


经验法则是从选择器的右侧开始,尽快使其唯一。

原因是特殊性。例如

  • +1.按类别划分的每次访问
  • +1每一次通过标签访问
  • +10每一次访问的ID
  • 等等
因此,如果您有一个类和一个标记访问,那么该样式的特殊性为2(1+1)

稍后,如果您尝试设置所有
.error
元素的样式,但是
p.error
元素中的样式冲突,则会获得更高的特定性。这可能会引起一些麻烦。这就是为什么您可能不希望总是使用tag+class


(也就是说,专用性解决的问题比它产生的问题多得多,通常被认为是非常可怕的。)

拥有一个非常专用的选择器并不意味着性能差,但是如果有很多声明适用于一个元素,然后性能将受到影响。否则,唯一的问题是它会增加加载样式表所需下载的字节数。相信我,HTML中每多传递一个字符都是有害的,会降低页面加载速度

在现代浏览器应用CSS级联期间,每个网页元素的每个CSS属性都会发生以下过程:

  • 从所有源收集属性的所有声明。这包括默认浏览器样式和自定义用户样式,以及作者样式表。如果有多个,则转至2

  • 按重要性和来源按以下顺序(从最低优先级到最高优先级)对声明进行排序:

    • 用户代理样式表(默认浏览器样式)
    • 用户样式表(用户的自定义样式表)中的常规声明
    • 作者样式表中的常规声明(网页样式表;外部、嵌入和内联样式)
    • !!作者样式表中的重要声明
    • !!用户样式表中的重要声明
    优先级最高的人获胜。如果有多个具有相同优先级,则转至3

  • 按选择器特定性排序。具有最特定选择器的人获胜。如果没有明确的赢家,请转至4

  • 在源代码中最后一位的人获胜

  • 如果级联没有在元素上设置CSS属性,则浏览