En primer lugar, tenga en cuenta que vertical-alignsolo es aplicable a celdas de tabla y elementos de nivel en línea.
Hay dos formas de lograr alineaciones verticales que pueden o no satisfacer sus necesidades. Sin embargo, te mostraré dos métodos de mis favoritos:
1. Usando transformytop
.valign {
position: relative;
top: 50%;
transform: translateY(-50%);
/* vendor prefixes omitted due to brevity */
}
<div style="position: absolute; left: 50px; top: 50px;">
<div style="text-align: left; position: absolute;height: 56px;background-color: pink;">
<div class="valign" style="background-color: lightblue;">test</div>
</div>
</div>
El punto clave es que un valor de porcentaje en topes relativo al del heightbloque contenedor; Mientras que un valor porcentual en transforms es relativo al tamaño del cuadro en sí (el cuadro delimitador).
Si experimenta problemas de representación de fuente (fuente borrosa), la solución es agregar perspective(1px)a la transformdeclaración para que se convierta en:
transform: perspective(1px) translateY(-50%);
Vale la pena señalar que CSS transform es compatible con IE9 + .
2. Usando inline-block(pseudo-) elementos
En este método, tenemos dos inline-blockelementos hermanos que están alineados verticalmente en el medio por vertical-align: middledeclaración.
Uno de ellos tiene uno heightde 100%sus padres y el otro es nuestro elemento deseado cuyo que queríamos alinear en el medio.
.parent {
text-align: left;
position: absolute;
height: 56px;
background-color: pink;
white-space: nowrap;
font-size: 0; /* remove the gap between inline level elements */
}
.dummy-child { height: 100%; }
.valign {
font-size: 16px; /* re-set the font-size */
}
.dummy-child, .valign {
display: inline-block;
vertical-align: middle;
}
<div style="position: absolute; left: 50px; top: 50px;">
<div class="parent">
<div class="dummy-child"></div>
<div class="valign" style="background-color: lightblue;">test</div>
</div>
</div>
Finalmente, debemos usar uno de los métodos disponibles para eliminar la brecha entre los elementos de nivel en línea .
position: absolutetodas partes?