Je sais que cette question est ancienne, mais j'ai trouvé ce qui pour moi est la solution de contournement parfaite.
J'ajoute ce css à la div que je veux centrer:
div:before {
content: "";
display: inline-block;
height: 100%;
vertical-align: middle;
}
Cela fonctionne à chaque fois et c'est propre.
Edit: Juste pour terminer, j'utilise scss et j'ai un mixin pratique que j'inclus sur chaque parent qui est des enfants directs que je veux centrer verticalement:
@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;
}
}
Explication complète:
div:beforeajoutera un élément à l'intérieur du div, mais avant l'un de ses enfants. Lors de l'utilisation :beforeou :afternous devons utiliser une content:déclaration sinon rien ne se passera, mais pour notre objectif, le contenu peut être vide. Ensuite, nous disons à l'élément d'être aussi grand que son parent, tant que la hauteur de son parent est définie et que cet élément est au moins un bloc en ligne. vertical-aligndéfinit la position verticale de soi par rapport au parent, par opposition à text-aligncela fonctionne différemment.
La @mixindéclaration est pour les utilisateurs sass et elle serait utilisée comme ceci:
div {
@include vertical-align(middle)
}