CSS: ¿Cómo alinear verticalmente una "etiqueta" y una "entrada" dentro de un "div"?

91

Considere el siguiente código :

HTML:

<div>
    <label for='name'>Name:</label>
    <input type='text' id='name' />
</div>

CSS:

div {
    height: 50px;
    border: 1px solid blue;
}

¿Cuál sería el método más fácil para poner labely inputen el medio de div(verticalmente)?

Misha Moroshko
fuente
1
Que yo sepa, la conclusión es "no se puede", y la forma más perezosa de evitarlo es usar un simple <table>y aplicarlo valign='middle'a su <td>s.
BeemerGuy

Respuestas:

95

div {
    display: table-cell;
    vertical-align: middle;
    height: 50px;
    border: 1px solid red;
}
<div>
    <label for='name'>Name:</label>
    <input type='text' id='name' />
</div>

Las ventajas de este método es que puedes cambiar la altura del div, cambiar la altura del campo de texto y cambiar el tamaño de la fuente y todo quedará siempre en el medio.

http://jsfiddle.net/53ALd/6/

Marc-François
fuente
1
parece elegante :) ¿Alguien sabe qué tan compatible con el navegador es este método?
Zaven Nahapetyan
1
Para IE, creo que solo funciona en IE8 o mejor. Para los otros navegadores web está bien.
Marc-François
1
No sabía sobre el display: table-cell. ¿Es eso compatible con ciertos navegadores?
BeemerGuy
6
@Misha, debería haber especificado el hecho de que su entrada / etiqueta estaba absolutamente posicionada. Eso cambia totalmente las circunstancias de la pregunta. Le doy a Marc un +1. Gran respuesta.
jessegavin
2
Estoy bastante seguro de que el punto que Jenson estaba tratando de hacer (y debería haber articulado) es que el uso de display: table-celldivs se comporta de maneras en las que no se espera que se comporten, como la representación de divs subsiguientes en la misma línea / etc.
Taswyn
73

un enfoque más moderno sería usar css flex-box.

div {
  height: 50px;
  background: grey;
  display: flex;
  align-items: center
}
<div>
  <label for='name'>Name:</label>
  <input type='text' id='name' />
</div>

un ejemplo más complejo ... si tiene varios elementos en el flujo flexible, puede usar align-self para alinear elementos individuales de manera diferente a la alineación especificada ...

div {
  display: flex;
  align-items: center
}

* {
  margin: 10px
}

label {
  align-self: flex-start
}
<div>
  <img src="https://de.gravatar.com/userimage/95932142/195b7f5651ad2d4662c3c0e0dccd003b.png?size=50" />
  <label>Text</label>
  <input placeholder="Text" type="text" />
</div>

también es muy fácil de centrar horizontal y verticalmente:

div {
  position:absolute;
  top:0;left:0;right:0;bottom:0;
  background: grey;
  display: flex;
  align-items: center;
  justify-content:center
}
<div>
  <label for='name'>Name:</label>
  <input type='text' id='name' />
</div>

Holger Will
fuente
Desearía que esto funcionara cuando hay una imagen y texto envueltos en la etiqueta. Tengo un pequeño icono seguido de texto, pero el texto no se mueve.
Kevin Scharnhorst
funciona si la etiqueta y el texto son elementos separados, o si también hace que su etiqueta sea un flexbox ...
Holger Will
display:flextiene menos compatibilidad, funciona en Chrome 29+
14

Esto funciona en varios navegadores, proporciona más accesibilidad y viene con menos marcado. deshacerse del div. Envuelva la etiqueta

label{
     display: block; 
     height: 35px; 
     line-height: 35px; 
     border: 1px solid #000; 
}

input{margin-top:15px; height:20px}

<label for="name">Name: <input type="text" id="name" /></label>
Albert
fuente
3
Obviamente, esto no funcionará para una etiqueta de dos líneas. Y si está seguro de que la etiqueta es siempre de una sola línea, existen millones de otras alternativas.
Lashae
16
la pregunta se refería a una etiqueta de una sola línea y respondí en consecuencia. No estoy seguro acerca de sus puntos o intenciones aquí, pero si x es tan obvio, debería ir a hacer un millón de ejemplos. al menos para que pueda regodearse con mi respuesta y sentir el poder de sus millones de victorias. Bravo.
albert
2
Esta es la mejor respuesta para las etiquetas de una sola línea. La especificación dice: "Si no se especifica el atributo for, pero el elemento de etiqueta tiene un descendiente de elemento asociado al formulario etiquetable, entonces el primer descendiente de este tipo en el orden de árbol es el control etiquetado del elemento de etiqueta". Por lo tanto, este es el único enfoque en el que puede omitir los atributos fory idpara lograr la máxima simplicidad.
parlamento
8

Soy consciente de que esta pregunta se hizo hace más de dos años, pero para cualquier espectador reciente, aquí hay una solución alternativa, que tiene algunas ventajas sobre la solución de Marc-François:

div {
    height: 50px;
    border: 1px solid blue;
    line-height: 50px;
}

Aquí simplemente solo agregamos un line-heightigual a la altura del div. La ventaja es que ahora puede cambiar la propiedad de visualización del div como mejor le parezca, inline-blockpor ejemplo, y su contenido permanecerá centrado verticalmente. La solución aceptada requiere que trate el div como una celda de tabla. Esto debería funcionar perfectamente en varios navegadores.

La única otra ventaja es que es solo una regla CSS más en lugar de dos :)

¡Salud!

MusikAnimal
fuente
6

Úselo paddingen el div( superior e inferior ) y vertical-align:middleen el labely input.

ejemplo en http://jsfiddle.net/VLFeV/1/

Gabriele Petrioli
fuente
Eso no funciona en jsfiddle. Cambié la altura del divy el contenido del interior no se movió en absoluto. ¿Me estoy perdiendo de algo?
BeemerGuy
En mi opinión, los diseños no deberían tener alturas de píxeles fijas ... Los diseños deberían fluir con fluidez alrededor del contenido. Sin embargo, vengo de un día y una hora en que los navegadores escalaban el tamaño del texto al acercar y alejar la imagen. Los navegadores recientes escalan toda la página, por lo que la configuración de la altura de los píxeles funciona un poco mejor. Sin embargo, existen razones completamente nuevas para evitar establecer alturas de píxeles ... por ejemplo, técnicas de diseño receptivo. Por eso este sería mi método preferido.
Thirdender
3

Envuelva la etiqueta e ingrese en otro div con una altura definida. Es posible que esto no funcione en versiones de IE inferiores a 8.

position:absolute; 
top:0; bottom:0; left:0; right:0;
margin:auto;
Trevor
fuente
0

Puede usar la display: table-cellpropiedad como en el siguiente código:

div {
     height: 100%;
     display: table-cell; 
     vertical-align: middle;
    }
abahet
fuente