2011-11-01 10 views
28

La propiedad css vertical-align: middle no funciona en este ejemplo.vertical-alinear: medio no funciona

HTML:

<div> 
    <span class='twoline'>Two line text</span> 
    <span class='float'> Float right </span> 
</div> 

CSS:

.float { 
    float: right; 
} 

.twoline { 
    width: 50px; 
    display: inline-block; 
} 

div { 
    border: solid 1px blue; 
    vertical-align: middle; 
} 

El span que está flotando a la derecha no está centrada verticalmente con respecto a su div que contiene. ¿Cómo puedo tenerlo verticalmente centrado?

El código anterior está en this fiddle.

Respuesta

31

Debe envolver su elemento en table-cell, dentro de table usando display.

De esta manera:

<div> 
    <span class='twoline'>Two line text</span> 
    <span class='float'>Float right</span> 
</div> 

y

.float { 
    display: table-cell; 
    vertical-align: middle; 
    text-align: right; 
} 
.twoline { 
    width: 50px; 
    display: table-cell; 
} 
div { 
    display: table; 
    border: solid 1px blue; 
    width: 500px; 
    height: 100px; 
} 

Se muestra aquí: http://jsfiddle.net/e8ESb/7/

+1

Esto funciona bien * sin * establecer una altura fija: http://jsfiddle.net/e8ESb/9/ (Su solución implica que el DIV debe tener una altura fija para que funcione ...) –

+1

la altura extra simplemente hace que sea más fácil ver que el elemento está verticalmente centrado, nada más. Pensé que mi explicación sería suficiente. –

+0

¿Es necesario que los padres tengan 'display: table'? Porque probé este escenario en FF sin él y funciona. –

6

La alineación vertical no funciona del modo que usted desea. Ver: http://phrogz.net/css/vertical-align/index.html

Esto no es bonito, pero HARÁ lo que quieras: la alineación vertical se comporta como se esperaba solo cuando se usa en una celda de la tabla.

http://jsfiddle.net/e8ESb/6/

hay otras alternativas: Se puede declarar cosas como tablas o celdas de la tabla dentro de CSS para hacer que se comporten como se desee, por ejemplo. Los márgenes y el posicionamiento a veces se pueden jugar para obtener el mismo efecto. Ninguna de las soluciones es terriblemente bonita, sin embargo.

+0

es muy, muy lejos de ser "muy difícil". simplemente puede agregar la propiedad de visualización de CSS para representar la estructura de tabla necesaria para alinear verticalmente para trabajar. –

+1

Bien, en este caso, al menos, no es difícil. Lo he sacado. Sin embargo, hay otras situaciones en las que puede volverse más difícil de lo esperado. – GlyphGryph

1

La respuesta dada por Matt K funciona perfectamente bien.

Sin embargo, es importante tener en cuenta una cosa: Si el div que está aplicando tiene un posicionamiento absoluto, no funcionará. Para que funcione, hacer esto -

<div style="position:absolute; hei..."> 
    <div style="position:relative; display: table-cell; vertical-align:middle; hei..."> 
     <!-- here position MUST be relative, this div acts as a wrapper--> 
     ... 
    </div> 
</div> 
1

deberá ajustar un valor fijo a la propiedad de su período de line-height:

.float, .twoline { 
    line-height: 100px; 
} 
+0

Esto puede ser una solución ordenada cuando la altura del contenedor es fija, siempre que el contenido del texto sea absolutamente positivo y nunca se envuelva. –