このことから、両方のルールが同じ要素を選択していないと推測します。
これは、が の子孫であるのに対し、 が 要素.intro
に一致するためです。すでに述べたように、セレクターが異なる要素に一致する場合、特異性は関係ありません。ただし、各セレクターは一部の要素に一致するため、両方のルールが適用され、赤い背景が有効になります。p
span.letter
.intro
span.letter
しかし、この効果について公式に説明したいのはちょっと奇妙です.
仕様には、あなたが持っているものと非常によく似たいくつかの例が含まれています: テキストを含むインラインレベル要素で始まるブロックレベル要素、ブロックレベル要素に適用されるスタイル、ブロックレベルの:first-letter
疑似要素要素、およびそのインライン レベルの子。すべての例で、:first-letter
疑似要素はフォーマット構造に関して常に最も内側の子孫です。これは、インライン レベルの子要素内にネストされていることを意味します。
最後の例は、疑似要素を含む要素の階層を示していますが、その直前の例には、スタイルシートにオーバーライド規則が含まれており、カスケードに関して何が起こるかを示しています。
次の CSS は、ドロップ キャップの頭文字を約 2 行にします。
<!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
span.letter
font-size
span.letter
:first-letter
疑似要素はインライン レベルの要素には適用されないことに注意してください(ただし、インライン ブロックには適用されます)。
CSS では、::first-letter
擬似要素はブロック、リスト項目、テーブルセル、テーブルキャプション、インラインブロック要素などのブロックのようなコンテナーに適用されます。
インライン ボックス ( で生成されるものdisplay: inline
) は、ブロック コンテナー ボックスではありません。(ブロックコンテナボックスであるインラインレベルボックスの例はインラインブロックです。 )
ブラウザが疑似要素をインラインに適用している場合、仕様に違反しています。ブロック コンテナーとインライン ボックスの両方の子孫にルールがある場合にどうなるかは:first-letter
わかりませんが、インラインには適用されないと書かれているため、理想的にはブラウザーはインライン ボックスの子孫を対象とするルールを常に無視する必要があります。どうやら、Chrome はそうではないと考えています。ダニエルドの答えを参照してください。