So che questa domanda è vecchia, ma ho trovato quello che per me è la soluzione perfetta.
Aggiungo questo css al div che voglio centrare:
div:before {
content: "";
display: inline-block;
height: 100%;
vertical-align: middle;
}
Funziona ogni volta ed è pulito.
Modifica: solo per motivi di completamento, uso scss e ho un pratico mixin che includo su ogni genitore che è figli diretti che voglio avere centrato verticalmente:
@mixin vertical-align($align: middle) {
&:before {
content: "";
display: inline-block;
height: 100%;
vertical-align: $align;
font-size: 0;
}
& > * {
vertical-align: $align;
font-size: 14px;
}
}
Spiegazione completa:
div:beforeaggiungerà un elemento all'interno del div, ma prima dei suoi figli. Quando si utilizza :beforeo :afterdobbiamo usare una content:dichiarazione altrimenti non accadrà nulla, ma per il nostro scopo il contenuto può essere vuoto. Quindi diciamo all'elemento di essere alto quanto il suo genitore, purché l'altezza del suo genitore sia definita e questo elemento sia almeno inline-block. vertical-aligndefinisce la posizione verticale del sé rispetto al genitore, al contrario di text-alignciò che funziona in modo diverso.
La @mixindichiarazione è per gli utenti sass e sarebbe usata in questo modo:
div {
@include vertical-align(middle)
}