Die akzeptierte Lösung funktioniert hervorragend, aber IMO fehlt eine Erklärung, warum sie funktioniert. Das folgende Beispiel beschränkt sich auf die Grundlagen und trennt das wichtige CSS vom nicht relevanten Styling-CSS. Als Bonus habe ich auch eine detaillierte Erklärung zur Funktionsweise der CSS-Positionierung beigefügt.
TLDR; Wenn Sie nur den Code möchten, scrollen Sie nach unten zu The Result .
Das Problem
Es gibt zwei separate Geschwisterelemente, und das Ziel besteht darin, das zweite Element (mit einem id
von infoi
) so zu positionieren , dass es im vorherigen Element (dem mit einem class
von navi
) erscheint. Die HTML-Struktur kann nicht geändert werden.
Vorgeschlagene Lösung
Um das gewünschte Ergebnis zu erzielen, verschieben oder positionieren wir das zweite Element, das wir aufrufen, #infoi
so, dass es im ersten Element angezeigt wird, das wir aufrufen .navi
. Insbesondere möchten wir #infoi
in der oberen rechten Ecke von positioniert werden .navi
.
CSS-Position Erforderliche Kenntnisse
CSS verfügt über mehrere Eigenschaften zum Positionieren von Elementen. Standardmäßig sind alle Elemente position: static
. Dies bedeutet, dass das Element mit wenigen Ausnahmen gemäß seiner Reihenfolge in der HTML-Struktur positioniert wird.
Die anderen position
Werte sind relative
, absolute
, sticky
, und fixed
. Durch Setzen eines Elements position
auf einen dieser anderen Werte ist es jetzt möglich, eine Kombination der folgenden vier Eigenschaften zum Positionieren des Elements zu verwenden:
Mit anderen Worten, durch Festlegen position: absolute
können wir hinzufügen, top: 100px
um das Element 100 Pixel vom oberen Rand der Seite zu positionieren. Wenn wir umgekehrt festlegen, wird bottom: 100px
das Element 100 Pixel vom unteren Rand der Seite entfernt positioniert.
Hier gehen viele CSS-Neulinge verloren - sieposition: absolute
haben einen Referenzrahmen. Im obigen Beispiel ist der Referenzrahmen dasbody
Element. position: absolute
mittop: 100px
bedeutet, dass das Element 100 Pixel vom oberen Rand desbody
Elements entfernt ist.
Der Positionsreferenzrahmen oder der Positionskontext kann geändert werden, indem das position
eines übergeordneten Elements auf einen anderen Wert als gesetzt wirdposition: static
. Das heißt, wir können einen neuen Positionskontext erstellen, indem wir ein übergeordnetes Element angeben:
position: relative;
position: absolute;
position: sticky;
position: fixed;
Wenn beispielsweise ein <div class="parent">
Element angegeben wird position: relative
, verwenden alle untergeordneten Elemente das <div class="parent">
als Positionskontext. Wenn ein Kind Element gegeben wurden position: absolute
und top: 100px
würde das Element 100 Pixel vom oberen Rand des positioniert sein <div class="parent">
Element, weil die <div class="parent">
jetzt die Position Kontext ist.
Der andere zu beachtende Faktor ist die Stapelreihenfolge - oder wie Elemente in z-Richtung gestapelt werden. Das Muss hier ist, dass die Stapelreihenfolge von Elementen standardmäßig durch die Umkehrung ihrer Reihenfolge in der HTML-Struktur definiert wird. Betrachten Sie das folgende Beispiel:
<body>
<div>Bottom</div>
<div>Top</div>
</body>
Wenn in diesem Beispiel die beiden <div>
Elemente an derselben Stelle auf der Seite positioniert <div>Top</div>
wären , würde das <div>Bottom</div>
Element das Element abdecken . Da <div>Top</div>
kommt <div>Bottom</div>
in der HTML-Struktur nach, hat es eine höhere Stapelreihenfolge.
div {
position: absolute;
width: 50%;
height: 50%;
}
#bottom {
top: 0;
left: 0;
background-color: blue;
}
#top {
top: 25%;
left: 25%;
background-color: red;
}
<div id="bottom">Bottom</div>
<div id="top">Top</div>
Die Stapelreihenfolge kann mit CSS über die Eigenschaften z-index
oder geändert order
werden.
Wir können die Stapelreihenfolge in dieser Ausgabe ignorieren, da die natürliche HTML-Struktur der Elemente bedeutet, dass das Element, auf dem wir erscheinen möchten, top
nach dem anderen Element kommt.
Zurück zum eigentlichen Problem: Wir werden den Positionskontext verwenden, um dieses Problem zu lösen.
Die Lösung
Wie oben erwähnt, ist es unser Ziel, das #infoi
Element so zu positionieren , dass es innerhalb des .navi
Elements erscheint. Dazu werden die Elemente .navi
und #infoi
in ein neues Element eingeschlossen, <div class="wrapper">
damit wir einen neuen Positionskontext erstellen können.
<div class="wrapper">
<div class="navi"></div>
<div id="infoi"></div>
</div>
Dann erstellen Sie eine neue Position Kontext , indem sie .wrapper
ein position: relative
.
.wrapper {
position: relative;
}
Mit diesem neuen Positionskontext können wir #infoi
innerhalb positionieren .wrapper
. Geben Sie zunächst #infoi
ein position: absolute
, damit wir uns #infoi
absolut positionieren können .wrapper
.
Fügen Sie dann das Element hinzu top: 0
und right: 0
positionieren Sie es #infoi
in der oberen rechten Ecke. Denken Sie daran, dass sich das #infoi
Element .wrapper
oben rechts im Element befindet , da es als Positionskontext verwendet wird .wrapper
.
#infoi {
position: absolute;
top: 0;
right: 0;
}
Da .wrapper
lediglich ein Behälter zur .navi
Positionierung #infoi
in der rechten oberen Ecke .wrapper
der Wirkung der verleiht in der oberen rechten Ecke positioniert ist .navi
.
Und da haben wir es, #infoi
scheint jetzt in der oberen rechten Ecke von zu sein .navi
.
Das Ergebnis
Das folgende Beispiel ist auf die Grundlagen beschränkt und enthält ein minimales Styling.
/*
* position: relative gives a new position context
*/
.wrapper {
position: relative;
}
/*
* The .navi properties are for styling only
* These properties can be changed or removed
*/
.navi {
background-color: #eaeaea;
height: 40px;
}
/*
* Position the #infoi element in the top-right
* of the .wrapper element
*/
#infoi {
position: absolute;
top: 0;
right: 0;
/*
* Styling only, the below can be changed or removed
* depending on your use case
*/
height: 20px;
padding: 10px 10px;
}
<div class="wrapper">
<div class="navi"></div>
<div id="infoi">
<img src="http://via.placeholder.com/32x20/000000/ffffff?text=?" height="20" width="32"/>
</div>
</div>
Eine alternative (Gitter-) Lösung
Hier ist eine alternative Lösung mit CSS Grid, um das .navi
Element mit dem #infoi
Element ganz rechts zu positionieren . Ich habe die ausführlichen grid
Eigenschaften verwendet, um es so klar wie möglich zu machen.
:root {
--columns: 12;
}
/*
* Setup the wrapper as a Grid element, with 12 columns, 1 row
*/
.wrapper {
display: grid;
grid-template-columns: repeat(var(--columns), 1fr);
grid-template-rows: 40px;
}
/*
* Position the .navi element to span all columns
*/
.navi {
grid-column-start: 1;
grid-column-end: span var(--columns);
grid-row-start: 1;
grid-row-end: 2;
/*
* Styling only, the below can be changed or removed
* depending on your use case
*/
background-color: #eaeaea;
}
/*
* Position the #infoi element in the last column, and center it
*/
#infoi {
grid-column-start: var(--columns);
grid-column-end: span 1;
grid-row-start: 1;
place-self: center;
}
<div class="wrapper">
<div class="navi"></div>
<div id="infoi">
<img src="http://via.placeholder.com/32x20/000000/ffffff?text=?" height="20" width="32"/>
</div>
</div>
Eine alternative Lösung (ohne Wrapper)
Wenn wir kein HTML bearbeiten können, dh kein Wrapper-Element hinzufügen können, können wir dennoch den gewünschten Effekt erzielen.
Anstatt position: absolute
das #infoi
Element zu verwenden, verwenden wir position: relative
. Dadurch können wir das #infoi
Element von seiner Standardposition unterhalb des .navi
Elements neu positionieren . Mit können position: relative
wir einen negativen top
Wert verwenden, um ihn von seiner Standardposition nach oben zu verschieben, und einen left
Wert von 100%
minus ein paar Pixeln left: calc(100% - 52px)
, um ihn in der Nähe der rechten Seite zu positionieren.
/*
* The .navi properties are for styling only
* These properties can be changed or removed
*/
.navi {
background-color: #eaeaea;
height: 40px;
width: 100%;
}
/*
* Position the #infoi element in the top-right
* of the .wrapper element
*/
#infoi {
position: relative;
display: inline-block;
top: -40px;
left: calc(100% - 52px);
/*
* Styling only, the below can be changed or removed
* depending on your use case
*/
height: 20px;
padding: 10px 10px;
}
<div class="navi"></div>
<div id="infoi">
<img src="http://via.placeholder.com/32x20/000000/ffffff?text=?" height="20" width="32"/>
</div>
overflow: hidden
. Verwenden Sieoverflow: visible
stattdessen.