Ich weiß, dass diese Frage alt ist, aber ich habe herausgefunden, was für mich die perfekte Problemumgehung ist.
Ich füge dieses CSS dem Div hinzu, das ich zentrieren möchte:
div:before {
content: "";
display: inline-block;
height: 100%;
vertical-align: middle;
}
Dies funktioniert jedes Mal und es ist sauber.
Bearbeiten: Nur zur Vervollständigung verwende ich scss und ich habe ein praktisches Mixin, das ich jedem Elternteil hinzufüge , dessen direkte Kinder ich vertikal zentrieren möchte:
@mixin vertical-align($align: middle) {
&:before {
content: "";
display: inline-block;
height: 100%;
vertical-align: $align;
// you can add font-size 0 here and restore in the children to prevent
// the inline-block white-space to mess the width of your elements
font-size: 0;
}
& > * {
vertical-align: $align;
// although you need to know the font-size, because "inherit" is 0
font-size: 14px;
}
}
Vollständige Erklärung:
div:beforeFügt ein Element innerhalb des div hinzu, jedoch vor einem seiner untergeordneten Elemente. Bei Verwendung :beforeoder :afterwir müssen eine content:Erklärung verwenden, sonst passiert nichts, aber für unseren Zweck kann der Inhalt leer sein. Dann weisen wir das Element an, so groß wie sein übergeordnetes Element zu sein, solange die Höhe des übergeordneten Elements definiert ist und dieses Element mindestens ein Inline-Block ist. vertical-aligndefiniert die vertikale Position des Selbst in Bezug auf die Eltern, im Gegensatz dazu text-alignfunktioniert dies anders.
Die @mixinDeklaration ist für Sass-Benutzer und wird folgendermaßen verwendet:
div {
@include vertical-align(middle)
}