Div an Float-Höhe anpassen

February 1st, 2007 by Christoph Schüßler | 6 comments
Categories: XHTML & CSS
Tags:

Häufig wird die CSS-Eigenschaft float benutzt, um mehrere <div> innerhalb einer Eltern-<div> nebeneinander anzuordnen. <div> sind Block-Level-Elemente, erzwingen also eigentlich einen Zeilenumbruch. Durch float: left; lässt sich dies verhindern, mehrere <div> lassen sich so horizontal anordnen. Adiós <table>!

So weit alles kalter Kaffee.

Liegen diese fließenden <div> innerhalb einer Container-<div>, ergibt sich aber folgendes Problem: float bewirkt, dass die <div> in der Höhe über die Eltern-<div> (den Container) nach unten herausragen (laut CSS-Spezifikationen auch so vorgesehen…). In anderen Worten: Der Container “kennt” die Höhe seiner Kinder-<div> nicht mehr und erhält als Höhe null, anstatt sich der Höhe seiner Kinder anzupassen und diese zu umschliessen (siehe Beispiel 1 und folgendes Code-Beispiel).

#child1 {
	float:left;
	width: 250px;
	height: 400px;
}
#child2 {
	float:left;
	width: 350px;
	height: 250px;
}
Hallo, ich bin der container.
Ich heiße child1!
Und ich bin child2!

Die lässt sich einfach durch den altbekannten Trick lösen, unterhalb der fließenden <div>eine Weitere einzufügen, der clear: both; zugewiesen wird. Damit wird der Container gezwungen, seine untere Grenze hinter diesen Paragraphen zu verschieben, er erkennt jetzt scheinbar die Höhe der Kinder-<div> an (siehe Beispiel 2).

Hallo, ich bin der container.
Ich heiße child1!
Und ich bin child2!

So weit, so gut. Nur wird dadurch nicht nur ein überflüssiges Element in den Quellcode eingefügt, dieses Element besitzt zudem auch noch keinerlei semantische Bedeutung, es dient lediglich dazu, den Browser auszutricksen.

Dabei lässt sich der gewünschte Effekt auch ohne zusätzliches Markup erreichen, es reicht eine zusätzliche Zeile CSS. Dem Container muss bloß overflow: hidden; zugewiesen werden, so einfach.

Toll. Funktioniert mal wieder nicht in IE6 und darunter. Der alte Knacker rechnet intern mit einem Model names hasLayout, ein Zustand, der bei vielen HTML-Elementen im IE6 durch das Setzen bestimmter CSS-Eigenschaften hervorgerufen wird. Erst wenn ein Element “Layout hat” (hasLayout = true), kann es eine eigene Höhe haben.

Hier liegt der Knackpunkt. Um IE6 dazu zu bewegen, der Container-<div> ebenfalls eine Höhe größer als Null zu spendieren, reicht overflow nicht. Die Rettung bringt hier entweder die Zuweisung einer festen width (also alles außer auto), oder, falls dies aus Designgründen nicht möglich sein sollte, der Einsatz von Microsofts proprietärem CSS-Attribut zoom: 1;.

Für einen umfassenden Hack, der ältere Internet Explorer einschließt, siehe auch diesen Artikel auf positioniseverything.net.)

Will man den Container auch noch dazu bringen, sich der Breite seiner Kinder anzupassen, anstatt auf volle 100% zu gehen, fügt man noch ein display:table; ein (funktioniert mal wieder nicht in IE). Siehe hierzu Beispiel 3 und Beispiel 4!

Der Vollständige CSS-Code:

#container {
	overflow: hidden;
	display: table;
}
#child1 {
	float:left;
	width: 250px;
	height: 400px;
}
#child2 {
	float:left;
	width: 350px;
	height: 250px;
}

6 Comments on “Div an Float-Höhe anpassen”

  1. #1 Tom said at 21:26 on March 12th, 2007:

    Genau das habe ich gesucht. Vielen Dank :)

  2. #2 Tim said at 15:49 on June 15th, 2007:

    Wieso nicht mit

    :after ?

    Dann sparst die den p Tag.

    lg

  3. #3 Christoph Schüßler said at 16:07 on June 15th, 2007:

    Verstehe nicht ganz, was damit gemeint ist. Der p-Tag ist da, um semantisch korrektes Markup zu erhalten, da der div-Tag keinerlei semantische Bedeutung hat.

    p kennzeichnet hier lediglich einen Absatz und ist auch für das Funktionieren des hier Erklärten nicht weiter nötig.

  4. #4 .: jass :. said at 22:53 on July 5th, 2007:

    Danke danke danke!!!

    Häng da schin seit Tagen fest, jetzt Endlich die Lösung!!! :):)

    Site gleich in die Lesezeichen aufgenommen!

  5. #5 me said at 19:42 on July 7th, 2007:

    Super tutorial!
    Schöne Sprache, sehr gute Optik… wie setze ich denn jetzt aber unter diese Reihe von divs noch eine Reihe hin?

  6. #6 Christoph Schüßler said at 16:08 on July 8th, 2007:

    Danke für die Blumen ;-)
    Zu deiner Frage: Vielleicht erklärt dieses Beispiel am besten, wie man eine zweite Reihen von DIVs hinzufügt: http://dev.herr-schuessler.de/examples/div-an-float-hoehe-anpassen/float_in_div4.html - einfach mal in de Quelltext schauen.

Leave a Reply




 

twitter: herr_schuessler

  • Einträge werden geladen...

flickr: krkr

  • Fotos werden geladen...

Kontakt

cs@hirnstrom.de
skype herr.schuessler

+49 (0)179 7755855
+51 (0)1 980824361

Krefeld, Karlsruhe, Phoenix, Hildesheim, Valencia, Leipzig, Lima

dopplr: eldesaparecido

  • Orte werden geladen...