2012-06-20 6 views
5

mit dem folgenden HTML:Verwirrende Schicht, um sich überlappender divs mit Inhalt und Hintergrundfarben

<div class="foo">howdy howdy howdy how</div> 
<div class="bar">Hello</div>​ 

und die folgende CSS:

.foo { 
    background-color:green; 
    overflow:hidden; 
    height:.75em; 
} 

.bar { 
    color: white; 
    background-color: red; 
    margin-top: -10px; 
    width: 200px; 
} 

Die Schicht, um so etwas wie dieses:

weird layer order

Hier ist die zugehörige jsfiddle: http://jsfiddle.net/q3J8D/

Ich würde erwarten, dass der rote Hintergrund oben auf dem schwarzen Text und nicht verstehen, warum der schwarze Text über dem roten Hintergrund ist.

Ich kann dieses Problem mit position: relative beheben, aber ich bin nur neugierig.

Warum ist der schwarze Text oben auf dem roten Hintergrund?

Ich suche vor allem nach einer offiziellen Quelle/Norm, die dieses Verhalten erklärt.

+0

passiert in Chrome, aber nicht in Firefox. Aber keine Ahnung warum. – bfavaretto

+2

Etwas ähnlich zu diesem: http: // stackoverflow.com/questions/11088176/before-pseudo-element-stacking-order-ausgabe – thirtydot

+0

@bfavaretto: Ich sehe es konsistent über die neuesten Versionen aller Browser. – BoltClock

Antwort

3

Es dauerte eine Weile, um es zu verstehen, auch nach thespec mehrfach zu lesen, und BoltClock's answer zum linked question.

Aber es scheint die Erklärung ist einfach: da es sich um zwei statisch (dh nicht positioniert), Block-Level-Elemente innerhalb des gleichen Stapelkontext (das Root-Kontext), sie in der folgenden Reihenfolge gezeichnet werden:

  • Hintergrund von #foo
  • Hintergrund von #bar
  • Textinhalt #foo
  • Textinhalt #bar

Also die Ausgabe sehen wir in der Frage.

Die Farbreihenfolge wird von einem Algorithmus vorgegeben, der in Appendix E der Spezifikation CSS 2.1 beschrieben wird. Was nicht im Anhang steht (aber erwähnt wird here), ist, dass der Algorithmus rekursiv für jeden Stapelkontext (nicht jeder Element) angewendet wird.

+0

Der Stammstapelkontext ist 'html', nicht' body'. Außerdem hast du es im Grunde genommen. Schön gemacht :) – BoltClock

+0

@BoltClock Also schafft der 'Körper' auch einen neuen Stapelkontext? Ich dachte nicht. BTW: Entschuldigung, wenn ich deine Zeit verschwende, um Hilfe zu bitten. Ich war etwas besessen von dieser Frage. Der letzte Satz in meiner Antwort erklärt die Quelle all meiner Verwirrung. – bfavaretto

+0

'body' erstellt keinen neuen Stapelkontext, sondern als ein Kind von' html', das auf 'html', gefolgt von den beiden' div's, gemalt wird. Ich nehme an, dass dieser Kommentar mehr als alles andere dem OP und anderen Lesern zur Klarstellung diente. Und keine Sorgen, keine Zeitverschwendung - ich dachte, du würdest trotzdem daran arbeiten. – BoltClock

-1

http://www.w3.org/TR/CSS21/visuren.html#z-index

„Dieses Beispiel zeigt den Begriff der Transparenz. Das Standardverhalten des Hintergrunds ist Box dahinter zu ermöglichen, sichtbar zu sein. Im Beispiel jede Box überlagert transparent die Boxen darunter. Diese Das Verhalten kann durch Verwendung einer der vorhandenen Hintergrundeigenschaften außer Kraft gesetzt werden. "

+2

... die im Beispielcode verwendet werden. Keine Transparenz hier. – bfavaretto

Verwandte Themen