¿Cómo alinear verticalmente un botón de radio html a su etiqueta?

95

Tengo un formulario con botones de opción que están en la misma línea que sus etiquetas. Sin embargo, los botones de opción no están alineados verticalmente con sus etiquetas como se muestra en la captura de pantalla a continuación.

Los botones de radio.

¿Cómo puedo alinear verticalmente los botones de opción con sus etiquetas?

Editar:

Aquí está el código html:

<input checked="checked" type="radio" name="user_level" id="rd1" value="1"/>
<label for="rd1">radio 1</label><br/>
<input type="radio" name="user_level" id="rd2" value="2"/>
<label for="rd2">radio 2</label><br/>
<input type="radio" name="user_level" id="rd3" value="3"/>
<label for="rd3">radio 3</label><br/>

Y el código css:

label{
    padding:5px;
    color:#222;
    font-family:corbel,sans-serif;
    font-size: 14px;
    margin: 10px;
}
ninjacoder
fuente
1
¿Cómo es tu código en este momento?
George
@ninjacoder Actualiza tu pregunta con el código.
Muthu Kumaran

Respuestas:

149

Prueba esto:

input[type="radio"] {
  margin-top: -1px;
  vertical-align: middle;
}
zakangelle
fuente
9
Esto funcionó para mí, sin embargo, tuve que agregar un height= 100%;ya que mi elemento principal no estableció explícitamente la altura.
DaKaZ
1
Esto pareció darme el enfoque más consistente entre Mac, Windows y Linux, usando Chrome, Firefox o IE. Además, noté que si le doy relleno a mi etiqueta y pongo la radio dentro de la etiqueta, es posible que deba establecer el margen superior en un valor menor que -1px (como -3px) en función de la cantidad de relleno que estaba usando esa etiqueta. (Me gusta dar mi radio caja de etiquetas de un color estacionario y efecto de borde redondeado para que se vean más fresco.)
Volomike
3
Para explicar por qué esta es la única respuesta correcta: algunos elementos en HTML tienen valores de margen o relleno predeterminados, como los elementos <p> o <li> o botones de opción. Puede ver esto si entra en el modo de desarrollador (F12) y pasa el mouse sobre la etiqueta. En realidad, este es un buen comportamiento, porque el propio navegador usa CSS para posicionar elementos predefinidos que luego el usuario puede restablecer. Pero puede resultar confuso si no sabe por qué algo está desalineado en primer lugar. Por lo tanto, siempre intente sobrescribir la configuración que no estableció, si se ve extraño de forma predeterminada.
StanE
Esto no parece funcionar cuando aumenta o disminuye el tamaño de la fuente. ¡Demuéstreme que estoy equivocado con un ejemplo práctico!
Protector uno
15
input {
    display: table-cell;
    vertical-align: middle
}

Ponle clase a toda la radio. Esto funcionará para todos los botones de opción en la página html.

Violín

vusan
fuente
Esta es, con mucho, la mejor solución que he visto para esto. La alineación de etiquetas de botones de radio me ha atormentado durante años hasta esto. Siempre funciona para mí.
G-Man
Tenga en cuenta que esto se rompe cuando la etiqueta tiene varias líneas de texto.
Daan
Su ejemplo de Fiddle también se aplica padding: 0; margin: 0a los elementos de entrada, y parece ser necesario para obtener la alineación correcta.
Emmanuel Bourg
13

Sé que había seleccionado la respuesta de menuka devinda, pero mirando los comentarios a continuación, estuve de acuerdo e intenté encontrar una solución mejor. Me las arreglé para llegar a esto y, en mi opinión, es una solución mucho más elegante:

input[type='radio'], label{   
    vertical-align: baseline;
    padding: 10px;
    margin: 10px;
 }

Gracias a todos los que dieron una respuesta, su respuesta no pasó desapercibida. Si aún tiene otras ideas, no dude en agregar su propia respuesta a esta pregunta.

ninjacoder
fuente
9

intente agregar vertical-align:topen el css

label{
    padding:5px;
    color:#222;
    font-family:corbel,sans-serif;
    font-size: 14px;
    margin: 10px;
    vertical-align:top;
}​

Prueba: http://jsfiddle.net/muthkum/heAWP/

Muthu Kumaran
fuente
1
Esto no se mantiene cuando aumenta o disminuye el tamaño de fuente.
Protector uno
@Protectorone Esa es una respuesta antigua y específica para la pregunta OP. Si está tratando de hacer lo mismo con font-size, intente usar display:flex. Aquí hay una demostración, jsfiddle.net/et8z47q5
Muthu Kumaran
8

También podría agregar un poco de flexibilidad a las respuestas.

.Radio {
  display: inline-flex;
  align-items: center;
}

.Radio--large {
  font-size: 2rem;
}

.Radio-Input {
  margin: 0 0.5rem 0;
}
<div>
  <label class="Radio" for="sex-female">
    <input class="Radio-Input" type="radio" id="sex-female" name="sex" value="female" />
    Female
  </label>

  <label class="Radio" for="sex-male">
    <input class="Radio-Input" type="radio" id="sex-male" name="sex" value="male" />
    Male
  </label>
</div>


<div>
  <label class="Radio Radio--large" for="sex-female2">
    <input class="Radio-Input" type="radio" id="sex-female2" name="sex" value="female" />
    Female
  </label>

  <label class="Radio Radio--large" for="sex-male2">
    <input class="Radio-Input" type="radio" id="sex-male2" name="sex" value="male" />
    Male
  </label>
</div>

Dominic
fuente
7

Puedes hacer así:

input {
    vertical-align:middle;
}

label{
    color:#222;
    font-family:corbel,sans-serif;
    font-size: 14px;
}

MANIFESTACIÓN

Shailender Arora
fuente
Muy bien. Quería alinear el botón en lugar de la etiqueta, y esto funciona.
posfan12
1

Algo como esto debería funcionar

CSS:

input {
    float: left;
    clear: left;
    width: 50px;
    line-height: 20px;
}

label {
    float: left;
    vertical-align: middle;
}
Damien Overeem
fuente
1
label, input {
    vertical-align: middle;
}

Solo alineo el punto medio vertical de los cuadros con la línea de base del cuadro principal más la mitad de la altura x (en.wikipedia.org/wiki/X-height) del principal.

Pavel Blagodov
fuente
1

Muchas de estas respuestas dicen usar vertical-align: middle;, lo que hace que la alineación se acerque, pero para mí todavía está desviada por unos pocos píxeles. El método que utilicé para obtener una verdadera alineación 1 a 1 entre las etiquetas y las entradas de radio es este, con vertical-align: top;:

label, label>input{
    font-size: 20px;
    display: inline-block;
    margin: 0;
    line-height: 28px;
    height: 28px;
    vertical-align: top;
}
<h1>How are you?</h1>
<fieldset>
	<legend>Your response:</legend>
	<label for="radChoiceGood">
		<input type="radio" id="radChoiceGood" name="radChoices" value="Good">Good
	</label>
	
	<label for="radChoiceExcellent">
		<input type="radio" id="radChoiceExcellent" name="radChoices" value="Excellent">Excellent
	</label>
	
	<label for="radChoiceOk">
		<input type="radio" id="radChoiceOk" name="radChoices" value="OK">OK
	</label>
</fieldset>

JHS
fuente
1

Me gusta poner las entradas dentro de las etiquetas (bonificación adicional: ahora no necesita el foratributo en la etiqueta) y poner vertical-align: middlela entrada.

label > input[type=radio] {
    vertical-align: middle;
    margin-top: -2px;
}

#d2 {  
    font-size: 30px;
}
<div>
	<label><input type="radio" name="radio" value="1">Good</label>
	<label><input type="radio" name="radio" value="2">Excellent</label>
<div>
<br>
<div id="d2">
	<label><input type="radio" name="radio2" value="1">Good</label>
	<label><input type="radio" name="radio2" value="2">Excellent</label>
<div>

( -2px margin-topEs cuestión de gustos).

Otra opción que me gusta mucho es usar una mesa. (¡Mantenga sus horquillas de tono! ¡Es realmente agradable!) Significa que debe agregar el foratributo a todas sus etiquetas y ida sus entradas. Recomendaría esta opción para etiquetas con contenido de texto extenso, en varias líneas.

<table><tr><td>
    <input id="radioOption" name="radioOption" type="radio" />
    </td><td>
    <label for="radioOption">                     
        Really good option
    </label>
</td></tr></table>

Protector uno
fuente
0

Si bien estoy de acuerdo en que las tablas no deben usarse para diseños de diseño, contrariamente a la creencia popular, pasan la validación. es decir, la etiqueta de la tabla no está obsoleta. La mejor manera de alinear los botones de radio es usar el CSS central de alineación vertical con márgenes ajustados en los elementos de entrada.

PixelBlender
fuente
-1

Agregar display:inline-blocketiquetas y dárselas padding-toparreglaría esto, creo. Además, solo establecer line-heighten las etiquetas también lo haría.

Anriëtte Myburgh
fuente
-2

Hay varias formas, una que preferiría es usar una tabla en html. Puede agregar dos tablas de tres filas de colores y colocar los botones de opción y la etiqueta.

<table border="0">

<tr>
  <td><input type="radio" name="sex" value="1"></td>
  <td>radio1</td>

</tr>
<tr>
  <td><input type="radio" name="sex" value="2"></td>
  <td>radio2</td>

</tr>
</table>
nuevo día
fuente
6
No utilice tablas con fines de diseño.
PeeHaa
4
Las tablas -1 no deben usarse para el diseño y este código no pasará la validación ... @ninjacoder, ¿por qué diablos elegiste esto como la "respuesta"?
tereško
7
De hecho ... en serio ... cada vez que alguien enseña a usar tablas para marcar formas, un lindo gatito muere en algún lugar del mundo ..
Damien Overeem
2
@PeeHaa, tereško, Damien Overeem Creo que probablemente tengan razón, he podido encontrar mi propia solución que publiqué a continuación aquí. ¡Gracias chicos! Su ayuda y consejo son muy apreciados.
codificador ninja
3
Probé las otras opciones y no fueron muy buenas. Las mesas funcionan. .tablecell{dispay:table-cell;} ... <div class="tablecell">parece más una solución extraña para las personas que no quieren admitir que están usando tablas ...