【问题标题】:CSS precedenceCSS 优先级
【发布时间】:2009-03-20 17:47:45
【问题描述】:

我的网页包含:

<link href="/Content/Site.css" rel="stylesheet" type="text/css" />
<style type="text/css">
td {
    padding-left:10px;
} 
</style>

引用的样式表包含:

.rightColumn * {margin: 0; padding: 0;}

我在rightcolumn ID 中有一个表格,我希望单元格在其中有一点填充。但是,引用的样式表优先于内联样式。我通过 Firebug 直观地看到了这一点。如果我在Firebug中关闭padding:0指令,padding-left就会生效。

如何让padding-left 工作?

【问题讨论】:

标签: css


【解决方案1】:

大多数答案都说这是一个特异性问题是正确的,但在解释特异性规则时是不正确或不完整的。

基本上,在您的情况下,.rightColoumn *td“更具体”,因此即使它出现得更早,该规则也会获胜。

The CSS 2.1 rules are located here。这些规则是:

  • 如果声明来自,则计数 1 是“样式”属性而不是带有选择器的规则,否则为 0 (= a) (在 HTML 中,元素的“样式”属性的值是样式表规则。这些规则具有没有选择器,因此 a=1、b=0、c=0 和 d=0。)
  • 统计选择器中 ID 属性的数量 (= b)
  • 统计选择器中其他属性和伪类的数量 (= c)
  • 统计选择器中元素名和伪元素的个数(=d)

连接四个数字 a-b-c-d(在具有大基数的数字系统中)给出了特异性。

所以在你的情况下,你有两个规则:

.rightColumn * {} /* a = 0, b = 0; c = 1, d = 0 : Specificity = 0010*/
td {} /* a = 0, b = 0, c = 0, d = 1 : Specificity = 0001 */

0001 小于 0010,因此第一条规则获胜。

有两种方法可以解决这个问题:

  1. 使用!important 使规则更“重要”。我会避免这样做,因为当您将大量规则分散在多个文件中时会造成混乱。
  2. 为要修改的 td 使用更高特异性的选择器。您可以为其添加类名或 id,这将允许您取代链接的 CSS 文件中的规则。

例子:

<style>
  .rightColomn * { padding: 0; } /* 0010 */
  td#myUnpaddedTable { padding: 10px; } /* 0101 */
  td.anUnpaddedTable { padding: 10px; } /* 0011 */ 
</style>

编辑:修正了 *. David 的评论促使我重新阅读规范,这确实表明 * 选择器对特异性得分没有任何贡献。

【讨论】:

  • 我同意。但是,基于 W3C 页面,我不认为星选择器计入 d 级别(或任何级别)特异性,因此 .rightColumn * 应该得分 0010。我还推荐 .rightColumn td {} 作为方式设置填充;它产生了一个足够好的分数 0011。
  • 你能解释一下.rightColumn 是如何属于“其他属性和伪类”的吗?我猜原因是内联,一个类是使用HTML属性class来表示的。
  • 换句话说,div.valuediv[class~=value] 的简写。
  • @LarsH:是的,似乎[class~=value].value 具有相同的特异性。但请注意,[id=idvalue] 的特异性低于#idvalue
【解决方案2】:

正如其他人所提到的,您有一个特异性问题。在确定两个规则中的哪一个应该优先时,CSS 引擎会计算每个选择器中 #ids 的数量。如果一个比另一个多,它就会被使用。否则,它将继续以相同的方式比较.classes 和tags。在这里,您在样式表规则上有一个类,但在内联规则上没有,因此样式表优先。

您可以使用!important 覆盖它,但在这里使用的锤子非常大。你最好提高你的内联规则的特异性。根据您的描述,听起来您的 .rightColumn 元素是或包含 table 并且您希望该表中的单元格有额外的间距?如果是这样,您要查找的选择器是“.rightColumn td”,它比样式表规则更具体,并且优先。

【讨论】:

  • !important 对于 css 就像 DoEvents 对于 VB6 一样。 :)
【解决方案3】:

让它工作的最简单方法是在 CSS 中添加“!important”以保证其优先级(除非你有多个 !important 规则):

td {
    padding-left: 10px !important;
} 

如果您正在寻找不带 !important 的答案,您应该阅读CSS specificity specifications。链接的站点很好地解释了它的工作原理,尽管基本上它从最重要到最不重要,id 选择器最重要,类选择器第二,元素选择器第三。

【讨论】:

  • 使用 !important 时要小心。如果您有其他人使用不熟悉您使用 !important 规则的代码,则会增加维护问题。
  • 更不用说它打破了优先级,如果您正在查看应该应用但没有应用的规则,这会令人困惑。
  • 我同意 !important 应该谨慎使用,但是当有人开始过度复杂化他们的选择器以使其更具体时,我发现它同样存在问题。对于这个例子,它是 td.rightColumn * { ... },这对原本简单的选择器来说是一个可怕的变化。
【解决方案4】:

试试这个:

td.rightColumn * {margin: 0; padding: 0;}

外部样式表中的td 更具体,因此胜出。如果您使用元素名称限定 rightColumn 类,则将应用页面级样式。

【讨论】:

    【解决方案5】:

    您可以尝试添加 !内联 CSS 的重要标志。

    例如

    td { padding-left:10px !重要的; }

    另外,关于 css 规则排序的一般规则,看看这个:

    http://www.w3.org/TR/CSS2/cascade.html#specificity

    【讨论】:

    • 哇,这是我在 StackOverflow 上发布的第一个问题。我感谢大家的回复。他们让我更深入地思考这个问题。
    【解决方案6】:

    这样做:

    .rightColumn *,
    td.rightColumn * {
      margin: 0;
      padding: 0;
    }
    

    CSS 中的优先顺序如下:

    • 如果某个规则有一个 ID,那么它将在任何其他规则之前。
    • 如果某些规则具有类属性,它将位于仅标记规则之前。
    • 如果两条规则都有ID或标签,那么它们的数量解开“战斗”。

    例子:

    <style type="text/css">
      #myid{
        padding: 10px;
      }
    
      .class{
        padding: 20px;
      }
    </style>
    <div id="myid" class="class"></div>
    

    虽然你的 div 既有 ID 又有类,但 ID 规则会覆盖 .class 规则。

    要了解更多关于 CSS 规则优先级的信息,我推荐http://www.w3.org/TR/CSS2/cascade.html#specificity

    【讨论】:

      【解决方案7】:

      好吧,我承认我在这里玩游戏有点晚了.. 但是 3 年过去了,我想我仍然可以为第一名的答案射击..

      我的答案中的额外调味料是有一个具有 2 级类名的 css 示例..

      在下面的示例中,您可以看到没有类的“td”获得“.interval td”样式,而带有“indragover”类的 td 获得“table.interval td.indragover”样式..

      (此代码用于 html 拖放,因此有一些 javascript 将 'indragover' 类应用于 dragenter、dragleave 事件中的 td)

      // put this in a css file
      .interval {
          height: 100%;
          width: 100%;
          background: #FFFFCC;
          border: 2px solid #000000;
          border-collapse: collapse;
      }
      
      table.interval tr td {
          border: 2px solid black;
          color:#112ABB;
          background: #FFFFCC;
          height: 20px;
      }
      
      table.interval td.indragover {
          background: #AAAA00;
      }
      
      // put this in a html file
      <table class="interval">
      <tr><td>blah</td><td class="indragover">blah</td></tr>
      <tr><td class="indragover">blah</td><td>blah</td></tr>
      </table>
      

      【讨论】:

      • 使用两个类名只是为选择器添加更多规则,从而增加了特异性。您也可以通过添加更多元素或在某处使用 ID 来获得相同的结果。
      【解决方案8】:
      1.div p.bio {font-size: 14px}
      #sidebar p {font-size: 12px}
      

      第一行 CSS 乍一看似乎更具体,但实际上上面的第二行更具体地说明了段落的字体大小。

      idclass 更具体,class 比元素更具体。

      2.p {font-size: 12px}
      p.bio {font-size: 14px}
      

      当涉及到class="bio" 段落时,CSS 的第二行 (p.bio) 比第一行更具体。

      class 的优先级高于p 元素。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-10
        • 2019-05-25
        • 2012-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多