CSS 样式优先级困惑

标签 css html angular web-frontend

<分区>

CSS

.wrapper > * {
    background: deepskyblue;
}

.item {
    background: deeppink;
}

HTML

<div class="wrapper">
  <div class="item">
    Test
  </div>
</div>

上面是我的 CSS 类和 HTML。因此,由于我在包装器 > * 下为 .item 类提供了样式。

但是该元素的背景仍然是深蓝色。

应该是深粉色吗?

我知道我可以在 .item 中使用 !important 来获得深粉色,但我想知道为什么会按此顺序发生。

Screenshot of element inspection in Google Chrome

最佳答案

要了解为什么您没有看到想要的结果,您需要先了解 CSS Specificity以及权重选择器有什么(作为这个问题的答案,讨论太长了)。

首先,您的原始规则集:

.wrapper > * { // [0,0,0,1,0]
  background: deepskyblue;
}

.item { // [0,0,0,1,0]
  background: deeppink;
}

这两个规则都具有 [0,0,0,1,0] 的特殊性,因为每个选择器中只有一个类。 * 选择器的权重为 0,因此它不会向第一条规则添加任何权重。由于这两个规则影响同一元素的相同属性,所以最后的规则获胜:在这种情况下,background: deeppink;

但是,您的实际规则不同:

.wrapper[_ngcontent-c1] > *[_ngcontent-c1] { // [0,0,0,3,0]
  background: deepskyblue;
}

.item[_ngcontent-c1] { // [0,0,0,2,0]
  background: deeppink;
}

在这种情况下,第一个规则获胜,因为它更具体。属性选择器的权重为 [0,0,0,1,0]

要解决这个问题,您必须制作一个等于或超过要覆盖的规则的特异性的选择器。

例如:

.wrapper[_ngcontent-c1] > *[_ngcontent-c1] { // [0,0,0,3,0]
  background: deepskyblue;
}

.wrapper[_ngcontent-c1] > .item[_ngcontent-c1] { // [0,0,0,4,0]
  background: deeppink;
}

关于CSS 样式优先级困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45594062/

相关文章:

jquery - 从复选框集合中选择的第一个元素值

html - 如何影响 HTML 元素的哪些子元素导致其增长,哪些不增长?

html - bootstrap 使登录表单在模态左侧

javascript - 带有 ngUpgrade : Angular does not recognize component in view 的 Angular2

javascript - 谷歌搜索框的Bootstrap设计

javascript - 如何仅将 css 应用于特定 div 中的链接?

javascript - 输入类型=文件仅显示按钮

javascript - Angular - 将自定义验证器分配给 FormGroup

angular - 如何在 Cypress 测试中切换 Angular Tab

javascript - 需要每 3 秒更改一次 div 背景?