【问题标题】:CSS !important does not override styles from external stylesheetsCSS !important 不会覆盖来自外部样式表的样式
【发布时间】:2014-06-06 13:34:00
【问题描述】:

在样式表中,我有这个:

body {
  color: white !important;
}

请注意它在此页面右侧的文本上是如何不起作用的:

https://www.graf.ly/graph_templates/56/

您可以检查文本,并查看样式已应用,但随后被覆盖。这怎么可能?

我认为 !important 会忽略 CSS 的特殊性,并充当始终使用该样式的指令。我以前从未见过这种行为。

注意:

不要被图表轴上的白色文本所迷惑,这是一个text svg 元素,并用fill: white !important 着色。

另外,我很清楚 !important 的正确用法。所以请不要使用 cmets 或回答说“你永远不应该使用!important”。这不是问题:)

【问题讨论】:

  • mifi79 很好地回答了这个问题,但是对于纠正这种行为的实用规则,我建议#legend, #legend .label { color: inherit; }。不是真正的答案,因为答案是它不继承 body color 属性。这只是解决了您的本地化问题。

标签: css


【解决方案1】:

这与 CSS 特定性或 !important 无关。您在 main.css 中有一条规则说:

#legend .label {
  color: black;
}

选择器直接以.label 元素为目标,并为它们赋予颜色,从而防止它们从主体或其他祖先那里继承颜色。 !important 属性仅适用于目标元素;它不会强制其他元素继承该属性。换言之,指定的规则始终优先于继承的规则,即使继承的规则是!important

查看规范:

用户代理必须首先根据以下机制(按优先顺序)为每个属性分配一个指定的值:

  1. 如果级联产生一个值,请使用它。
  2. 否则,如果该属性被继承并且该元素不是文档树的根,则使用父元素的计算值。
  3. 否则使用属性的初始值。每个属性的初始值都在属性的定义中指明。

——http://www.w3.org/TR/CSS21/cascade.html#specified-value

【讨论】:

  • 嗯,这正是我刚才所说的——首先,应用主体颜色,然后应用任何父元素颜色,最后,它被特定规则覆盖。我们只是在争论语义。
  • 我不知道。我没有投反对票,但显然有人不喜欢它。
  • 好吧。如果这只是语义问题,我可以接受——至少我们的答案彼此一致。
  • 如果它让你感觉好些,也有人反对我的回答。 ;-)
  • 您的回答解释了为什么!important 不起作用,但它没有提供解决方案来使其工作而不使规则更具体。我不想创建更具体的规则,因为我在 Google 的主页(在我自己的浏览器上)上应用 CSS,并且过度拟合规则会经常中断。我只是想要一个规则来强制地覆盖所有内容,更具体与否。
【解决方案2】:

您在 main.css 的第 94 行有一个更具体的规则:

#legend .label {
    color: black;
}

将其更改为 white 即可。

关于重要性,它将优先于对body 的其他引用,但不会优先于#legend 标签,这是一个更具体和适用的选择器。这是一篇关于 CSS 特异性的不错的文章:http://css-tricks.com/specifics-on-css-specificity/

【讨论】:

  • 我认为 CSS 的特殊性不能覆盖 !important 指令。这不是真的吗?
  • 有很多层次的特殊性,它都受到 CSS 级联方式的影响 - 因为您直接引用 #legend .label 它不是从主体继承的,因此 !important 没有任何影响。
  • 这是不准确的。虽然#legend .label 确实比body 更具体,但这无关紧要,因为它们都针对不同的元素。
  • 没错,他们是;但是,@DonnyP 认为在 body 上设置颜色会使他的文本变为白色是正确的——如果在 #legend .label 上没有设置颜色。特定规则使该文本对正文颜色的继承无效。我几乎不认为这无关紧要。
  • 我同意@mifi79 并想补充一点,您所知道的是真实的,但只有在同一个选择器上使用重要的一个才会生效。前任。如果它是 #legend .label{color: black} 和 #legend .label{color: white !important;} 那么它将是有效的。在本例中,该属性并未直接应用于选择器,而是从其超级父级(即主体)继承而来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多