了解CSS特异性:它是什么以及它的工作原理
#css #网络开发人员 #css3

在为网页创建样式时,级联样式表(CSS)是许多开发人员的首选工具。但是,CSS的一个方面可能是混乱的根源:特异性

具体来说,当多个规则应用于同一元素时,CSS如何确定将应用哪些样式规则?那是特异性发挥作用的地方。

什么是CSS特异性?

CSS特异性是指确定CSS规则适用于网页上的元素的一组规则。选择器的特异性通过详细程度来衡量。通常,规则越具体,它的重量就越多。

如何计算CSS特异性

特异性是根据规则中包含的元素,类,ID和伪级的数量来计算的。定义如何定义的特定顺序很重要,并且如下:

  1. 内联样式
  2. ids
  3. 类,属性和伪级
  4. 元素和伪元素

在特异性方面,每个类别的重量都比之前的重量更大。例如,#id被认为比.class更具体,而.class比元素更具体。

要确定特定规则的特异性,您可以在规则中添加每个选择器的出现数量。例如:

div .myclass p {
  font-size: 24px;
}

此规则将字体大小的属性应用于所有P元素,这些元素是class =“ myclass”的元素的孩子,这又是DIV元素的后代。此示例的CSS特异性是:

  • 元素选择器:1
  • 类选择器:1
  • 后代组合器(空间):1
  • 总特异性:1-1-1

四个级别的特异性

CSS中有四个不同级别的特异性:

  1. 通用选择器。该选择器的特异性为0,这意味着它根本没有影响特异性计算。它由星号 *。

  2. 表示
  3. 键入选择器和伪元素。类型选择器适用于特定类型的元素,例如DIV,P或A。它们的特异性为1。伪元素::之前和::之后也可以包含在此类别中,因为它们在技术上不是“选择器”,但确实会影响特异性。他们的特异性为1。

  4. 类选择器,属性选择器和伪级。类选择器以一个(。)为开头,属性选择器使用括号([]),然后伪级之前是colon(:)。它们的特异性为10。

  5. ID选择器。使用哈希(#)选择ID,并且它们具有100的最高特异性水平。

要看一下这一点,请考虑以下CSS规则:

#menu a {...} /* specificity: 100 + 1 = 101 */
.main-nav a {...} /* specificity: 10 + 1 = 11 */
a {...} /* specificity: 1 */

在这里,#Menu选择器具有最高特异性,在101中。#Menu a比.main-nav a更具体,因此其样式规则将推翻另一个。同时,适用于所有元素,因此将最后应用其规则。

特异性和组合者的使用

可以使CSS特异性变得棘手的一件事是使用组合器,这些组合用来组合或关联选择器中的不同元素。主要组合类型是:

  1. 后代组合 - 以空格为代表 - 选择是第一个元素的后代的元素。
  2. 儿童组合者 - 以比大于符号的代表 - 仅选择第一个元素的直接子元素。
  3. 相邻的兄弟姐妹组合符 - 由加号 +代表 - 在第一个元素之后选择第一个兄弟姐妹。
  4. 一般兄弟姐妹组合者 - 以tilde〜的方式表示,它选择了遵循第一个元素的所有兄弟姐妹。

要将其视为视角,请查看以下示例:

  1. 后代组合器 - 添加0分
body p { /* 0 points */ }
  1. 儿童组合> - 添加1分
nav > ul { /* 1 point */ }
  1. 相邻的兄弟姐妹组合 + - 添加1点

h2 + p { /* 1 point */ }

  1. 一般兄弟姐妹组合〜-添加0分
h2 ~ p { /* 0 points */ }

重要的是要注意,组合者可以将点添加到选择器的特异性,但它们不会影响具有较高特异性值的选择器的优先级。

具有嵌入式和内联风格的CSS特异性

css的特异性也可以根据定义样式的定义以及如何定义而有所不同。

例如:

嵌入式样式

<head>
  <title>CSS Specificity Example</title>
  <style>
    h1 {
      color: red; /* specificity: 1 */
    }

    #header h1 {
      color: blue; /* specificity: 101 */
    }
  </style>
</head>
<body>
  <div id="header">
    <h1>CSS Specificity Example</h1>
  </div>
</body>

在这里,我们有两个针对H1标签的规则 - 一个特异性为1,一个特异性为101。#header H1规则应更具体并覆盖H1规则,但两者都定义嵌入HTML文档的头部部分的样式表。

内联风格

<body>
  <div id="header">
    <h1 style="color: green;">CSS Specificity Example</h1>
  </div>
</body>

在此示例中,H1元素的颜色是在内联样式中定义的。根据我们的特异性层次结构,内联样式的特异性为1000。因此,默认情况下它将覆盖任何其他冲突样式。

覆盖CSS特异性

有几种覆盖CSS特异性规则的方法。这是两个常见的:

使用重要

p {
  color: red !important; /* specificity: 1 */
}

.text-italic {
  color: blue; /* specificity: 10 */
}

在此示例中,所有P元素的颜色都将是红色的,因为添加了!

的重要关键字。

使用选择器

p#paragraph {
  color: blue;
}

.text-italic p {
  color: red;
}

在这里,所有带有id =“段落”的段落都是蓝色的,但是所有是带有类text-text-ititec的元素的后代的段落都是红色的。

高级示例

作为一般规则,右侧的选择器的特异性比左侧的选择性更高,因此A.特定性比特定于.pexial更具体,但比P#garte.pecial.

更具体。

这里还有一些说明CSS特异性的示例:

每个示例中该段的颜色是什么?

示例1/2

<p class="red">
  I'm a red paragraph!
</p>

<style>
  p.red {
    color: red;
  }

  .red {
    color: blue;
  }
</style>

段落元素将具有红色文本,因为CSS选择器。Red比类选择器P.Red更具体。 P.Red选择器的特异性为11,因为类选择器具有10点,并且元素选择器具有一个。

示例2/2

<div>
 <p id="green">
   I'm a green paragraph!
 </p>
</div>

<style>
  div #green {
    color: green;
  }

  #green {
    color: blue;
  }
</style>

在此示例中,段落元素将具有绿色文本,因为CSS选择器Div #Green比ID选择器#Green更具体。 div #Green选择器的特异性为12,而#Green选择器的特异性为100。在此处,特定的选择器div #green赢得了不太具体的ID选择器#Green。

要记住的技巧

这里有3个提示,请先开始对您的页面进行样式设计:

1页,内联样式属性具有比任何其他类型的选择器更高的特异性值。

<p id="my-id" class="my-class" style="color: red;">Inline styles win!</p>

在上面的示例中,即使ID选择器具有更高的特异性值,段落的颜色也将为红色。

2ï¶伪级和伪元素具有其自身的特异性值。

.my-class:focus { /* 1 point */ }

.my-class::before { /* 1 point */ }

在上面的示例中,psseudo-class和:: pseudo-lement之前的::的特异性值为1分。

3ï¶可以使用特异性NPM软件包或在线计算器计算特异性值。

const getSpecificity = require('specificity');

const selectors = [
  'p',
  '.my-class',
  '#my-id',
  'body p',
  'nav > ul',
  'h2 + p',
  'h2 ~ p',
  '.my-class:focus',
  '.my-class::before'
];

selectors.forEach(selector => {
  console.log(getSpecificity(selector)[0].specificity);
});

在上面的示例中,我们可以使用特异性NPM软件包来计算每个选择器的特异性值。

通过牢记这些其他要点,您可以更深入地了解特异性在CSS中的工作方式以及如何在代码中有效使用它。

结论

CSS特异性一开始似乎很复杂,但是对于任何Web开发人员来说,这是一个必不可少的概念。通过了解特异性和组合选择器的工作方式,您可以确保您的样式始终应用于HTML元素,而不会遇到特异性冲突或其他可能导致网站不正确显示的问题。

在上面的示例中,您可以更好地了解特异性在实践中的工作方式以及如何将其应用于CSS样式表。继续练习和尝试CSS特异性,您将立即成为专业人士!

资源和参考

  1. MDN Web文档:Specificity
  2. CSS技巧:Specifics on CSS Specificity

ð您好,我是Eleftheria,Devrel和Content Creator。

ð¥°如果您喜欢本文,请考虑共享。

🌈 All links | Twitter | LinkedIn | Book a meeting