Sie sind vielleicht mit vertikal kollabierenden Elementen vertraut. Wenn ein Element nur andere gefloatete Elemente enthält, kollabiert das Eltern-Element auf null Höhe. Wir verwenden oft den Clear Fix dafür. Aber wenn ein Element nichts enthält, kann es auch horizontal kollabieren, was für das Layout recht unpraktisch sein kann.
Hier ist ein Beispiel für HTML für ein Drei-Spalten-Layout.
<div class="grid grid-bad">
<div class="col col-1-3"></div>
<div class="col col-1-3"></div>
<div class="col col-1-3">
I'm the last column.
</div>
</div>
Floats sind wahrscheinlich immer noch die praktischste Methode, um Spalten vorerst zu handhaben. Wir könnten ein wirklich einfaches Grid-System wie dieses verwenden
.col {
float: left;
}
.col-1-3 {
width: 33.33%
}
Wenn Sie so sind wie ich, haben Sie vielleicht ein mentales Modell davon, dass etwas wie

Aber Sie könnten überrascht sein. Da die ersten beiden Spalten leer sind und nichts haben, das ihnen Höhe gibt, kollabieren sie horizontal. Die letzte Spalte, da sie etwas Inhalt enthält, respektiert ihre Breite, erscheint aber links, da die beiden Spalten davor kollabiert sind.

Wann dies passieren kann
Ich bin kürzlich auf eine Situation gestoßen, in der der Inhalt einer Spalte per Ajax geladen wurde. Die Spalte enthielt sonst nichts, daher war sie bis zum erfolgreichen Ajax-Aufruf und der Hinzufügung des Inhalts in der Breite kollabiert. Als der Inhalt kam, verschob er alle folgenden Spalten nach rechts. *Unpraktisch.*
Siehe den Pen gBCfl von Chris Coyier (@chriscoyier) auf CodePen
Es passiert Ihnen vielleicht nie. Vielleicht enthalten Ihre Spalten immer eine Art Inhalt. Dann ist es keine große Sache. Aber wenn Sie ein Grid-Framework erstellen, selbst für sich selbst, sollten Sie dieses Szenario wahrscheinlich in Betracht ziehen.
Wie man es behebt
Die Spalten benötigen eine Art von Inhalt, der ihnen mindestens 1 Pixel Höhe verleiht. Dadurch kollabieren sie nicht in der Breite. Manchmal haben Spalten Polsterung, das funktioniert gut. Wenn eine Spalte obere oder untere Polsterung oder einen oberen oder unteren Rand hat, ist alles in Ordnung. Wenn nicht, können Sie einfach eine Mindesthöhe festlegen.
/* Any of these with positive lengths will work */
.col {
border-top: 1px solid white;
border-bottom: 1px solid white;
padding-top: 1rem;
padding-bottom: 1rem;
min-height: 1px;
}
Ja, nicht sehr häufig, aber wenn Sie ein Grid-System erstellen, sollten Sie etwas einbauen, um das Kollabieren zu verhindern.
Sehr geehrter Herr Chris,
Ich mag Ihre Website sehr und warte auf Ihren neuen Beitrag. Ich habe ein Problem, können Sie bitte ein Tutorial wie diesen Artikel posten. 3 verschiedene Divs
Wenn ein Div laut Inhalt 180 Pixel Höhe hat und das 2. Div 210 Pixel Höhe und das 3. Div 399 Pixel Höhe laut Inhalt hat. Und diese drei Divs sind nach links gefloatet, können Sie bitte einen Artikel posten, der die Divs 1 und Div automatisch 100% wie das 3. Div macht.
Entschuldigung für mein schlechtes Englisch, ich bin neu in CSS, also hoffe ich, dass Sie meinen Punkt/meine Frage verstehen, was ich fragen möchte.
Ich warte auf Ihre kooperative Antwort
Vielen Dank an das CSS-Tricks-Team
Sie sollten sich das hier ansehen. Gleiche Spaltenhöhe
Wenn Sie Ihre Spalten als
display: table-cellund deren Eltern alsdisplay: tablehaben, funktioniert das auch. Hat aber seine Eigenheiten.Vielen Dank dafür! Ich hatte deswegen schlaflose Nächte wegen dieser Kollapse.
Ich habe früher gesetzt, aber das ist vielleicht eine bessere Lösung.
Ich mag die Nicolas Gallagher Methode
Clever und interessant! Ich bin mir nicht ganz sicher, ob ich die Positionierung des Beispiels in diesem Artikel verstehe, aber ich glaube, ich habe den allgemeinen Dreh raus.
Eine weitere Technik, die ich wirklich mag (eigentlich benutze ich sie immer für Grids), leidet nicht unter dem Problem der kollabierenden horizontalen Spalten: zen grids.
Früher habe ich ein Nicht-Umbruch-Leerzeichen eingefügt, um „Dummy-Inhalt“ zu erstellen und Probleme mit leeren Spalten zu vermeiden, aber diese Lösung scheint besser zu sein. :-)
Wie Sie bereits gesagt haben, ist dies kein häufiges Problem, aber gut zu wissen, falls etwas schiefgeht. Danke für den Beitrag, Chris. Wie immer ist es wirklich großartig.
Was ist, wenn man gar keine Floats verwendet?
.element { display: inline-block; width: 33.333%; }Das Problem bei Inline-Block-Layouts ist, dass der Browser Leerzeichen zwischen den Blöcken einfügt, was Ihre Layout-Berechnungen durcheinanderbringen kann.
Hallo,
Sie können es dank verschiedener Methoden beheben: https://css-tricks.de/fighting-the-space-between-inline-block-elements/ ;)
Ich möchte Sie nur informieren, dass dieser Typ (Muhammed Aslam) Ihr Website-Design von seinem Quellcode kopiert hat, denke ich, ohne Ihre Erlaubnis.
Seine Website-URL: http://aslamise.blogspot.com/
Bitte überprüfen Sie es….
Ich habe einen ganzen Kurs auf dieser Seite, der jedes Detail darüber durchgeht, wie diese Seite entworfen und erstellt wurde, also ist es ziemlich verständlich.
Ich weiß, dass das oft missbilligt wird, also danke für den Hinweis.
Ich werde das hier kaufen, weil es nichts mit dem Inhalt dieses Artikels zu tun hat.
@Ahmed Shawan – https://css-tricks.de/license/
Herr,
Ich habe eine Frage, die nicht zum Thema gehört. Wenn Sie sie beantworten, wäre das extrem hilfreich.
„Wie kann ich einen Hyperlink nur mit JavaScript deaktivieren, wobei der href innerhalb eines Div-Tags unter einer Klasse verbleibt?“
Die Foren sind ein guter Ort, um das zu fragen. Ich werde diesen Thread wieder vergraben, da er nichts mit dem Inhalt dieses Artikels zu tun hat.
Gut. Tatsächlich gibt es eine Layout-Methode, die etwa so heißt: Faux Absolute Positioning. Sie funktioniert perfekt mit diesem Problem und ermöglicht auch das Neuordnen von Spalten im Gegensatz zur Quellreihenfolge.
Vielen Dank für diese Lösung :)
Wirklich großartig. Ich hatte noch nie eine solche Situation, aber jetzt bin ich bereit, falls sie jemals eintritt. Danke.
Gutes Lesen, Chris. Es ist eine gute Methode. Danke für die Veröffentlichung dieser Lösung.
Guter Trick. Kannst du dieses Problem auch verhindern, indem du die Spalten in einen Container mit fester Breite legst?
Schöner einfacher Tipp. Ich habe dies in der Vergangenheit immer durch Setzen einer Breite gelöst.
Ich habe nie daran gedacht, Polsterung oder Rand zu verwenden, aber das ist eine großartige Idee.
Min-height ist meine bevorzugte Methode, um Kollapse zu verhindern, da Ihre Spalten transparent bleiben.
[class*=”col” ] { min-height:20px; }