css - :not(. MyClass) 选择器与重要

标签 css css-selectors

我在下面添加了一个 fiddle ,可以直观地显示我正在处理的问题。在摆弄 css 选择器时,我意识到 !important 选择器非常强大,直到它遇到了它的老大 :not 选择器。

div:not(.red){
    background-color:green !important;
    width:400px;
    height:50px
}

在我的 fiddle 中,我为所有背景声明了紫色的初始值。 我特意订购了第一个为红色,第二个为蓝色 然后我将除红色之外的所有背景都改为绿色。确实如此!

到目前为止还不错

然后我做了一个棕色,另一个棕色的颜色变成了紫色,很重要。它改变了两个棕色阶层。

当我特别要求除了红色之外的所有颜色都必须是绿色时,令人困惑的是这两种棕色没有变成绿色!我对自己说:“重要的选择器一定很强!”然后我向我的 :not 选择器类添加了一个 !important 选择器,以达到良好的效果。鉴于紫色的重要类是最底层的类,它将覆盖绿色上的重要类并保持紫色....OOOOHHHHH NOOOOOOO!!!!它们全部(红色除外)都变成了绿色!

什么给了?

CSS 选择器的真正层次结构和命令链是什么?

这是FIDDLE

最佳答案

这基本上是因为selector's specificity.

根据MDN ,

The specificity of the :not pseudo-class is the specificity of its argument. The :not pseudo-class does not add to the selector specificity, unlike other pseudo-classes.

因此,无论顺序如何,选择器 div:not(.red) 都比 .brown 更具体:(example)

div:not(.red) {
    background-color:green; /* Still applied */
}
.brown {
    background-color:purple; /* Overwritten - even though this appears last */
}

当我们在声明中添加 !important 时,也会发生同样的事情:(example)

div:not(.red) {
    background-color:green!important; /* Still applied */
}
.brown {
    background-color:purple!important; /* Overwritten - even though this appears last */
}

但是,如果我们通过添加类型 (div.brown) 来提高 .brown 的特异性,背景颜色将会被应用。 (example)现在,两个选择器具有相同的特异性,因此当将 !important 添加到两者时,会发生相同的情况。 (example)至此,一切都归结为秩序。

div:not(.red) {
    background-color:green;
}
div.brown {
    background-color:purple; /* This is applied now */
}                              /* ..even if both declarations have !important */

需要注意的是,!important不会增加选择器的特异性。相反,它只是改变了确定应用哪些声明的级联性质。有关解释这一点的详细答案,请参阅 this answer by BoltClock .

关于css - :not(. MyClass) 选择器与重要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22494537/

相关文章:

css - 添加 doctype html 会破坏布局高度

javascript - 在元素列表中,将编号索引放在 id 中还是使用索引选择器?

css - 如何在CSS中选择所有的伪类?

css - Fontawesome5 图标不适用于 Drupal 8 中的伪代码

twitter-bootstrap - 创建 Bootstrap 选择器

php - 如何使用XPath查询选择两个不同的元素

css - CSS规则的优先顺序

css - 如何使用 CSS 强制执行绝对定位和行高?

javascript - 如何在右侧滚动时在左侧创建一个菜单

jquery - 小部件 CSS 与站点 CSS 冲突