div
2 つの疑似要素と 要素を含むのコンテンツは、p
( に対してdiv
) 同じスタッキング コンテキストに参加します。これは、お気づきのように、3 つすべてが静的に配置されているためです。つまり、まったく配置されていません。(はい、これらの要素はフロー中に z 軸に沿ってスタックしますz-index
。配置されていないため、を使用してスタック レベルを操作することはできません。)
これは、さまざまな部分が描かれた順序の要約1です。質問に関連する太字の強調は次のとおりです。
各ボックスは、1 つのスタッキング コンテキストに属します。特定のスタック コンテキスト内に配置された各ボックスには、整数のスタック レベルがあります。これは、同じスタック コンテキスト内の他のスタック レベルに対する z 軸上の位置です。スタック レベルが大きいボックスは、常にスタック レベルが小さいボックスの前に配置されます。ボックスのスタック レベルがマイナスになる場合があります。スタック コンテキストでスタック レベルが同じボックスは、ドキュメント ツリーの順序に従って、後ろから前にスタックされます。
各スタッキング コンテキスト内で、次のレイヤーが後ろから前に描画されます。
- スタッキング コンテキストを形成する要素の背景と境界線。
- 負のスタック レベルを持つ子スタック コンテキスト (最も負の値が最初)。
- インフロー、非インライン レベル、非配置の子孫。
- 配置されていないフロート。
- インライン テーブルとインライン ブロックを含む、インフロー、インライン レベル、位置付けされていない子孫。
- スタック レベル 0 の子スタック コンテキストと、スタック レベル 0 の配置された子孫。
- 正のスタック レベルを持つ子スタック コンテキスト (最初に最小の正)。
div::before
は のコンテンツの前に挿入され、div
その後にdiv::after
挿入されるため、静的な位置にインラインで表示される場合、ブロック要素を挟んでいる場合でも、自然にこの規則に従います (順序付けでは、ブロック ボックスとインライン ボックスの両方が考慮されます)。 .
明らかな理由から、通常は背景が最初にペイントされ、その上にコンテンツが重ねられることに注意してください。
このp
要素は、ブロック レベルの要素として、最初に描画される背景を持っています (#3)。
次に、インライン レベルの疑似要素が、背景の上に背景を重ねて描画されp
ます (#5)。書式設定モデルでは、それらはp
要素の兄弟であるため、それらはすべて、 のスタック コンテキストではdiv
なく、のスタック コンテキストに参加しp
ます。
div::before
疑似要素 (コンテンツと背景の両方) は、ビジュアル ツリーで の前にあるため、テキストの後ろに表示さp
れます。p
div::after
疑似要素 (コンテンツと背景の両方) は、ビジュアル ツリーで の後に来るため、テキストの前に表示されますp
。p
私のコメントに示されているように、疑似要素をブロックとして表示すると、背景は要素div::before
の背後に隠れp
ますが、テキストは隠れません。代わりに、 のテキストは要素div::before
の背景とテキストの間に配置されますp
。div::after
また、 の背景が の背景の前にp
描画され、コンテンツが最前面に描画されることにも注意してください。繰り返しますが、これは、上記のルールに関連して、コンテンツの前または後ろに描かれる背景に関係しています。
1 より詳細な説明は、仕様の付録 Eにあります。