Ich brauche Unterstützung bei der Überlagerung einer Person mit einer div
anderen Person div
.
Mein Code sieht folgendermaßen aus:
<div class="navi"></div>
<div id="infoi">
<img src="info_icon2.png" height="20" width="32"/>
</div>
Leider kann ich das div#infoi
oder das nicht img
im ersten verschachteln div.navi
.
Es müssen zwei separate div
s sein, wie gezeigt, aber ich muss wissen, wie ich das div#infoi
über div.navi
und ganz rechts platzieren und oben auf dem zentrieren kann div.navi
.
overflow: hidden
. Verwenden Sieoverflow: visible
stattdessen.Antworten:
Ich würde vorschlagen, etwas über
position: relative
und untergeordnete Elemente mit zu lernenposition: absolute
.quelle
absolute
Nur positionierte Elemente werden relativ zu ihrem nächsten explizit positionierten (position:absolute|relative|fixed
) übergeordneten Element positioniert . nur weitere Klarstellung ... jsfiddle.net/p5jkc8gzDie 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
voninfoi
) so zu positionieren , dass es im vorherigen Element (dem mit einemclass
vonnavi
) 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 sindrelative
,absolute
,sticky
, undfixed
. Durch Setzen eines Elementsposition
auf einen dieser anderen Werte ist es jetzt möglich, eine Kombination der folgenden vier Eigenschaften zum Positionieren des Elements zu verwenden:top
right
bottom
left
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, wirdbottom: 100px
das Element 100 Pixel vom unteren Rand der Seite entfernt positioniert.Hier gehen viele CSS-Neulinge verloren - sie
position: 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 wirdposition: relative
, verwenden alle untergeordneten Elemente das<div class="parent">
als Positionskontext. Wenn ein Kind Element gegeben wurdenposition: absolute
undtop: 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:
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.Code-Snippet anzeigen
Die Stapelreihenfolge kann mit CSS über die Eigenschaften
z-index
oder geändertorder
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.Dann erstellen Sie eine neue Position Kontext , indem sie
.wrapper
einposition: relative
.Mit diesem neuen Positionskontext können wir
#infoi
innerhalb positionieren.wrapper
. Geben Sie zunächst#infoi
einposition: absolute
, damit wir uns#infoi
absolut positionieren können.wrapper
.Fügen Sie dann das Element hinzu
top: 0
undright: 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
.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.
Code-Snippet anzeigen
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ührlichengrid
Eigenschaften verwendet, um es so klar wie möglich zu machen.Code-Snippet anzeigen
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 wirposition: relative
. Dadurch können wir das#infoi
Element von seiner Standardposition unterhalb des.navi
Elements neu positionieren . Mit könnenposition: relative
wir einen negativentop
Wert verwenden, um ihn von seiner Standardposition nach oben zu verschieben, und einenleft
Wert von100%
minus ein paar Pixelnleft: calc(100% - 52px)
, um ihn in der Nähe der rechten Seite zu positionieren.Code-Snippet anzeigen
quelle
Durch eine Verwendung
div
mit Stilz-index:1;
undposition: absolute;
Sie können Ihre Overlaydiv
auf jedem anderendiv
.z-index
bestimmt die Reihenfolge, in der divs 'stack'. Ein Div mit einem höheren Wertz-index
wird vor einem Div mit einem niedrigeren Wert angezeigtz-index
. Beachten Sie, dass diese Eigenschaft nur mit positionierten Elementen funktioniert .quelle
Die neue Grid CSS- Spezifikation bietet eine weitaus elegantere Lösung. Die Verwendung
position: absolute
kann zu Überlappungen oder Skalierungsproblemen führen, während Grid Sie vor schmutzigen CSS-Hacks bewahrt.Beispiel für die minimalste Rasterüberlagerung:
HTML
CSS
Das ist es. Wenn Sie nicht für Internet Explorer erstellen, funktioniert Ihr Code höchstwahrscheinlich.
quelle
Hier folgt eine einfache Lösung, die zu 100% auf CSS basiert. Das "Geheimnis" besteht darin, das
display: inline-block
im Wrapper-Element zu verwenden. Dasvertical-align: bottom
im Bild ist ein Hack, um die 4px-Auffüllung zu überwinden, die einige Browser nach dem Element hinzufügen.Hinweis : Wenn das Element vor dem Wrapper inline ist, kann es verschachtelt werden. In diesem Fall können Sie die Verpackung in einen Behälter einwickeln mit
display: block
- normalerweise einem guten und einem altendiv
.quelle
Das brauchen Sie:
quelle
Ich bin weder ein Programmierer noch ein Experte für CSS, aber ich verwende Ihre Idee immer noch in meinen Webdesigns. Ich habe auch verschiedene Auflösungen ausprobiert:
Natürlich wird es eine Hülle um beide geben. Sie können die Position des Menü-Div steuern, das innerhalb des Header-Div mit linken Rändern und oberen Positionen angezeigt wird. Sie können das div-Menü auch so einstellen, dass es nach rechts schwebt, wenn Sie möchten.
quelle
Hier ist ein einfaches Beispiel, um einen Overlay-Effekt mit einem Ladesymbol über einem anderen Div zu erzielen.
Probieren Sie es hier aus: http://jsbin.com/fotozolucu/edit?html,css,output
quelle