Was du willst ist also zwei, Block-Level Elemente nebeneinander positionieren.
Ein Block-Level Element nimmt einmal prinzipiell _immer_ den ganze ihm in der Breite zur Verfuegung stehenden Platz ein. D.h. auch wenn du sagt "width: 45%;" und "margin-left: 53%;" ist der Platz, den du durch den margin eingerueckt hast, nicht einfach so fuer andere Elemente verfuegbar.
Das Zauberwort lautet "float" (und dazugehoerig auch "clear").
Grundvorraussetzungen:
- float Elements sind automatisch immer Block-Level Elemente (z.B. DIV)
- float braucht IMMER AUSNAHMSLOS eine Breitenangabe (width property)
Zulaessige Werte fuer "float" sind "left", "right" und "none".
Ausgehend von der Position, an der du das DIV Element platzierst, wird das Element ganz nach links bzw. ganz nach rechts in der aktuellen Zeile geschoben mit der Breite die du ihm gegeben hast.
Der Text der direkt ausserhalb dieses DIVs ist, umfliesst das DIV Element.
Chart 1
<div>
<div style="float: left; width: 66%;">
bin im float DIV drinnen
</div>
text ausserhalb umfliesst das DIV ganz normal
</div>
+---irgendein container DIV---------+
| +---DIV float: left--+ |
| |bin im float DIV | text ausser|
| |drinnen | halb umflie|
| +--------------------| sst das DIV|
| ganz normal |
+-----------------------------------+
Fuer float:right ist das ganze Einfach seitenverkehrt.
Der Trick ist jetzt, das du mehrere Elemente hintereinander mit float:left platzieren kannst du die sich hintereinander von links nach rechts anreihen. Im Prinzip wie der Text. Und wenn sie sich in einer "Zeile" nicht ausgehen, rutschen sie in die naechste.
Chart 2
<div>
<div style="float: left; width: 33%;">
bin das erste float:left
</div>
<div style="float: left; width: 33%;">
bin das zweite float:left
</div>
text ausserhalb umfliesst das DIV ganz normal
</div>
+---irgendein container DIV--------------------------------+
| +-DIV float: left-++---DIV float:left-+ text ausserhalb |
| |bin das erste ||bin das zweite | umfliesst die |
| |float:left ||float: left | floats ganz |
| +-----------------++------------------+ normal wie jeder |
| andere Text |
+----------------------------------------------------------+
Hast du keinen Text ausserhalb der floats und du gibst beiden z.B. eine Breite von 50% dann hast du genau das was du wolltest:
Chart 3
<div>
<div style="float: left; width: 50%;">
bin das erste float:left
</div>
<div style="float: left; width: 50%;">
bin das zweite float:left
</div>
</div>
+---irgendein container DIV-------------+
|+-DIV float: left-++---DIV float:left-+|
||bin das erste ||bin das zweite ||
||float:left ||float: left ||
|+-----------------++------------------+|
+---------------------------------------+
Wenn du keinen margin/border/padding hast und somit die Hilfslinien vom ASCII Chart wegfallen geht sich das mit zweimal 50% aus. Hast du allerdings mind. eines dieser Attribute musst du eben mit Geschick ein paar Prozent weniger nehmen da "width" ja nur die Breite des Content in der Box angibt. Aber auch zweimal 50% fuehrt bei manchen Browser wegen Rundungsfehlern zu Problemen, dann muss man eben auc 49% ausweichen, ist im Prinzip eh vernachlaessigbar.
Wenn wir das umfliessende Textbeispiel von oben nochmal nehmen, gibt es natuerlich auch eine Moeglichkeit den Text NACH den Floats komplett zu platzieren mit dem "clear" property. Das "clear" Property gibt an, auf welcher Seite der Fluss der floats unterbrochen werden soll. Die Werte sind "left", "right" und "both" ("none" natuerlich auch).
Chart 4
<div>
<div style="float: left; width: 33%;">
bin das erste float:left
</div>
<div style="float: left; width: 33%;">
bin das zweite float:left
</div>
<br style="clear: left;">
Text wird durch clear:left unterhalb der floats gesetzt.
</div>
+---irgendein container DIV--------------------------------+
| +-DIV float: left-++---DIV float:left-+ |
| |bin das erste ||bin das zweite | |
| |float:left ||float: left | |
| +-----------------++------------------+ |
| Text wird durch clear:left unterhalb der floats gesetzt. |
+----------------------------------------------------------+
Floats sind das A&O der Positionierung mit CSS.
Ein sehr wichtiger Punkt ist aber noch folgender: floats selbst werden aus dem Document-Flow ausgehebelt und verbrauchen keinen echten Platz im Container-Element. Somit ist das Beispiel von Chart4 auch falsch gezeichnet. Die Hoehe des Container DIVs in dem die zwei floats platziert sind ist in wirklich die Hoehe 0 ! Und man muesste es eigentlich so zeichnen:
Chart 5
<div>
<div style="float: left; width: 50%;">
bin das erste float:left
</div>
<div style="float: left; width: 50%;">
bin das zweite float:left
</div>
</div>
+---irgendein container DIV-------------+
++-DIV float: left-++---DIV float:left-++
|bin das erste ||bin das zweite |
|float:left ||float: left |
+-----------------++------------------+
Warum ist das wichtig? Hat man im Container DIV z.B. eine background-color und die DIVs keine (d.h. sie scheint durch) wurde diese aber nicht unterhalb der beiden float DIVs zu sehen sein!
Der Trick hier ist, auch wenn kein Text ausserhalb der floats vorhanden ist, einen Bruch mit clear zu erzeugen wodurch der Content dann "aufgebraucht" (consumed) wird.
Chart 6
<div>
<div style="float: left; width: 50%;">
bin das erste float:left
</div>
<div style="float: left; width: 50%;">
bin das zweite float:left
</div>
<br style="clear: left;">
</div>
+---irgendein container DIV-------------+
|+-DIV float: left-++---DIV float:left-+|
||bin das erste ||bin das zweite ||
||float:left ||float: left ||
|+-----------------++------------------+|
+---------------------------------------+
Statt BR kann man natuerlich auch einfach wieder ein DIV nehmen.
float:left und float:right kann man wild mischen wie man will. Das ist wichtig, den hier entkopplen wir auf einmal Content von Layout da, vier hintereinanderfolgende DIVs im Mark-Up nicht mehr notwendigerweise in dieser Reihenfolge untereinander sind. Ich kann eines mit float:left nach links schicken, das zweite mit float:right auf die rechte Seite und das naechste wieder nach links und das uebernaechste wieder nach rechts.
Das alles waere zu schoen wenn es nicht den IE geben wuerde. Der hat seit der Version 6 einen ziemlich argen Bug mit floats der unter "IE6 Peekaboo Bug" bekannt ist [3]. Schau dir dazu die Seite mit IE6 an und du wirst sehen wie boeser der Bug wirklich ist. Zum Glueck gibst abhilfe die (sogutwie) immer funktioniert.
Nun das ganze auf dein CSS gemappt.
Vorerst, ich versteh nicht ganz warum du position: relative; drin hast und overflow: hidden; aber vermutlich waren das deine Versuche die Boxen zu positionieren.
Hier kurz die Erklaerung was die zwei Properties machen; sind auch ziemlich praktisch:
- position: relative
Sobald ein Element gelayoutet wurde kannst du mit hilfe von position:relative sagen, dieses Element wird jetzt RELATIV zu seiner gelayouteten (sp?) Position verschoben. Wie verschoben? Ganz einfach mit top/left/bottom/right angaben, wie bei der absoluten Positinierung. Damit kannst du angeben mit right: 15px verschiebe das Element 15 pixel nach rechts. Kann nuetzlich sein.
Siehe auch [4]
- overflow
Mit dem overflow Property gibst du an, was mit den Inhalt eines Elements (ich geh hier von Block Elementen aus wie DIV) passieren soll wenn sein Inhalt mehr Platz braucht als das Element zur Verfuegung stellt. Normalerweise dehnt sich ein DIV ja von selbst aus. Es nimmt den ganzen Breite ein und waechste in der Hoehe soviel Inhalt eben vorhanden ist. Wenn du dem DIV aber eine fixe Hoehe gibst (height:300px z.B.) dann kannst du mit overflow angeben was passieren soll wenn der Inhalt aber ueber die 300px hinausschiesst. Z.b. soll der Inhalt einfach abgeschnitten werden wenn er sich nicht ausgeht (overflow:hidden) oder soll er einfach ueber die Box hinaus gezeichnet weden (overflow:visible , Standardeinstellung) oder der grafische Client soll eine Scrollbar zur Verfuegung stellen damit der Benutzer den restlchen Content erreicht (overflow:scroll). Dies schaut dann aus wie wenn z.B. ein IFRAME in einer Seite eingebettet waere, ist aber nur ein DIV. Specs dazu unter [5] . PKK hat dazu eine schoene Seite zum Testen wie sich die Clients verhalten gemacht [6].
Dein CSS abgewandelt wuerde dann so aussehen:
desc-detail-left {
float: left;
width: 45%;
background: #E9ECEC;
border-width: 2px;
border-style: dashed;
border-color: #666;
}
.desc-detail-right {
float: left;
width: 45%;
background: #E9ECEC;
border-width: 2px;
border-style: dashed;
border-color: #666;
}
Eventuell wird es noetig sein nach den floats einen Umbruch zu machen:
.desc-detail-umbruch {
clear: left;
}
[1]
http://www.w3.org/TR/CSS21/visuren.html#propdef-float[2]
http://www.w3.org/TR/CSS21/visuren.html#propdef-clear[3]
http://www.positioniseverything.net...r/peekaboo.html[4]
http://www.w3.org/TR/CSS21/visuren.html#x37[5]
http://www.w3.org/TR/CSS21/visufx.html#propdef-overflow[6]
http://www.xs4all.nl/~ppk/css2tests/overflow.html