Wiem, że to pytanie jest stare, ale znalazłem dla mnie idealne obejście.
Dodaję ten css do div, który chcę wyśrodkować:
div:before {
content: "";
display: inline-block;
height: 100%;
vertical-align: middle;
}
To działa za każdym razem i jest czysty.
Edycja: tylko ze względu na ukończenie, używam scss i mam poręczną mieszankę, którą dołączam do każdego rodzica, który jest bezpośrednim dzieckiem, które chcę mieć wyśrodkowane w pionie:
@mixin vertical-align($align: middle) {
&:before {
content: "";
display: inline-block;
height: 100%;
vertical-align: $align;
font-size: 0;
}
& > * {
vertical-align: $align;
font-size: 14px;
}
}
Pełne wyjaśnienie:
div:beforedoda element wewnątrz elementu div, ale przed jakimkolwiek jego elementem podrzędnym. Podczas korzystania :beforelub :aftermusimy użyć content:deklaracji, w przeciwnym razie nic się nie stanie, ale dla naszego celu zawartość może być pusta. Następnie mówimy elementowi, aby był tak wysoki jak jego rodzic, o ile jego wysokość jest zdefiniowana i ten element jest co najmniej blokiem inline. vertical-alignokreśla pionową pozycję siebie w stosunku do rodzica, w przeciwieństwie do text-aligntego, który działa inaczej.
@mixinDeklaracja jest dla użytkowników Sass i byłoby wykorzystywane tak:
div {
@include vertical-align(middle)
}