Positionierung
Die Positionierung ermöglicht es, Elemente aus dem normalen Dokumentenfluss zu entfernen und sie anders verhalten zu lassen, z. B. übereinander zu sitzen oder immer an derselben Stelle im Browser-Viewport zu bleiben. Dieser Artikel erklärt die verschiedenen position
-Werte und wie man sie verwendet.
Voraussetzungen: | Inhalte mit HTML strukturieren, CSS-Styling-Grundlagen, Grundlegende Text- und Schriftgestaltung, Vertrautheit mit Grundlagen der CSS-Layout-Konzepte. |
---|---|
Lernziele: |
|
Wir möchten, dass Sie die folgenden Übungen auf Ihrem lokalen Computer durchführen. Holen Sie sich, wenn möglich, eine Kopie von 0_basic-flow.html
aus unserem GitHub-Repository (Quellcode hier) und verwenden Sie diese als Ausgangspunkt.
Einführung in die Positionierung
Positionierung ermöglicht es uns, interessante Ergebnisse zu erzielen, indem der normale Dokumentenfluss überschrieben wird. Was ist, wenn Sie die Position einiger Boxen leicht von ihrer Standardflussposition ändern möchten, um ein leicht eigenartiges, unregelmäßiges Erscheinungsbild zu erzielen? Die Positionierung ist Ihr Werkzeug. Oder was ist, wenn Sie ein UI-Element erstellen möchten, das über anderen Teilen der Seite schwebt und/oder immer an derselben Stelle im Browserfenster sitzt, egal wie stark die Seite nach unten gescrollt wird? Solche Layout-Arbeiten sind mit der Positionierung möglich.
Es gibt verschiedene Arten der Positionierung, die Sie auf HTML-Elemente anwenden können. Um eine bestimmte Art der Positionierung auf ein Element anzuwenden, verwenden wir die position
-Eigenschaft.
Statische Positionierung
Statische Positionierung ist die Standardeinstellung, die jedes Element erhält. Es bedeutet einfach: „Setzen Sie das Element an seine Standardposition im normalen Fluss – nichts Besonderes zu sehen.“
Um dies zu sehen (und Ihr Beispiel für zukünftige Abschnitte einzurichten), fügen Sie zunächst eine class
von positioned
zum zweiten <p>
in Ihrem HTML hinzu:
<p class="positioned">…</p>
Fügen Sie nun die folgende Regel am Ende Ihres CSS hinzu:
.positioned {
position: static;
background: yellow;
}
Wenn Sie speichern und aktualisieren, sehen Sie überhaupt keinen Unterschied, außer der aktualisierten Hintergrundfarbe des zweiten Absatzes. Das ist in Ordnung — wie wir zuvor gesagt haben, ist die statische Positionierung das Standardverhalten!
Hinweis:
Sie können das Beispiel an diesem Punkt live unter 1_static-positioning.html
ansehen (Quellcode anzeigen).
Relative Positionierung
Die relative Positionierung ist die erste Art der Positionierung, die wir uns ansehen. Dies ist der statischen Positionierung sehr ähnlich, außer dass Sie die endgültige Position des positionierten Elements ändern können, sobald es seinen Platz im normalen Fluss eingenommen hat, einschließlich der Möglichkeit, es mit anderen Elementen auf der Seite zu überlappen. Aktualisieren Sie die position
-Deklaration in Ihrem Code:
position: relative;
Wenn Sie speichern und aktualisieren, sehen Sie zunächst keine Änderung am Ergebnis. Wie ändern Sie also die Position des Elements? Sie müssen die Eigenschaften top
, bottom
, left
und right
verwenden, die wir im nächsten Abschnitt erklären werden.
Einführung in top, bottom, left und right
top
, bottom
, left
und right
werden zusammen mit position
verwendet, um genau anzugeben, wohin das positionierte Element bewegt werden soll. Um dies auszuprobieren, fügen Sie die folgenden Deklarationen zur .positioned
-Regel in Ihrem CSS hinzu:
top: 30px;
left: 30px;
Hinweis: Die Werte dieser Eigenschaften können jede Einheit annehmen, die Sie vernünftigerweise erwarten können: Pixel, mm, rem, %, usw.
Wenn Sie jetzt speichern und aktualisieren, erhalten Sie ein Ergebnis wie dieses:
Cool, oder? Ok, das war wahrscheinlich nicht, was Sie erwartet haben. Warum hat es nach unten und rechts verschoben, obwohl wir top und left angegeben haben? Dies mag kontraintuitiv erscheinen. Sie müssen sich dies so vorstellen, als gäbe es eine unsichtbare Kraft, die die angegebene Seite der positionierten Box drückt, wodurch sie sich in die entgegengesetzte Richtung bewegt. Wenn Sie also beispielsweise top: 30px;
angeben, wird die Oberseite der Box durch eine Kraft nach unten um 30px gedrückt.
Hinweis:
Sie können das Beispiel an diesem Punkt live unter 2_relative-positioning.html
ansehen (Quellcode anzeigen).
Absolute Positionierung
Absolute Positionierung bringt sehr unterschiedliche Ergebnisse.
Einstellung von position: absolute
Versuchen wir, die Positionsdeklaration in Ihrem Code wie folgt zu ändern:
position: absolute;
Wenn Sie jetzt speichern und aktualisieren, sollten Sie etwas wie folgt sehen:
Beachten Sie zuerst, dass die Lücke, in der sich das positionierte Element im Dokumentenfluss befinden sollte, nicht mehr vorhanden ist — das erste und das dritte Element sind zusammengeschoben, als ob es nicht mehr existiert! In gewisser Weise ist dies wahr. Ein absolut positioniertes Element existiert nicht mehr im normalen Dokumentenfluss. Stattdessen befindet es sich auf einer eigenen Ebene, getrennt von allem anderen. Das ist sehr nützlich: Es bedeutet, dass wir isolierte UI-Funktionen erstellen können, die das Layout anderer Elemente auf der Seite nicht beeinträchtigen. Zum Beispiel Popup-Informationsboxen, Steuermenüs, Rollover-Panels, UI-Funktionen, die überall auf der Seite hin und her verschoben werden können, und so weiter.
Zweitens hat sich die Position des Elements geändert. Dies liegt daran, dass top
, bottom
, left
und right
bei absoluter Positionierung anders funktionieren. Anstatt das Element basierend auf seiner relativen Position innerhalb des normalen Dokumentenflusses zu positionieren, geben sie den Abstand an, den das Element von jeder Seite des enthaltenden Elements haben soll. In diesem Fall geben wir an, dass das absolut positionierte Element 30px vom oberen Rand des enthaltenden Elements (in diesem Fall der initiale enthaltende Block, siehe unten) und 30px vom linken Rand entfernt sitzen soll.
Hinweis:
Sie können top
, bottom
, left
und right
verwenden, um Elemente bei Bedarf zu dimensionieren. Versuchen Sie, top: 0; bottom: 0; left: 0; right: 0;
und margin: 0;
auf Ihre positionierten Elemente anzuwenden und sehen Sie, was passiert! Setzen Sie es danach wieder zurück …
Hinweis: Ja, Margins wirken sich noch immer auf positionierte Elemente aus. Margin Collapsing jedoch nicht.
Hinweis:
Sie können das Beispiel an diesem Punkt live unter 3_absolute-positioning.html
ansehen (Quellcode anzeigen).
Positionierungskontexte
Welches Element ist das "enthaltende Element" eines absolut positionierten Elements? Dies hängt stark vom position
-Eigenschaftswert der Vorfahren des positionierten Elements ab.
Wenn keine Vorfahren-Elemente ihre Positions-Eigenschaft explizit definiert haben, haben standardmäßig alle Vorfahren-Elemente eine statische Position. Das Ergebnis ist, dass das absolut positionierte Element im initialen enthaltenden Block enthalten sein wird. Der initiale enthaltende Block hat die Dimensionen des Viewports und ist auch der Block, der das <html>
-Element enthält. Mit anderen Worten, das absolut positionierte Element wird außerhalb des <html>
-Elements angezeigt und relativ zum initialen Viewport positioniert.
Das positionierte Element ist im HTML-Quellcode innerhalb des <body>
verschachtelt, wird jedoch im endgültigen Layout 30px von den oberen und linken Rändern der Seite entfernt positioniert. Wir können den Positionierungskontext ändern, d.h. welches Element das absolut positionierte Element relativ positioniert. Dies erfolgt durch das Setzen der Positionierung auf eines der Vorfahren-Elemente: zu einem der Elemente, in die es verschachtelt ist (es kann nicht relativ zu einem Element positioniert werden, in das es nicht verschachtelt ist). Um dies zu sehen, fügen Sie die folgende Deklaration zur Regel Ihres body
hinzu:
position: relative;
Dies sollte folgendes Ergebnis bringen:
Das positionierte Element sitzt nun relativ zum <body>
-Element.
Hinweis:
Sie können das Beispiel an diesem Punkt live unter 4_positioning-context.html
ansehen (Quellcode anzeigen).
Einführung in z-index
All diese absolute Positionierung macht Spaß, aber es gibt eine weitere Funktion, die wir noch nicht berücksichtigt haben. Wenn Elemente beginnen, sich zu überlappen, was bestimmt dann, welche Elemente über anderen erscheinen und welche unter anderen? In dem Beispiel, das wir bisher gesehen haben, gibt es nur ein positioniertes Element im Positionierungskontext, und es erscheint oben, da positionierte Elemente gegenüber nicht positionierten Elementen bevorzugt werden. Was passiert, wenn es mehr als eins gibt?
Versuchen Sie, Ihrem CSS Folgendes hinzuzufügen, um den ersten Absatz ebenfalls absolut zu positionieren:
p:nth-of-type(1) {
position: absolute;
background: lime;
top: 10px;
right: 30px;
}
An diesem Punkt werden Sie sehen, wie der erste Absatz limonengrün eingefärbt wurde, aus dem Dokumentenfluss entfernt wurde und etwas über dem ursprünglichen Ort positioniert wurde. Es wird jedoch auch unter dem ursprünglichen .positioned
-Absatz platziert, wo sich die beiden überlappen. Dies liegt daran, dass der .positioned
-Absatz der zweite Absatz in der Quellreihenfolge ist, und positionierte Elemente, die später in der Quellreihenfolge auftreten, bevorzugt werden.
Können Sie die Stapelreihenfolge ändern? Ja, das können Sie, indem Sie die z-index
-Eigenschaft verwenden. „z-index“ ist ein Verweis auf die z-Achse. Sie erinnern sich vielleicht an frühere Punkte im Kurs, an denen wir besprachen, dass Webseiten horizontale (x-Achse) und vertikale (y-Achse) Koordinaten verwenden, um die Positionierung für Dinge wie Hintergrundbilder und Drop-Shadow-Versätze zu berechnen. Für Sprachen, die von links nach rechts laufen, liegt (0,0) oben links auf der Seite (oder dem Element), und die x- und y-Achsen laufen nach rechts und unten durch die Seite.
Webseiten haben auch eine z-Achse: eine imaginäre Linie, die von der Oberfläche Ihres Bildschirms auf Ihr Gesicht (oder etwas anderes vor dem Bildschirm) zuläuft. z-index
-Werte beeinflussen, wo positionierte Elemente auf dieser Achse sitzen; positive Werte bewegen sie weiter nach oben im Stapel, negative Werte weiter nach unten. Standardmäßig haben alle positionierten Elemente einen z-index
von auto
, was effektiv 0 ist.
Um die Stapelreihenfolge zu ändern, versuchen Sie, der Regel p:nth-of-type(1)
die folgende Deklaration hinzuzufügen:
z-index: 1;
Sie sollten nun sehen, dass der limonengrüne Absatz oben ist:
Beachten Sie, dass z-index
nur indexierte Werte ohne Einheit akzeptiert; Sie können nicht angeben, dass ein Element 23 Pixel auf der Z-Achse nach oben verschoben werden soll — so funktioniert das nicht. Höhere Werte gehen über niedrigere Werte, und es liegt an Ihnen, welche Werte Sie verwenden. Werte von 2 oder 3 würden denselben Effekt wie Werte von 300 oder 40000 erzielen.
Hinweis:
Sie können ein Beispiel hierzu live unter 5_z-index.html
ansehen (Quellcode anzeigen).
Fixe Positionierung
Schauen wir uns nun die fixe Positionierung an. Diese funktioniert auf genau dieselbe Weise wie die absolute Positionierung, mit einem entscheidenden Unterschied: Während absolute Positionierung ein Element relativ zum nächstgelegenen positionierten Vorfahren (dem initialen enthaltenden Block, wenn keiner vorhanden ist) fixiert, fixiert fixe Positionierung ein Element relativ zum sichtbaren Bereich des Viewports. Das bedeutet, dass Sie nützliche UI-Elemente erstellen können, die fixiert bleiben, wie z. B. stets sichtbare Navigationsmenüs, unabhängig davon, wie stark die Seite gescrollt wird.
Erstellen wir ein einfaches Beispiel, um zu zeigen, was wir meinen. Entfernen Sie zunächst die vorhandenen Regeln p:nth-of-type(1)
und .positioned
aus Ihrem CSS.
Aktualisieren Sie nun die Regel für body
, um die Deklaration position: relative;
zu entfernen und eine feste Höhe hinzuzufügen, wie folgt:
body {
width: 500px;
height: 1400px;
margin: 0 auto;
}
Nun werden wir das <h1>-Element auf position: fixed;
setzen und es oben im Viewport fixieren. Fügen Sie die folgende Regel zu Ihrem CSS hinzu:
h1 {
position: fixed;
top: 0;
width: 500px;
margin-top: 0;
background: white;
padding: 10px;
}
Das top: 0;
ist notwendig, um es am oberen Rand des Bildschirms zu fixieren. Wir geben der Überschrift dieselbe Breite wie der Inhaltskolumne sowie einen weißen Hintergrund und einige Padding- und Margin-Werte, sodass der Inhalt nicht darunter sichtbar wird.
Wenn Sie speichern und aktualisieren, sehen Sie einen kleinen Effekt, bei dem die Überschrift fixiert bleibt — der Inhalt scheint hochzuscrollen und darunter zu verschwinden. Beachten Sie jedoch, wie ein Teil des Inhalts zunächst unter der Überschrift abgeschnitten ist. Dies liegt daran, dass die positionierte Überschrift nicht mehr im Dokumentenfluss erscheint, sodass der Rest des Inhalts nach oben verschoben wird. Wir könnten dies verbessern, indem wir die Absätze alle etwas nach unten verschieben. Dies können wir tun, indem wir einen oberen Rand für den ersten Absatz setzen. Fügen Sie dies nun hinzu:
p:nth-of-type(1) {
margin-top: 60px;
}
Sie sollten nun das fertige Beispiel sehen:
Hinweis:
Sie können ein Beispiel hierfür live unter 6_fixed-positioning.html
ansehen (Quellcode anzeigen).
Sticky Positionierung
Es gibt einen weiteren Wert für die Positionierung namens position: sticky
, der etwas neuer als die anderen ist. Dies ist im Grunde eine Kombination aus relativer und fixer Positionierung. Es erlaubt einem positionierten Element, sich wie ein relativ positioniertes Element zu verhalten, bis es an einen bestimmten Schwellenwert gescrollt wird (z. B. 10px vom oberen Rand des Viewports), wonach es fixiert wird.
Einfaches Beispiel
Sticky-Positionierung kann beispielsweise verwendet werden, um eine Navigationsleiste zu erstellen, die mit der Seite scrollt, bis zu einem bestimmten Punkt, und dann am oberen Rand der Seite fixiert bleibt.
.positioned {
position: sticky;
top: 30px;
left: 30px;
}
Scroll-Index
Ein interessanter und häufiger Anwendungsfall für position: sticky
ist die Erstellung einer Scroll-Index-Seite, bei der verschiedene Überschriften am oberen Rand der Seite haften, wenn sie ihn erreichen. Das Markup für ein solches Beispiel könnte folgendermaßen aussehen:
<h1>Sticky positioning</h1>
<dl>
<dt>A</dt>
<dd>Apple</dd>
<dd>Ant</dd>
<dd>Altimeter</dd>
<dd>Airplane</dd>
<dt>B</dt>
<dd>Bird</dd>
<dd>Buzzard</dd>
<dd>Bee</dd>
<dd>Banana</dd>
<dd>Beanstalk</dd>
<dt>C</dt>
<dd>Calculator</dd>
<dd>Cane</dd>
<dd>Camera</dd>
<dd>Camel</dd>
<dt>D</dt>
<dd>Duck</dd>
<dd>Dime</dd>
<dd>Dipstick</dd>
<dd>Drone</dd>
<dt>E</dt>
<dd>Egg</dd>
<dd>Elephant</dd>
<dd>Egret</dd>
</dl>
Das CSS könnte wie folgt aussehen. Im normalen Fluss scrollen die <dt>
-Elemente mit dem Inhalt. Wenn wir position: sticky
zum <dt>
-Element hinzufügen, zusammen mit einem top
-Wert von 0, haften die Überschriften in unterstützenden Browsern am oberen Rand des Viewports, sobald sie diese Position erreichen. Jede nachfolgende Überschrift ersetzt dann die vorherige, wenn sie an diese Position scrollt.
dt {
background-color: black;
color: white;
padding: 10px;
position: sticky;
top: 0;
left: 0;
margin: 1em 0;
}
Sticky-Elemente sind "klebrig" relativ zu dem nächstgelegenen Vorfahren mit einem "Scrolling-Mechanismus", der durch die overflow-Eigenschaft seiner Vorfahren bestimmt wird.
Hinweis:
Dieses Beispiel kann live unter 7_sticky-positioning.html
angezeigt werden (Quellcode anzeigen).
Testen Sie Ihr Wissen!
Sie haben das Ende dieses Artikels erreicht, aber können Sie sich an die wichtigsten Informationen erinnern? Sie finden einige zusätzliche Tests, um zu prüfen, ob Sie diese Informationen behalten haben, bevor Sie weitermachen — siehe Testen Sie Ihr Wissen: Positionierung.
Zusammenfassung
Ich bin sicher, Sie hatten Spaß daran, mit grundlegender Positionierung zu experimentieren. Obwohl es keine ideale Methode für komplette Layouts ist, gibt es viele spezifische Zwecke, für die sie geeignet ist. Als Nächstes werden wir uns mit Flexbox befassen.
Siehe auch
- Die
position
-Eigenschaftsreferenz. - Praktische Positionierungsbeispiele für einige weitere nützliche Ideen.