Sé que esta pregunta es antigua, pero encontré lo que para mí es la solución perfecta.
Agrego este CSS al div que quiero centrar:
div:before {
content: "";
display: inline-block;
height: 100%;
vertical-align: middle;
}
Esto funciona todo el tiempo y está limpio.
Editar: Solo para completar, uso scss y tengo una combinación útil que incluyo en todos los padres que son hijos directos que quiero tener centrados 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;
}
}
Explicación completa:
div:before
agregará un elemento dentro del div, pero antes de cualquiera de sus hijos. Cuando usamos :before
o :after
debemos usar una content:
declaración, de lo contrario no pasará nada, pero para nuestro propósito, el contenido puede estar vacío. Luego le decimos al elemento que sea tan alto como su padre, siempre que la altura de su padre esté definida y este elemento sea al menos un bloque en línea. vertical-align
define la posición vertical de uno mismo relacionado con el padre, en oposición a text-align
que funciona de manera diferente.
La @mixin
declaración es para usuarios sass y se usaría así:
div {
@include vertical-align(middle)
}