【问题标题】:Pseudo-class inheritance understanding伪类继承理解
【发布时间】:2021-08-29 11:16:20
【问题描述】:

我认为伪类从它们的父元素继承属性,但实际上父元素似乎专门选择了它的所有伪类,即使它们没有被指定。

例如,给定 HTML:

<a href="#" id="id-selector">ok</a>

和 CSS:

#id-selector {
  color: green;
}

a:any-link {
  color: red;
}

我认为 color: green 只会被伪类 any-link继承,因此会被 a:any-link 覆盖 选择器,因为这是伪类的特定选择器,并且特定选择器会覆盖继承的属性,即使它们具有较低的特异性。但是上面的输出是一个绿色的链接,说明#id-selector是专门针对any-link的,而不是被继承的。

具有较低特异性的特定选择器覆盖具有较高特异性的继承属性的示例:

HTML -

<div id="id-has-high-specificity">
    <h1 class="class-has-low-specificity">Heading</h1>
</div>

CSS -

.class-has-low-specificity {
  color: green;
}

#id-has-high-specificity {
  color: red !important;
}

这里的输出是绿色的,这是预期的,因为标题只是从第二条规则继承而来,而是由第一条规则专门选择的。

我认为这同样适用于伪类,因为伪类从其父元素继承。但从我的第一个示例看来,它们没有,而是父元素专门选择它的所有伪类,即使它们没有被指定。

那么是不是伪类不从其父元素继承任何属性,而是父元素在定义规则时专门设置其所有伪类,即使没有指定那些伪类?

【问题讨论】:

  • 您能否在您的问题中加入一个有效的 sn-p,以便我们自己查看问题?
  • 嗨@AHaworth 实际上这是唯一的代码。我正在尝试通过第一原理从头开始学习 CSS,并且只想全面了解伪类继承的工作原理
  • 你能描述一下 CSS 中的 :any-link 是什么吗?如果您想选择存在的属性 href 但任何链接的语法是 [href],而不是伪类 - 那么您必须考虑其他一些伪类?
  • :any-link 将引用两个标签之间的“ok”内容。实际上,如果我们制作选择器#id-selector[href] 和a[href]:any-link,根据我的理解应该会发生同样的事情,前一个选择器仍然获得所有伪类的优先级。我使用 any-link 只是为了说明,实际上我会使用伪类,例如 :visited,例如

标签: css


【解决方案1】:

CSS 根据一组优先规则确定哪个选择器“获胜”。

例如来自MDN:

选择器类型 以下选择器类型列表增加了 特异性:

  1. 类型选择器(例如 h1)和伪元素(例如 ::before)。

  2. 类选择器(例如,.example),属性选择器(例如, [type="radio"]) 和伪类(例如:hover)。

  3. ID 选择器(例如,#example)。

所以在问题中给出的例子中:

<a href="#" id="id-selector">ok</a>
and CSS:

#id-selector {
  color: green;
}

a:any-link {
  color: red;
}

颜色不会变为红色,因为 id 选择器优先,即使 a 的设置位于“级联”之后。

这是一个颜色确实发生变化的 sn-p(对于这个悬停示例):

#id-selector {
  color: green;
}

a#id-selector:hover {
  color: lime;
}

a:hover {
  color: red;
}
</style>
&lt;a href="#" id="id-selector"&gt;ok&lt;/a&gt;

更新 从 cmets 我想知道是否对伪元素(和类)有一些混淆 - 它们是一个元素的“一部分”,它们不是“父”元素的子元素。

这个 sn-p 有一个父/子,在这种情况下,问题中假设的特异性有效:

#id-selector {
  color: green;
}

a:hover {
  color: red;
}
&lt;div id="id-selector"&gt;&lt;a href="#"&gt;ok&lt;/a&gt;&lt;/div&gt;

【讨论】:

  • 我非常感谢这个答案,但我知道特异性规则是如何工作的,正如我的问题的第二部分所证明的那样。我的理解是,一个继承的属性总是被一个特定的选择器覆盖,不管它们的特殊性如何。我的理解也是“伪类”继承自父元素。但是如果它们继承,那么伪类的特定选择器肯定必须覆盖任何继承的东西吗?除非实际上没有发生继承,否则特异性在这里不起作用。这是我的问题。继承是否发生在伪类中?
  • 我不知道你为什么会迷路!查看 MDN 中所述的规则,a 选择器的特异性低于 : hover 选择器,后者的特异性低于 id 选择器。我想知道关于伪元素和类是否存在一些混淆——它们不是“创建”另一个元素,它们是一个元素的一部分。我已经放了另一个 sn-p 来证明你什么时候确实有一个“父母”。
  • @A Haworth 谢谢。您的更新确实回答了我的问题。这是否也适用于伪元素,或者与伪类不同,伪元素是否被视为父元素的子元素?
  • 是的,它适用于伪元素,实际上,如果您查看 MDN 的列表,它们的权重甚至比伪类还要小。
  • 我们有试图同时谈论伪元素和伪类的危险。您的问题最初是关于伪类的。你现在对它们满意吗(因为没有考虑单独的“元素”的问题——它们只是权重低于 id 的类)。如果您可以总结这个问题,那么通过示例询问另一个关于伪元素的问题可能会有所帮助。我现在离线了几个小时,但稍后会再次查看您的决定。
猜你喜欢
  • 2014-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 2023-03-20
  • 2014-02-22
  • 1970-01-01
相关资源
最近更新 更多