Warum ist die übergeordnete Div-Höhe Null, wenn sie untergeordnete Elemente schwebt?

131

Ich habe folgendes in meinem CSS. Alle Ränder / Auffüllungen / Ränder werden global auf 0 zurückgesetzt.

#wrapper{width: 75%; min-width: 800px;}
.content{text-align: justify; float: right; width: 90%;}
.lbar{text-align: justify; float: left; width: 10%;}

Jetzt schreibe ich mein HTML als

<div id="wrapper">
    <div class="content">
        some text here
    </div>
    <div class="lbar">
        some text here
    </div>
</div>

Die Seite wird korrekt gerendert. Wenn ich jedoch die Elemente inspiziere, div#wrapperwird dies als 0pxhoch angezeigt . Ich hätte erwartet, dass es sich bis zum Ende ausdehnt div.contentund div.lbar... Warum passiert das?

Auch hier wird die Seite gut gerendert. Dieses Verhalten verwirrt mich nur.

Chris Stryczynski
quelle
4
Dies kann für Sie nützlich sein. CSS Floats 101 aus A List Apart .
David sagt, Monica am

Antworten:

250

Schwebende Inhalte haben keinen Einfluss auf die Höhe des Containers. Das Element enthält keinen Inhalt, der nicht schwebt (nichts hindert die Höhe des Containers daran, 0 zu sein, als wäre er leer).

Durch das Festlegen overflow: hiddendes Containers wird dies vermieden, indem ein neuer Blockformatierungskontext erstellt wird . Unter Methoden zum Enthalten von Floats für andere Techniken und zum Enthalten von Floats finden Sie eine Erklärung, warum CSS auf diese Weise entwickelt wurde.

QUentin
quelle
Hier ist ein weiterer Ansatz , mit dem Container Floats enthalten, der in CSS gelöst wird, ohne dass der Seite Elemente hinzugefügt werden müssen.
Phil
56

Normalerweise werden floats im Layout ihrer Eltern nicht berücksichtigt.

Um dies zu verhindern, fügen Sie overflow: hiddendem übergeordneten Element hinzu.

SLaks
quelle
16
Danke, das funktioniert, aber ich verstehe nicht, warum ... Überlauf: versteckt soll den Inhalt verbergen, der überläuft, nicht das Element vergrößern, um es zu enthalten.
Ripper234
@ ripper234 Hier ist der Grund: stackoverflow.com/questions/25818199/…
kristianp
6

Ich bin mir nicht sicher, ob dies der richtige Weg ist, aber ich habe ihn gelöst, indem ich ihn display: inline-block;zum Wrapper-Div hinzugefügt habe.

#wrapper{
    display: inline-block;
    /*border: 1px black solid;*/
    width: 75%;
    min-width: 800px;
}

.content{
    text-align: justify; 
    float: right; 
    width: 90%;
}

.lbar{
    text-align: justify; 
    float: left; 
    width: 10%;
}
Melih
quelle
1
Dies war genau die Lösung, nach der ich gesucht habe. Überlauf: Versteckte Boxschatten verschwinden natürlich.
Kitiara