据此推断,两条规则都没有选择相同的元素。
这是因为.intro 匹配p 元素,而span.letter 是.intro 的后代。 As already mentioned, specificity is not relevant when selectors are matching different elements.但是由于每个选择器确实匹配了一些元素,所以两个规则都适用,导致你的红色背景在span.letter上生效。
但我想对这个大意有一个官方的解释,这有点太离奇了。
spec 包含一些与您所拥有的非常相似的示例:以包含文本的内联级元素开头的块级元素,以及应用于块级元素的样式,:first-letter块级元素上的伪元素,以及它的内联子元素。在所有示例中,:first-letter 伪元素在格式化结构方面始终是最内层的后代;这意味着它嵌套在行内级子元素中。
最后一个示例说明了包含伪元素在内的元素层次结构,尽管之前的示例在其样式表中包含一个覆盖规则,该规则演示了级联方面发生的情况:
以下 CSS 将使首字母首字母跨越两行:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<HTML>
<HEAD>
<TITLE>Drop cap initial letter</TITLE>
<STYLE type="text/css">
P { font-size: 12pt; line-height: 1.2 }
P::first-letter { font-size: 200%; font-style: italic;
font-weight: bold; float: left }
SPAN { text-transform: uppercase }
</STYLE>
</HEAD>
<BODY>
<P><SPAN>The first</SPAN> few words of an article
in The Economist.</P>
</BODY>
</HTML>
这个例子的格式可能如下:
虚构的标签序列是:
<P>
<SPAN>
<P::first-letter>
T
</P::first-letter>he first
</SPAN>
few words of an article in the Economist.
</P>
注意::first-letter伪元素标签紧挨着内容(即起始字符),而::first-line伪元素开始标签被插入到块元素的开始标签之后。
在您的情况下,两个 font-size 声明都照常适用,但由于 .intro:first-letter 嵌套在 内 span.letter,它使用自己的 font-size 值。如果您使用了相对值it would be calculated based on span.letter,并且您根本没有包含font-size 样式it would simply inherit it from span.letter。
请注意,:first-letter 伪元素不适用于内联级元素(但它确实适用于内联块):
在 CSS 中,::first-letter 伪元素适用于块状容器,例如块、列表项、表格单元格、表格标题和内联块元素。
内联框(使用display: inline 生成的)不是block container box。 (是块容器框的内联级框的示例是内联块。)
如果浏览器将伪元素应用于内联,则违反规范。虽然没有任何迹象表明当您对块容器和内联框后代都有 :first-letter 规则时会发生什么,因为它确实说它不适用于内联,理想情况下浏览器应该始终忽略针对内联的规则盒子的后代。显然,Chrome 不这么认为。见Danield's answer。