Warum funktioniert Vertical-Align: Middle nicht für meine Spanne oder Div?

246

Ich versuche, ein spanoder divElement vertikal in einem anderen divElement zu zentrieren. Wenn ich jedoch sage vertical-align: middle, passiert nichts. Ich habe versucht, die displayEigenschaften beider Elemente zu ändern , und nichts scheint zu funktionieren.

Folgendes mache ich derzeit auf meiner Webseite:

.main {
  height: 72px;
  vertical-align: middle;
  border: 1px solid black;
  padding: 2px;
}
    
.inner {
  vertical-align: middle;
  border: 1px solid red;    
}
    
.second {
  border: 1px solid blue; 
}
<div class="main">
  <div class="inner">
    This box should be centered in the larger box
    <div class="second">Another box in here</div>
  </div>
</div>

Hier ist eine jsfiddle der Implementierung, die zeigt, dass sie nicht funktioniert: http://jsfiddle.net/gZXWC/

Brad
quelle

Antworten:

207

Dies scheint der beste Weg zu sein - seit meinem ursprünglichen Beitrag ist einige Zeit vergangen, und dies sollte jetzt getan werden: http://jsfiddle.net/m3ykdyds/200

/* CSS file */

.main {
    display: table;
}

.inner {
    border: 1px solid #000000;
    display: table-cell;
    vertical-align: middle;
}

/* HTML File */
<div class="main">
    <div class="inner"> This </div>
</div>
Charles Addis
quelle
2
Wie macht jemand das, was das OP tun will?
Ryan Mortensen
Irgendwelche Ideen zu Absätzen mit variablen Zeilen? dh. wenn es keine Möglichkeit gibt zu wissen, ob es sich um eine oder zwei Zeilen handelt. Muss ich dann jQuery verwenden?
Foochow
Was ist, wenn die Höhe dynamisch sein muss, was ist die Lösung?
Murhaf Sousli
sollte nicht die akzeptierte Antwort sein, hängt davon ab, dass man die Höhe von '.inner' kennt, also nicht genau das, wonach das OP gefragt hat, und einige viel bessere Antworten siehe unten die Antworten von @timbergus oder Tim Perkins ganz unten.
Mike-Quelle
@ mike-source zu wissen, dass die Höhe des Inneren 100% möglich ist, auch wenn die Höhe dynamisch ist, da ein wenig Javascript dies herausfinden und die CSS-Regel für dieses DOM-Objekt dynamisch ändern kann.
Charles Addis
143

Verwenden von CSS3:

<div class="outer">
   <div class="inner"/>
</div>

CSS:

.outer {
  display : flex;
  align-items : center;
  justify-content: center;
}

Hinweis: Dies funktioniert möglicherweise nicht in alten IE

user1782556
quelle
16
Dies wird von allen gängigen modernen Browsern und von der einfachsten und saubersten Lösung unterstützt.
Sam
2
Denken Sie auch daran inline-flex, dass sich innerhalb des inneren Elements mehrere Elemente hintereinander befinden.
Dan Nissenbaum
1
In meinem Fall musste ich hinzufügen, da ich den Inhalt von .inner auch horizontal zentrieren wollte .inner { width: 100%; }. Auf diese Weise scheint es zu funktionieren .outer { display: table; } .inner { display: table-cell; vertical-align: middle; }, ohne jedoch eine Mindestbreite zu erzwingen.
Bart S
Ich habe mich justify-content: center;horizontal ausgerichtet, was großartig funktioniert hat
Ruth Young
140

Versuchen Sie dies, funktioniert für mich sehr gut:

/* Internet Explorer 10 */
display:-ms-flexbox;
-ms-flex-pack:center;
-ms-flex-align:center;

/* Firefox */
display:-moz-box;
-moz-box-pack:center;
-moz-box-align:center;

/* Safari, Opera, and Chrome */
display:-webkit-box;
-webkit-box-pack:center;
-webkit-box-align:center;

/* W3C */
display:box;
box-pack:center;
box-align:center;
Mahendra Liya
quelle
4
Hervorragende Antwort, dies hat mir eine voll funktionsfähige Lösung gegeben, die keine anderen Probleme verursacht hat (eine App mit jquerymobile + phonegap und allen anderen Lösungen führte zu Problemen mit CSS- und Div-Größen). Nur um darauf hinzuweisen, dass diese Parameter zu einem CSS-Block hinzugefügt werden müssen, der für die zu zentrierenden / zu mittelnden Elemente spezifisch ist, z. B.: #element span {height:100%;display:-webkit-box;-webkit-box-pack:center;-webkit-box-align:center;}- Beachten Sie, dass die Höhe wichtig ist, um sicherzustellen, dass die Spanne ansonsten die volle Höhe ihres Containers (wahrscheinlich ein Div) erbt Sie erhalten immer noch keine vertikale Zentrierung!
Andy Lorenz
Übrigens können Sie Standard-Flexbox-Code ohne Browserpräfixe schreiben und dann den Browser mit dem Autoprefixer github.com/postcss/autoprefixer oder über die Online-Demo simevidas.jsbin.com/gufoko/quiet
starikovs
2
ungültiger Eigenschaftswert boxindisplay
Joaquinglezsantos
Außerdem funktioniert die Antwort von @ user1782556 besser, wenn die äußere Box gepolstert ist.
iautomation
34

Das Einstellen der Zeilenhöhe auf die gleiche Höhe, die div enthält, funktioniert ebenfalls

DEMO http://jsfiddle.net/kevinPHPkevin/gZXWC/7/

.inner {
    line-height:72px;
    border: 1px solid #000000;
}
Kevin Lynch
quelle
1
Ich habe einen Link gepostet, der auch diese Methode erklärt. Nicht meine bevorzugte Methode, wenn der Rest des Layouts nicht in der Größe festgelegt ist. Bei dieser Methode sind Probleme mit Ansichtsfenstern unterschiedlicher Größe aufgetreten.
Charles Addis
2
Ja, die Technik der Zeilenhöhe funktioniert gut, aber NUR, wenn Sie einzeiligen Inhalt haben. Zusätzliche Leitungen gehen verloren / werden außerhalb des Containers verschüttet und Sie müssen erneut beginnen!
Andy Lorenz
a) line-heightändert auch die Höhe des inneren Elements. b) Das innere Element ist immer noch nicht genau vertikal zentriert. c) Es funktioniert nicht bei Elementen, die keinen Text enthalten, z. B. <img>oder Elemente mit fester Höhe.
Alph.Dev
Es kann auch
betriebssystemübergreifend
1
Dies ist sehr unvorhersehbar und führt häufig zu einer zusätzlichen Höhe des Behälters.
Undistraction
25

Falls Sie sich nicht auf die Flexbox verlassen können ... Platzieren Sie sie .childin .parentder Mitte. Funktioniert, wenn die Pixelgrößen unbekannt sind (mit anderen Worten, immer) und auch mit IE9 + keine Probleme auftreten.

.parent { position: relative; }

.child {
    position: absolute;
    top : 50%;
    left: 50%;
    -ms-transform: translate(-50%, -50%);
    transform    : translate(-50%, -50%);    
}
<div class="parent" style="background:lightyellow; padding:6em"> 
  <div class="child" style="background:gold; padding:1em">&mdash;</div> 
</div>

kornieff
quelle
Dies ist tatsächlich die am besten gelungene Lösung, zumal die meisten Projekte, die ich bisher gesehen habe, IE9-Kompatibilität benötigen
Jabberwocky
20

Sie sollten vertical-align: middledas innere Element anlegen , nicht das äußere Element. Stellen Sie die line-heightEigenschaft für das äußere Element so ein, dass sie mit der heightdes äußeren Elements übereinstimmt . Dann setzen display: inline-blockund line-height: normalauf das innere Element. Auf diese Weise wird der Text auf dem inneren Element mit einer normalen Zeilenhöhe umbrochen. Funktioniert in Chrome, Firefox, Safari und IE 8+

.main {
    height: 72px;
    line-height:72px;
    border: 1px solid black;
}
.inner {
    display: inline-block;
    vertical-align: middle;
    line-height: normal;
}
<div class="main">
    <div class="inner">Vertically centered text</div>
</div>

Geige

Tim Perkins
quelle
Dies ist wahrscheinlich der einfachste Weg ... alle anderen Antworten auf dieser Seite sind unnötig klobig / hackig ODER werden in älteren Browsern nicht unterstützt ODER sind darauf angewiesen, die Höhe des inneren Elements zu kennen. Sie brauchen das nicht line-height: normal;und display:inline;funktioniert auch. Der Vorteil dieser Methode ist, dass sie nicht stört text-align:center;, wodurch die Verwendung display: table-cell;Probleme verursachen kann. Sehr oft wollen wir sowohl horizontal als auch vertikal ausrichten. Siehe diese bearbeitete Geige: jsfiddle.net/br090prs/36
mike-source
2
@ mike-source ist der Grund für die Verwendung line-height: normalund display: inline-blockist so, dass der innere Text richtig umbrochen wird. Wenn Sie sicher sind, dass der Text im inneren Div niemals umbrochen wird, sind diese Eigenschaften nicht erforderlich.
Tim Perkins
Seit Microsoft die Unterstützung für alte IE-Versionen beendet hat, habe ich für solche Dinge Flexbox verwendet (wie von @ user1782556 vorgeschlagen). Meine ursprüngliche Antwort ist der richtige Weg, wenn Sie IE 10 oder älter noch unterstützen müssen.
Tim Perkins
100% stimmen zu, aber ich persönlich würde mich noch nicht für Flex Box entscheiden. Nur 76% der Browser unterstützen es ab Mai 2016 vollständig (94%, wenn Sie teilweise Unterstützung einschließen), siehe: caniuse.com/#search=flexible% 20box . Abhängig von Ihrer Benutzerbasis ist es jedoch fast die sinnvollste Option.
Mike-Quelle
10

Ich habe dies verwendet, um alles in der Mitte des Wrapper-Div auszurichten, falls es jemandem hilft - ich fand es am einfachsten:

div.wrapper {
  /* --- This works --- */
  display: flex;
  /* Align Vertically */
  align-items: center;
  /* Align Horizontally */
  justify-content: center;
  /* --- ---------- ----- */
  width: 100%;
  height:100px;
  background-color: blue;
}
div.inner {
  width: 50px;
  height: 50px;
  background-color: orange;
}
<div class="wrapper">
  <div class="inner">
  </div>
</div>

Ruth Young
quelle
7

Hier haben Sie ein Beispiel für zwei Möglichkeiten, eine vertikale Ausrichtung durchzuführen. Ich benutze sie und sie funktionieren ziemlich gut. Einer verwendet die absolute Positionierung und der andere die Flexbox .

Beispiel für vertikale Ausrichtung

Mit flexbox können Sie ein Element innerhalb von in einem anderen Element mit display: flex;using ausrichten align-self. Wenn Sie es auch horizontal ausrichten müssen, können Sie align-itemsund verwendenjustify-content im Container verwenden.

Wenn Sie die Flexbox nicht verwenden möchten, können Sie die Positionseigenschaft verwenden. Wenn Sie den Container relativ und den Inhalt absolut machen, kann sich der Inhalt innerhalb des Containers frei bewegen. Wenn Sie also top: 0;und left: 0;im Inhalt verwenden, wird es in der oberen linken Ecke des Containers positioniert.

Absolute Positionierung

Um es auszurichten, müssen Sie nur die oberen und linken Verweise auf 50% ändern. Dadurch wird der Inhalt in der Containermitte von der oberen linken Ecke des Inhalts positioniert.

In der Mitte des Behälters ausrichten

Sie müssen dies also korrigieren, indem Sie den Inhalt, der halb so groß ist, nach links und oben übersetzen.

Absolut zentriert

Timbergus
quelle
5

Hier ist ein großartiger Artikel darüber, wie man sich vetisch ausrichtet. Ich mag den Float-Weg.

http://www.vanseodesign.com/css/vertical-centering/

Der HTML:

<div id="main">
    <div id="floater"></div>
    <div id="inner">Content here</div>
</div>

Und der entsprechende Stil:

#main {
   height: 250px;
}

#floater {
   float: left;
   height: 50%;
   width: 100%;
   margin-bottom: -50px;
}

#inner {
   clear: both;
   height: 100px;
}
Dory Zidon
quelle
3
Ich denke, wenn Sie die Höhe des #inner-Blocks definieren, wird das Konzept der richtigen vertikalen Zentrierung ungültig. Das OPS hat darum gebeten, es automatisch zu machen, daher würde ich mir vorstellen, dass die Höhe der inneren Box zum Zeitpunkt der Konzeption nicht bekannt ist.
Alexis Wilke
5

HTML

<div id="myparent">
  <div id="mychild">Test Content here</div>
</div>

CSS

#myparent {
  display: table;
}
#mychild {
  display: table-cell;
  vertical-align: middle;
}

Wir setzen das übergeordnete Div so, dass es als Tabelle angezeigt wird, und das untergeordnete Div so, dass es als Tabellenzelle angezeigt wird. Wir können dann die vertikale Ausrichtung für das untergeordnete Div verwenden und dessen Wert auf Mitte setzen. Alles in diesem untergeordneten Div wird vertikal zentriert.

Brijesh Patel
quelle
4

Es ist einfach. Fügen display:table-cellSie einfach Ihre Hauptklasse hinzu.

.main {
  height: 72px;
  vertical-align: middle;
  display:table-cell;
  border: 1px solid #000000;
}

Schauen Sie sich diese jsfiddle an !

RizonBarns
quelle
4

Hier ist die neueste einfachste Lösung: Sie müssen nichts ändern. Fügen Sie einfach drei Zeilen CSS-Regeln zu Ihrem Container des Div hinzu, in dem Sie zentrieren möchten. Ich liebe Flex Box#LoveFlexBox

.main {
  /* I changed height to 200px to make it easy to see the alignment. */
  height: 200px;
  vertical-align: middle;
  border: 1px solid #000000;
  padding: 2px;
  
  /* Just add the following three rules to the container of which you want to center at. */
  display: flex;
  flex-direction: column;
  justify-content: center;
  /* This is true vertical center, no math needed. */
}
.inner {
  border: 1px solid #000000;
}
.second {
  border: 1px solid #000000;
}
<div class="main">
  <div class="inner">This box should be centered in the larger box
    <div class="second">Another box in here</div>
  </div>
  <div class="inner">This box should be centered in the larger box
    <div class="second">Another box in here</div>
  </div>
</div>

Bonus

Der justify-contentWert kann auf die folgenden Optionen eingestellt werden:

  • flex-startDadurch wird das untergeordnete Div an der Stelle ausgerichtet, an der der Flex-Flow in seinem übergeordneten Container beginnt. In diesem Fall bleibt es oben.

  • center, wodurch das untergeordnete div an der Mitte des übergeordneten Containers ausgerichtet wird. Dies ist wirklich ordentlich, da Sie kein zusätzliches Div hinzufügen müssen, um alle untergeordneten Elemente zu umschließen, um den Wrapper in einen übergeordneten Container zu legen und die untergeordneten Elemente zu zentrieren. Aus diesem Grund, ist dies das ist wahre vertikale Mitte (in der column flex-direction. In ähnlicher Weise, wenn Sie die Änderung flow-directionzu rowwerden geworden horizontal zentriert.

  • flex-end, wodurch das untergeordnete Div an der Stelle ausgerichtet wird, an der der Flex-Flow in seinem übergeordneten Container endet. In diesem Fall wird es nach unten verschoben.

  • space-between, die alle Kinder vom Beginn des Flusses bis zum Ende des Flusses verbreitet. Bei der Demo habe ich ein weiteres Kinder-Div hinzugefügt, um zu zeigen, dass sie verteilt sind.

  • space-around, ähnlich space-between, aber mit der Hälfte des Raums am Anfang und Ende des Flusses.

Downhillski
quelle
Perfekte Lösung. Die inkompatiblen Browser können den Inhalt nicht ausrichten und der Benutzer muss damit umgehen oder seinen Browser aktualisieren.
zweimal
0

Da dies bei a vertical-alignwie erwartet funktioniert td, können Sie eine einzelne Zelle tablein das divFeld einfügen , um den Inhalt auszurichten.

<div>
    <table style="width: 100%; height: 100%;"><tr><td style="vertical-align: middle; text-align: center">
        Aligned content here...
    </td></tr></table>
</div>

Klobig, funktioniert aber soweit ich das beurteilen kann. Es hat möglicherweise nicht die Nachteile der anderen Problemumgehungen.

Smig
quelle
5
Nein, bitte, keine Tische mehr. CSS kann das auf saubere Weise tun. In diesem Fall muss <table> nicht verwendet werden.
enguerranws
0

Legen Sie den Inhalt einfach in eine Tabelle mit einer Höhe von 100% und stellen Sie die Höhe für den Hauptbereich ein

<div style="height:80px;border: 1px solid #000000;">
<table style="height:100%">
<tr><td style="vertical-align: middle;">
  This paragraph should be centered in the larger box
</td></tr>
</table>
</div>
Ramiro Mosquera
quelle
0

Um ein span- oder div-Element innerhalb eines anderen div vertikal zu zentrieren, fügen Sie dem untergeordneten div eine Position relativ zum übergeordneten div und eine absolute Position hinzu. Jetzt kann das untergeordnete div an einer beliebigen Stelle innerhalb des div positioniert werden. Beispiel unten zentriert sowohl horizontal als auch vertikal.

<div class="parent">
    <div class="child">Vertically and horizontally centered child div</div>
</div>

CSS:

.parent{
    position: relative;
}
.child{
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    margin: auto;
}
Toki
quelle
0

Dies ist ein moderner Ansatz, der die CSS-Flexbox-Funktionalität nutzt. Sie können den Inhalt in Ihrem übergeordneten Container jetzt vertikal ausrichten, indem Sie diese Stile einfach zum .mainContainer hinzufügen

.main {
        display: flex;
        flex-direction: column;
        justify-content: center;
}

Und du kannst loslegen!

Kingsley Gyimah
quelle