====== 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 */ }