655 Stimmen

Vertikales Zentrieren eines div innerhalb eines anderen div

Ich möchte ein Div zentrieren, das sich innerhalb eines anderen Divs befindet.

<div id="outerDiv">
    <div id="innerDiv">
    </div>
</div>

Dies ist das CSS, das ich derzeit verwende.

    #outerDiv {
        width: 500px;
        height: 500px;
        position: relative;
    }

    #innerDiv {
        width: 284px;
        height: 290px;
        position: absolute;
        top: 50%;
        left: 50%;
        margin-top: -147px;
        margin-left: -144px;
    }

Wie Sie sehen können, hängt der Ansatz, den ich jetzt verwende, von der Breite und Höhe der #innerDiv . Wenn sich die Breite/Höhe ändert, muss ich die margin-top y margin-left Werte. Gibt es eine allgemeine Lösung, die ich verwenden kann, um die #innerDiv unabhängig von seiner Größe?

Ich habe herausgefunden, dass die Verwendung von margin: auto können horizontal ausgerichtet werden. #innerDiv in die Mitte. Aber was ist mit der vertikalen Ausrichtung?

0 Stimmen

Was, wenn Sie margin-top: auto; margin-bottom: auto machen;

1 Stimmen

0 Stimmen

Hier sind zwei einfache Methoden, um Divs innerhalb von Divs zu zentrieren, vertikal, horizontal oder beides (reines CSS): stackoverflow.com/a/31977476/3597276

961voto

meo Punkte 29823

tl;dr

Vertikal in der Mitte ausrichten funktioniert, aber Sie müssen die table-cell auf Ihrem übergeordneten Element und inline-block auf das Kind.

Diese Lösung wird in IE6 und 7 nicht funktionieren.
Ihr Weg ist der sicherere für diese Fälle.
Aber da Sie Ihre Frage mit CSS3 und HTML5 getaggt haben, dachte ich, dass es Ihnen nichts ausmacht, eine moderne Lösung zu verwenden.

Die klassische Lösung (Tabellenlayout)

Das war meine ursprüngliche Antwort. Sie funktioniert immer noch gut und ist die Lösung mit der breitesten Unterstützung. Tabellen-Layout wird Auswirkungen auf Ihre Rendering-Leistung Ich würde daher vorschlagen, dass Sie eine der moderneren Lösungen verwenden.

Hier ein Beispiel


Getestet in:

  • FF3.5+
  • FF4+
  • Safari 5+
  • Chrom 11+
  • IE9+

HTML

<div class="cn"><div class="inner">your content</div></div>

CSS

.cn {
  display: table-cell;
  width: 500px;
  height: 500px;
  vertical-align: middle;
  text-align: center;
}

.inner {
  display: inline-block;
  width: 200px; height: 200px;
}

Moderne Lösung (Transformation)

Da die Transformationen jetzt ziemlich gut unterstützt Es gibt einen einfacheren Weg.

CSS

.cn {
  position: relative;
  width: 500px;
  height: 500px;
}

.inner {
  position: absolute;
  top: 50%; left: 50%;
  transform: translate(-50%,-50%);
  width: 200px;
  height: 200px;
}

Démo


meine bevorzugte moderne Lösung (Flexbox)

Ich habe angefangen, Flexbox mehr und mehr zu verwenden es wird jetzt auch gut unterstützt Das ist bei weitem der einfachste Weg.

CSS

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

Démo

Weitere Beispiele und Möglichkeiten: Vergleichen Sie alle Methoden auf einer Seite

1 Stimmen

+1 Müsste der OP jeden Text in einen anderen Container einschließen, wenn der Text nicht zentriert werden soll?

0 Stimmen

Können Sie ihn für das innere Div zurücksetzen: jsfiddle.net/mcSfe/2

0 Stimmen

Sieht für mich gut aus. Schöne Lösung.

129voto

user700284 Punkte 13280

Eine andere Möglichkeit, diese horizontale und vertikale Zentrierung zu erreichen, ist:

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

( Referenz )

1 Stimmen

+1, aber das hängt seltsamerweise von der Reihenfolge der Positionen ab. Start bottom: 0; left: 0; wird das innere Div an der Unterseite des übergeordneten (Chrome 33, jedenfalls) stecken.

0 Stimmen

Definieren Sie 0 in der Ausrichtung, an der Ihr div ausgerichtet werden soll. In meinem Fall war es in einem Suchformularfeld .search-header{ margin:auto; top:0px; bottom:0px; right:0px; } kein 'left' zugewiesen, um die Reihenfolge und Position des vorherigen <div> fortzusetzen

0 Stimmen

Und keine Notwendigkeit zu präzisieren, dass die übergeordnete div muss positioniert werden

52voto

rnrneverdies Punkte 14445

Eine andere Möglichkeit ist die Verwendung von Transform Translate

Outer Div muss seine position a relative ou fixed und das Inner Div muss seine position a absolute , top y left a 50% und wenden eine transform: translate(-50%, -50%) .

div.cn {
    position: relative;
    width: 200px;
    height: 200px;
    background: gray;
    text-align: center;
}

div.inner {
    position: absolute;
    top: 50%;
    left: 50%;
    width: 100px;
    height: 100px;
    -webkit-transform: translate(-50%, -50%);  
    transform: translate(-50%, -50%);   
    background: red;

}

<div class="cn">
    <div class="inner">
        test
    </div>
</div>

Getestet in:

  • Oper 24.0 (mindestens 12.1)
  • Safari 5.1.7 (mindestens 4 mit -webkit- Präfix)
  • Firefox 31.0 (mindestens 3,6 mit -moz- Präfix, ab 16 ohne Präfix)
  • Chrom 36 (mindestens 11 mit -webkit- Präfix, ab 36 ohne Präfix)
  • IE 11, 10 (mindestens 9 mit Präfix -ms-, ab 10 ohne Präfix)
  • Mehr Browser, kann ich verwenden?

8 Stimmen

Der beste Teil dieses Codes ist es funktioniert perfekt mit voller Breite äußeren div. Toller Job!

0 Stimmen

Ich weiß, dass wir die transform: translate(-50%, -50%); um das Div wirklich zu zentrieren, aber warum top:50% y left:50% Kann mir das jemand genauer erklären?

1 Stimmen

@KevinChandra, denke ich top y left bezieht sich auf die Abmessungen des Containers und die translate bezieht sich auf die Größe des Inhalts. Ich hoffe, das hilft!

52voto

drjorgepolanco Punkte 5859

Vertikal ausrichten mit nur 3 Zeilen CSS

HTML

<div class="parent-of-element">

    <div class="element">
        <p>Hello</p>
    </div>

</div>

Einfachste

.element {
  position: relative;
  top: 50%;
  transform: translateY(-50%);
}

CSS

.parent-of-element {
   position: relative;
   height: 500px;
   /* or height: 73.61% */
   /* or height: 35vh */
   /* or height: ANY HEIGHT */
}

.element {
  position: absolute;
  top: 50%;

  -webkit-transform: translateY(-50%);
      -ms-transform: translateY(-50%);
          transform: translateY(-50%);
}

Selon sollteiprefix dies sind die einzigen Präfixe, die Sie benötigen

Sie können auch % als Wert für die Eigenschaft "height" von .parent-of-element verwenden, sofern das übergeordnete Element eine Höhe oder einen Inhalt hat, der seine vertikale Größe vergrößert.

1 Stimmen

Ich kann dir nicht sagen, warum, aber in meinem Fall hat es perfekt funktioniert, als ich (50%) anstelle von (-50%) bei translateY verwendet habe...

4 Stimmen

Ich liebe diese Lösung wegen ihrer Eleganz. Das einzige Problem ist, dass, wenn der Benutzer ihren Browser auf 100px hoch (zum Beispiel), verliere ich die Spitze des zentrierten <div>, die für mich problematisch ist, weil ich meine Kopfzeile dort für ästhetische / Design-Gründe wollen. Um ganz ehrlich zu sein, obwohl: Ich mag diese Lösung so sehr, ich bin nicht einmal sicher, ob es mich interessiert!

1 Stimmen

KjetilNordin, je nach Layout funktioniert es manchmal, wenn Sie 50% statt -50% verwenden. Aber solange der Container des zentrierten Elements eine Höhe hat, wird die -50% einwandfrei funktionieren.

22voto

Iron Pillow Punkte 2112

Anstatt mich mit schwer zu schreibendem und schwer zu pflegendem CSS (das außerdem eine sorgfältige Cross-Browser-Validierung benötigt!) zu quälen, finde ich es viel besser, auf CSS zu verzichten und stattdessen wunderbar einfaches HTML 1.0 zu verwenden:

<table id="outerDiv" cellpadding="0" cellspacing="0" border="0">
    <tr>
        <td valign="middle" id="innerDiv">
        </td>
    </tr>
</table>

Damit wird alles erreicht, was der ursprüngliche Poster wollte, und es ist robust und wartbar.

11 Stimmen

Die meisten Menschen halten dies nicht für eine gute Praxis, und ich stimme dem zu. Markup-Elemente wie "table" sollten nicht für das Layout verwendet werden. Verwenden Sie table, wenn Sie tatsächlich tabellarische Daten anzeigen wollen.

9 Stimmen

Wenn Sie Stil über wartbaren Code stellen, dann ist Ihre Sorge berechtigt. Andere Leute mögen diese beiden Faktoren anders gewichten, und sie sollten alle Optionen sehen.

3 Stimmen

Ich denke, diese Lösung ist großartig und absolut browserübergreifend.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X