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


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 .


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/


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;
}

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%);
}

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>


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);
}

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;  
}

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.


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>


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.