2012-12-13 6 views
6

Warum in IE8, ist die Hintergrundfarbe eines Pesudo-Elements hinter Kinder des Elternteils fließt? Der Text fließt vorne, aber die Hintergrundfarbe nicht. Der Z-Index schien keinem zu helfen.Pseudo-Element auf Eltern versteckt hinter Kind Bild auf IE8

Ich konnte nicht feststellen, ob dies ein Fehler in IE8 ist oder nicht. Es scheint, als wäre dies ein ziemlich gewöhnlicher Anwendungsfall gewesen, aber ich konnte nicht viele Blogposts oder SO-Fragen finden, die damit zusammenhängen.

http://jsfiddle.net/VAg2E/

<div id="parent"> 
     <img src="http://placehold.it/200x200"> 
    </div> 


    #parent{ padding: 20px; } 
    #parent:before{ 
     content: 'Behind the image'; 
     position: absolute; 
     top: 0; 
     left: 0; 
     width: 100px; 
     height: 100px; 
     background-color: red; 
    } 

Edit: A related Stack Overflow Question about Stacking Order

+0

Hallo Robert zu ermöglichen, haben Sie jemals eine Arbeit um für dieses Problem finden? –

+0

Ich erinnere mich ehrlich gesagt nicht - aber ich glaube nicht, dass ich tat – Robert

Antwort

6

Dies ist definitiv ein Fehler in IE8; Da Ihr :before Pseudo-Element positioniert ist, sollte es einen neuen Stapelkontext erstellen und immer über die imgunless you give it a negative z-index gezeichnet werden (selbst dann sollte das gesamte Element dahinter gezeichnet werden, nicht nur der Hintergrund).

Dieses Problem scheint auch spezifisch für das Stapeln zwischen :before und :after Pseudo-Elemente und ersetzte Elemente wie img. Es sieht so aus, als ob IE8 den ersetzten Inhalt in Bezug auf das Stapeln anders behandelt, aber was auch immer es tut, es entspricht definitiv nicht der Spezifikation.

Wie Sie wahrscheinlich wissen, ist dies in IE9 behoben.

+0

Es scheint nur wirklich seltsam, dass der Text vor und nur der Hintergrund rendern würde. – Robert

+0

@Robert: Ich denke, IE behandelt das Bild als Hintergrund einer Inline-Box eines Nachkommens und das absolut positionierte Pseudo-Element als Inline-Element im selben Stapelkontext und unterwirft sie [einigen ziemlich unkonventionellen Stapelregeln, die erst nach näherer Untersuchung sinnvoll] (http://stackoverflow.com/questions/11088176/before-pseudo-element-stacking-order-issue/11088328#11088328) ... außer dass es diese Regeln komplett falsch anwendet. – BoltClock

+0

Wenn ich diesen Link verstehe, und IE8 das Bild als Hintergrundebene malt, dann mit: nach sollte der Hintergrund vor dem Bild, aber leider, es ist immer noch hinter. – Robert

0

IE8 unterstützt nur pseudos wenn <!DOCTYPE> deklariert wird. Source

#parent { padding: 20px; z-index: 2; } 
    #parent:before { 
     content: 'Behind the image'; 
     position: absolute; 
     top: 0; 
     left: 0; 
     width: 100px; 
     height: 100px; 
     background-color: red; 
     z-index: -1; 
    }​ 
+0

Obwohl richtig, es ist nicht das hier beschriebene Problem, der Doctype wird in der jsFiddle deklariert (und in der Website, an der ich arbeite), und die Pseudo Element rendert, aber der Hintergrund des Pseudoelements fließt hinter Kinderbildern. – Robert

+1

Das Ändern von 'position: absolute' in' position: relative' scheint das Problem behoben zu haben. – bobthyasian

+0

Mit Position: relativ; Es rendert das Element vor, bleibt jedoch Teil des Layoutflusses. – Robert

2

Haben Sie genau das gleiche Problem, das einzige, was Sie tun können, ist die Stapelreihenfolge über CSS und z-index erzwingen. Der einzige Haken ist, dass z-index auf das untergeordnete Element ab dem übergeordneten Element gesetzt wird, so dass Sie keine korrekte logische Reihenfolge wie #parent-element {z-index: 2} und #child-element {z-index: 1} finden können. Die z-index für #child-element wird einfach auf Ebene 1 als separate Stapelreihenfolge gesetzt innerhalb der #parent-element.

können Sie einstellen, nach wie vor z-index für die #child-element mit einem Wert von -1, wird es bekommt nur die ganzen #parent-element Stapelreihenfolge zurück.

So zu rekapitulieren:

#parent-element { z-index: 99;} /* or any arbitrary number fitting */ 
#child-element {z-index: -1;} 

Denken Sie auch daran, beide Elemente zu geben, ein position: relative/absolute die Stapelreihenfolge fo z-index