CSS 特异性和 !important

标签 css

我认为我对特异性和 !important 的工作原理有错误的理解。

考虑下面的 HTML:

 <head>
<link href="css/style.css" rel="stylesheet">
<link href="css/style1.css" rel="stylesheet">
 </head>
  <body>
     <div  class = "outer">
        <div class = "inner1">
            <div class = "inner2">
                <p>Voluptate labore cupidatat an enim quamquam ut anim malis, varias id sed veniam 
                    quibusdam, singulis aliqua ut singulis domesticarum, id aliqua illum o officia, 
                    et ab domesticarum, irure e excepteur o eram nam appellat coniunctione do 
                    commodo..</p>
            </div>
        </div>
      </div> 

样式.CSS

.outer .inner1  {
    color:green !important;
}

STYLE1.CSS

.outer .inner1 .inner2 {
    color:red ;

}

我的理解是 style.css 中的规则永远不会被覆盖(因为它有一个重要的标签),即使 syle1.css 中的规则具有更多的特异性。 我认为规则会在 HTML 文件中遇到时应用(首先是 style.css,然后是 style1.css),并且只有当规则更具体时(重要标记阻止),元素的特定属性的值才会被覆盖无论后续规则多么具体,这一点都是最重要的)。这显然不是它的工作原理。有人可以告诉我 !important 和特异性如何工作以及什么时候使用 !important 吗?

最佳答案

Styles for a directly targeted element will always take precedence over inherited styles, regardless of the specificity of the inherited rule.

--Specificity: Directly targeted elements vs. inherited styles


注意:在演示中添加新设计的规则集:

div.outer.outer.outer>div.inner1>div.inner2.inner2>aside.inner3 {
  color: blue !important
}

它的特异性得分为 0、0、7、4,非常可笑、不必要,而且还很重要。 CSS 从右向左读取:

  1. 查找<aside>类别为 .inner3 的标签
  2. 它必须有一个父项 <div>其类别为 .inner2 .
  3. 还有<div class="inner2">必须有 parent <div>类别为.inner1 .
  4. 并且必须 <div class="inner1">有一个 parent <div>类(class) .outer .

必须满足选择器的所有这些特定规则,以便深度嵌套 <aside>标签得到它的风格。 .inner3 的任何后代元素将继承color: blue属性和值,但它很容易被 i.inner2 之类的内容覆盖与 color:red

   <div class="inner3">
     <p>This deeply nested text has <i class='inner2'>crazy specificity but this text is red.</i>
       ...
     </p>
   </div>

注意: CSS 框底部的新规则集:

  div {
    color: black !important
  }

现在这个选择器特定于所有 div,所以这里是 !important刚刚被分配了一个具有深远影响的选择器。这可能更像是您所期望的行为。


顺便说一句,您可能注意到了重复的类:

  .outer.outer.outer

这称为选择器链接,它将增加选择器的特异性得分。请参阅Online Specificity Calculator


演示


div.outer.outer.outer>div.inner1>div.inner2.inner2>aside.inner3 {
  color: blue !important
}

.outer .inner1 {
  color: green !important;
}

.outer .inner1 .inner2 {
  color: red;
}

div {
  color:black !important;
}
<head>
  <link href="css/style.css" rel="stylesheet">
  <link href="css/style1.css" rel="stylesheet">
</head>

<body>
  <div class="outer">
    <div class="inner1">
      This text will be green...
      <div class="inner2">
        <p>Voluptate labore cupidatat an enim quamquam ut anim malis, varias id sed veniam quibusdam, singulis aliqua ut singulis domesticarum, id aliqua illum o officia, et ab domesticarum, irure e excepteur o eram nam appellat coniunctione do commodo..
        </p>

        <aside class='inner3'>
          <p>This deeply nested text has <i class='inner1'>crazy specificity</i>, yet it only applies to it and its descendants with no specific <b class='inner2'>`color` property</b>.</p>
        </aside>
      </div>
      ...and this text will be green as well.
    </div>
  </div>

关于CSS 特异性和 !important,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50458813/

相关文章:

html - 拉伸(stretch) Iframe 视频超过最大屏幕宽度,无法找到 overflow hidden 的方法

Javascript - 即使元素存在,getElementById() 也会返回 null

html - 调整 HTML 元素的大小

html - 具有分组单元格的 CSS 表格布局?

WordPress 板球的 Html/CSS 结果页面/记分卡

javascript - 如何在 JavaScript 中设置元素的 style.top 属性?

css - 如何水平对齐 twitter bootstrap 中的 3 个框?

html - 如何使文本在 HTML 页面中垂直和水平居中

javascript - CSS 显示 :block property error or behaving differently

css - 我可以使用带背景色的 SVG 图案吗?