Warum Container sich nicht von selbst leeren

Avatar of Chris Coyier
Chris Coyier am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Eine der Hürden (und „Ah-ha“-Momente) beim Erlernen von CSS ist dieses Thema mit dem Leeren von Floats. Wenn Sie keine Ahnung haben, wovon ich spreche, schauen Sie sich den Klassiker Alles über Floats an.

Ich möchte speziell über das Problem des „Zusammenfallens“ sprechen, d. h. wie Elemente, die gefloatete Elemente enthalten, diese nicht bei der Berechnung ihrer Höhe berücksichtigen. Zum Beispiel hat ein Elternelement, das *nur* gefloatete Elemente enthält, eine Höhe von Null. Das ist für CSS-Neulinge überraschend und verwirrend und scheint kontraintuitiv zu sein.

Die Lösung ist normalerweise trivial. Die Verwendung eines beliebigen Overflow-Werts von hidden oder auto auf dem Elternelement „behebt“ dies. Der clearfix ist ebenfalls beliebt.

Aber diese „Fixes“ erwecken den Eindruck, dass dieses Verhalten von vornherein „kaputt“1 ist. Verwirrend? Sicher. Sollte es bessere Kontrollmöglichkeiten geben? Absolut. Kaputt? Nicht wirklich. Wenn sich alle Container ausdehnen würden, um ihre gefloateten Nachkommen aufzunehmen, würden wir uns noch mehr beschweren, und das Problem wäre möglicherweise schwerer zu umgehen.

Das klassische Beispiel

Wir verwenden dieses Beispiel, das Eric Meyer vor sieben Jahren vorgestellt hat.

<p>
 ...text...
 <img src="sunset.jpg" class="callout" />
 ...text...
</p>
<p>
 ...text...
</p>

Diecalloutclass, würde zum Beispiel das Bild nach links fluten und einige Ränder anwenden. Das ist, was wir jetzt bekommen

Das ist genau das, was wir wollen würden, der korrekte Textfluss. Damit dies geschieht, muss der obere Absatz quasi „kollabieren“ und das geflutete Bild unten herausragen lassen.

Wenn sich der obere Absatz automatisch ausdehnen würde, um den Float zu enthalten, würde uns das hier übrig lassen

Wie Eric sagte

Das hätten Designer niemals akzeptiert.

Und ich stimme zu. Das hätte ein noch größeres Problem sein können, vorausgesetzt, es hätte kein ausgefallener Workaround gefunden werden können, um es zu umgehen.

Sollte es eine bessere Lösung geben?

Ja, wahrscheinlich. Ich habe Vorschläge gesehen

overflow: contain;

Das könnte funktionieren, aber was ist, wenn Sie den horizontalen Überlauf ausblenden möchten? Wir haben bereits overflow: hidden, das Floats bereits enthält, was funktioniert, aber das ist dann semantisch etwas verwirrend. Es könnte ein ganz neues Attribut geben, wie z. B.

contain: floats | collapse | inherit;

Aber ich weiß nicht, sie können nicht einfach ständig neue Attribute hinzufügen, daher müsste das ernsthaft geprüft werden.


1 Ich möchte hier auch hinzufügen, dass ich oft höre, wie Leute sagen, dass „Floats das Element aus dem Dokumentenfluss nehmen“, was nicht stimmt. Gefloatete Elemente beeinflussen immer noch Inline-Elemente (das ist sozusagen der Punkt) sowie andere geflutete Block-Level-Elemente. Wenn geflutete Elemente „aus dem Dokumentenfluss entfernt“ würden, würden sie nichts beeinflussen (wie absolut positionierte Elemente).