So zentrieren Sie div vertikal innerhalb des absolut positionierten übergeordneten div

145

Ich versuche, einen blauen Behälter in der Mitte eines rosa Behälters zu bekommen, aber vertical-align: middle;in diesem Fall scheint dies nicht der Fall zu sein.

<div style="display: block; position: absolute; left: 50px; top: 50px;">
    <div style="text-align: left; position: absolute;height: 56px;vertical-align: middle;background-color: pink;">
        <div style="background-color: lightblue;">test</div>
    </div>
</div>

Ergebnis:

Geben Sie hier die Bildbeschreibung ein

Erwartung:

Geben Sie hier die Bildbeschreibung ein

Bitte schlagen Sie vor, wie ich das erreichen kann.

Jsfiddle

Vladimirs
quelle
1
Gibt es einen Grund, warum Sie position: absoluteüberall verwenden?
Vucko
die vertical-align: middle;arbeitet mit display: inline-blockoder Tabellenlayout
ctf0
Überprüfen Sie diesen Link: vanseodesign.com/css/vertical-centering ;)
Jordi Castilla
@Vucko ja - das ist Voraussetzung, da dies nur eine vereinfachte Version eines sehr komplexen Layouts ist, aber die absolute Position in beiden Top-Divs ist der Schlüssel.
Vladimirs
@ Vladimirs Ich kann nur denken margin-top: calc((56px - 16px) / 2), wo 56px - parent height, 16px - element height/font-size- JSFiddle
Vucko

Antworten:

329

Beachten Sie zunächst, dass dies vertical-alignnur für Tabellenzellen und Elemente auf Inline-Ebene gilt.

Es gibt verschiedene Möglichkeiten, vertikale Ausrichtungen zu erzielen, die Ihren Anforderungen entsprechen oder nicht. Ich zeige Ihnen jedoch zwei Methoden aus meinen Favoriten:

1. Verwenden von transformundtop

.valign {
    position: relative;
    top: 50%;
    transform: translateY(-50%);
    /* vendor prefixes omitted due to brevity */
}
<div style="position: absolute; left: 50px; top: 50px;">
    <div style="text-align: left; position: absolute;height: 56px;background-color: pink;">
        <div class="valign" style="background-color: lightblue;">test</div>
    </div>
</div>

Der entscheidende Punkt ist, dass ein Prozentwert für toprelativ zum Wert heightdes enthaltenen Blocks ist. Während ein Prozentwert auf transforms relativ zur Größe des Feldes selbst (des Begrenzungsrahmens) ist.

Wenn Probleme beim Rendern von Schriftarten auftreten (verschwommene Schrift), müssen Sie perspective(1px)der transformDeklaration Folgendes hinzufügen :

transform: perspective(1px) translateY(-50%);

Es ist erwähnenswert, dass CSS transform in IE9 + unterstützt wird .

2. Verwenden von inline-block(Pseudo-) Elementen

Bei dieser Methode haben wir zwei Geschwisterelemente inline-block, die durch vertical-align: middleDeklaration vertikal in der Mitte ausgerichtet sind .

Einer von ihnen hat eine heightvon 100%der Mutter und das andere ist unser gewünschtes Element , dessen wollten wir es in der Mitte auszurichten.

.parent {
    text-align: left;
    position: absolute;
    height: 56px;
    background-color: pink;
    white-space: nowrap;
    font-size: 0; /* remove the gap between inline level elements */
}

.dummy-child { height: 100%; }

.valign {
    font-size: 16px; /* re-set the font-size */
}

.dummy-child, .valign {
    display: inline-block;
    vertical-align: middle;
}
<div style="position: absolute; left: 50px; top: 50px;">
    <div class="parent">
        <div class="dummy-child"></div>
        <div class="valign" style="background-color: lightblue;">test</div>
    </div>
</div>

Schließlich sollten wir eine der verfügbaren Methoden verwenden, um die Lücke zwischen Elementen auf Inline-Ebene zu entfernen .

Hashem Qolami
quelle
Vielen Dank für diese nützlichen Tipps. Es hat für mein Projekt funktioniert. Gute Taten.
Sedat Kumcu
Für das erste Methodenelement valignsolltedisplay: block
Oleg
transform: translateY(-50%);Ich habe das noch nie gesehen, aber es funktioniert einwandfrei. Retter des wirklichen Lebens.
Benny Bottema
55

benutze das :

.Absolute-Center {
    margin: auto;
    position: absolute;
    top: 0; left: 0; bottom: 0; right: 0;
}

Verweisen Sie auf diesen Link: https://www.smashingmagazine.com/2013/08/absolute-horizontal-vertical-centering-css/

Ươiển Trương
quelle
Wie ist das nicht die Hauptlösung? So einfach und es funktioniert!
Mason
21
Beachten Sie, dass die heightEigenschaft definiert werden muss (in px, em usw.), damit dies funktioniert.
Vaidas
Was ist, wenn ich mehrere Divs im Elternteil habe? würden nicht alle übereinander liegen?
Psykid
Es funktioniert nicht, wenn es noch ein Kind auf dem gleichen Level wie "Absolut-Center" gibt
Pascut
18

Verwenden Sie Flex Blox in Ihrem absout positionierten Div, um dessen Inhalt zu zentrieren.

Siehe Beispiel https://plnkr.co/edit/wJIX2NpbNhO34X68ZyoY?p=preview

.some-absolute-div {    
  display: -webkit-box;
  display: -webkit-flex;
  display: -moz-box;
  display: -moz-flex;
  display: -ms-flexbox;
  display: flex;

  -webkit-box-pack: center;
  -ms-flex-pack: center;
  -webkit-justify-content: center;
  -moz-justify-content: center;
  justify-content: center;

  -webkit-box-align: center;
  -ms-flex-align: center;
  -webkit-align-items: center;
  -moz-align-items: center;
  align-items: center;
}
Chris Aelbrecht
quelle
11

Vertikal und horizontal zentrieren:

.parent{
  height: 100%;
  position: absolute;
  width: 100%;
  top: 0;
  left: 0;
}
.c{
  position: absolute;
  top: 50%;
  left: 0;
  right: 0;
  transform: translateY(-50%);
}
Juan Angel
quelle
3

Sie können display:table/ verwendentable-cell;

.a{
   position: absolute; 
  left: 50px; 
  top: 50px;
  display:table;
}
.b{
  text-align: left; 
  display:table-cell;
  height: 56px;
  vertical-align: middle;
  background-color: pink;
}
.c {
  background-color: lightblue;
}
<div class="a">
  <div  class="b">
    <div class="c" >test</div>
  </div>
</div>

G-Cyrillus
quelle
Vielen Dank, Ihr Beispiel funktioniert perfekt, es .bfehlt jedoch , position: absolute;was wichtig ist, um andere Eigenschaften anzuzeigen, die ich nicht aufgenommen habe, um den Code klarer zu halten. Ich weiß, dass es keinen Sinn macht, Tabellenzellen absolut zu positionieren, aber vielleicht gibt es einen anderen Ansatz, der es erlaubt, position: absolute;sowohl in .aals auch in .bKlassen zu bleiben ?
Vladimirs
Wenn a die absolute Position ist und b (das Kind) ihm seine Größe gibt, befindet sich b selbst in der absoluten Position gegenüber dem Rest des Inhalts. Wenn a nicht angenommen wird, dass es nicht dimensioniert ist, verstehe ich den Zweck von absolut innerhalb absolut nicht?
G-Cyrillus
1

Hier ist eine einfache Möglichkeit, das Top-Objekt zu verwenden.

Beispiel: Wenn die absolute Elementgröße 60px beträgt.

.absolute-element { 
    position:absolute; 
    height:60px; 
    top: calc(50% - 60px);
}
Sainul Abid
quelle
2
Die Verwendung calcist hilfreich, sollte jedoch so sein, top: calc(50% - 30px)dass sie tatsächlich zentriert ist.
Brainbag
1

Eine zusätzliche einfache Lösung

HTML:

<div id="d1">
    <div id="d2">
        Text
    </div>
</div>

CSS:

#d1{
    position:absolute;
    top:100px;left:100px;
}

#d2{
    border:1px solid black;
    height:50px; width:50px;
    display:table-cell;
    vertical-align:middle;
    text-align:center;  
}
Hicham
quelle
0

Bitte überprüfen Sie diese Antwort auf ein ähnliches Problem.

Dies ist bei weitem der einfachste Weg, den ich gefunden habe.

https://stackoverflow.com/a/26079837/4593442

HINWEIS. Ich habe display verwendet: -webkit-flex; statt Anzeige: flex; zum Testen innerhalb der Safari.

FUSSNOTE. Ich bin nur ein Anfänger und teile die Hilfe von jemandem, der eindeutig erfahren ist.

Whanau Paitai
quelle
0

Sie können dies tun, indem Sie display:table;in parent div und display: table-cell; vertical-align: middle;in child div verwenden

<div style="display:table;">
      <div style="text-align: left;  height: 56px;  background-color: pink; display: table-cell; vertical-align: middle;">
          <div style="background-color: lightblue; ">test</div>
      </div>
  </div>

Arindam Sarkar
quelle
3
Es ist möglich, dass Ihre Antwort gut ist, aber Sie können sie sehr verbessern, indem Sie eine Beschreibung der Funktionsweise Ihres Codes hinzufügen ...
DaFois