====== CSS Floating und Positionierung ======
Diese Dokumentation erklärt das Verhalten von Elementen im normalen Textfluss (Normal Flow) sowie Techniken zur Steuerung des Layouts mittels Floating, Clearing, CSS Shapes und verschiedenen Positionierungsarten[cite: 10].
===== 1. Der normale Textfluss (Normal Flow) =====
Im normalen Fluss ordnet der Browser Elemente standardmäßig von oben nach unten (in der Reihenfolge des HTML-Quelltexts) und von links nach rechts an[cite: 10]:
* **Block-Elemente:** Beginnen stets auf einer neuen Zeile und füllen die gesamte verfügbare Breite des Elterncontainers aus[cite: 10].
* **Inline-Elemente:** Fließen innerhalb des Textes und brechen je nach verfügbarer Breite automatisch um[cite: 10].
===== 2. Floating (Schwebende Elemente) =====
Die Eigenschaft ''float'' nimmt ein Element aus dem normalen vertikalen Fluss und verschiebt es so weit wie möglich nach links oder rechts[cite: 10]. Nachfolgender Inhalt fließt um das geschwebte Element herum[cite: 10].
==== Eigenschaften & Werte ====
* ''float: left;'' — Verschiebt das Element nach links[cite: 10].
* ''float: right;'' — Verschiebt das Element nach rechts[cite: 10].
* ''float: none;'' — Deaktiviert das Floating (Standard)[cite: 10].
img.hero {
float: right;
margin-left: 1em;
}
==== Wichtige Verhaltensregeln beim Floating ====
* **Fluss-Ablauf:** Geschwebte Elemente werden aus dem normalen Layout-Fluss herausgenommen, beeinflussen aber weiterhin den Textfluss um sie herum[cite: 10].
* **Container-Grenzen:** Geschwebte Elemente bleiben innerhalb des Inhaltsbereichs ihres Eltern-Elements[cite: 10].
* **Keine Margin-Kollision:** Im Gegensatz zum normalen Fluss kollabieren (kollidieren) Margins bei geschwebten Elementen auf keiner Seite[cite: 10].
* **Breitenangabe für Text:** Bei geschwebten Textelementen **muss** eine explizite Breite (''width'') angegeben werden, da die Standardbreite sonst auf ''auto'' steht[cite: 10].
* **Vertikale Grenze:** Elemente schweben niemals höher als die Stelle, an der sie im HTML-Quelltext definiert sind[cite: 10].
* **Mehrere Elemente:** Werden mehrere Elemente nacheinander geschwebt, reihen sie sich nebeneinander ein[cite: 10]. Reicht der Platz nicht aus, rückt das nächste Element nach unten und schiebt sich so weit wie möglich zur entsprechenden Seite[cite: 10].
===== 3. Clearing (Freistellen von geschwebten Elementen) =====
Die Eigenschaft ''clear'' verhindert, dass ein Element neben einem geschwebten Element steht, und zwingt es unterhalb des geschwebten Bereichs zu beginnen[cite: 10].
==== Eigenschaften & Werte ====
* ''clear: left;'' — Platziert das Element unterhalb von links-geschwebten Elementen[cite: 10].
* ''clear: right;'' — Platziert das Element unterhalb von rechts-geschwebten Elementen[cite: 10].
* ''clear: both;'' — Umgeht geschwebte Elemente auf beiden Seiten[cite: 10].
* ''clear: none;'' — Erlaubt das Umfließen von beiden Seiten (Standard)[cite: 10].
/* Beispiel: h2 wird unter das gefloatete Bild gezwungen */
img.portrait {
float: left;
margin-right: 0.5em;
}
h2 {
clear: left;
margin-top: 2em;
}
===== 4. Textumbruchformen mit CSS Shapes =====
Mit CSS Shapes lässt sich die geometrische Form anpassen, entlang derer fließender Text ein geschwebtes Element umströmt[cite: 10].
==== shape-outside ====
Legt die Abrollkante für den umfließenden Text fest[cite: 10].
* **Mögliche Werte:** ''none'', ''circle()'', ''ellipse()'', ''polygon()'', ''url()'' (nutzt Transparenzen eines Bildes) sowie Box-Modell-Grenzen (''margin-box'', ''padding-box'', ''content-box'')[cite: 10].
==== shape-margin ====
Definiert den Mindestabstand zwischen der definierten Form und dem umgebenden Text (z. B. in ''px'' oder ''em'')[cite: 10].
/* Kreisförmiger Umfluss */
img.circle-wrap {
float: left;
shape-outside: circle(200px);
}
/* Umfluss basierend auf Pfadkoordinaten */
img.custom-shape {
float: left;
shape-outside: polygon(0px 0px, 186px 0px, 225px 34px, 0px 300px);
shape-margin: 10px;
}
===== 5. Positionierungsarten (position) =====
Die Eigenschaft ''position'' bestimmt das Positionierungsmodell eines Elements[cite: 10]. In Kombination mit den Offset-Eigenschaften ''top'', ''right'', ''bottom'' und ''left'' wird die genaue Lage festgelegt[cite: 10].
==== Übersicht der Werte ====
* **static:** Standardposition im normalen Textfluss[cite: 10]. Versatz-Eigenschaften (''top'', ''left'' etc.) haben keine Wirkung[cite: 10].
* **relative:** Verschiebt das Element relativ zu seiner ursprünglichen Position im Textfluss[cite: 10]. Der ursprünglich eingenommene Platz im Layout bleibt reserviert[cite: 10].
* **absolute:** Entfernt das Element vollständig aus dem Textfluss[cite: 10]. Der ursprüngliche Platz schließt sich[cite: 10]. Platziert das Element relativ zum nächsten positionierten Eltern-Container (Containing Block)[cite: 10].
* **fixed:** Entfernt das Element aus dem Fluss und fixiert es relativ zum Bildschirmfenster (Viewport)[cite: 10]. Es behält beim Scrollen seine Position bei[cite: 10].
* **sticky:** Eine Mischung aus ''relative'' und ''fixed''[cite: 10]. Das Element verhält sich zunächst normal im Fluss, "klebt" aber an einer definierten Position am Viewport, sobald die entsprechende Scroll-Grenze erreicht wird[cite: 10].
==== Beispiele für Versatz & Containing Blocks ====
/* Relative Positionierung */
em.highlight {
position: relative;
top: 2em; /* Verschiebt das Element nach UNTEN */
left: 3em; /* Verschiebt das Element nach RECHTS */
}
/* Absolute Positionierung in einem Bezugscontainer */
div.parent-box {
position: relative; /* Dient nun als Bezugspunkt (Containing Block) */
padding: 15px;
}
div.parent-box span.badge {
position: absolute;
top: 10px;
right: 10px;
}
**Hinweis zu Versatz-Eigenschaften:** Versatz-Werte geben an, wie weit ein Element **von der jeweiligen Kante weg** geschoben wird (z. B. schiebt ''top: 200px;'' das Element von oben nach unten)[cite: 10]. Zwei Versatz-Angaben (z. B. ''top'' und ''left'') sind in der Regel ausreichend[cite: 10].
===== 6. Stapelreihenfolge (z-index) =====
Wenn sich positionierte Elemente überlappen, steuert ''z-index'' die Darstellung auf der Z-Achse (Vorne/Hinten)[cite: 10].
* Standardmäßig liegen im HTML-Code weiter hinten stehende Elemente über früheren Elementen[cite: 10].
* Höhere Zahlenwerte für ''z-index'' verdecken Elemente mit niedrigeren Werten[cite: 10].
* Funktioniert nur bei Elementen mit einer ''position'' ungleich ''static''[cite: 10].
.box-back {
position: absolute;
z-index: 1;
}
.box-front {
position: absolute;
z-index: 100; /* Liegt im Vordergrund */
}