Comment aligner verticalement un bouton radio html sur son étiquette?

95

J'ai un formulaire avec des boutons radio qui sont sur la même ligne que leurs étiquettes. Les boutons radio ne sont cependant pas alignés verticalement avec leurs étiquettes comme indiqué dans la capture d'écran ci-dessous.

Les boutons radio.

Comment puis-je aligner verticalement les boutons radio avec leurs étiquettes?

Éditer:

Voici le code 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/>

Et le code css:

label{
    padding:5px;
    color:#222;
    font-family:corbel,sans-serif;
    font-size: 14px;
    margin: 10px;
}
ninjacodeur
la source
1
À quoi ressemble votre code en ce moment?
George
@ninjacoder Mettez à jour votre question avec le code.
Muthu Kumaran

Réponses:

149

Essaye ça:

input[type="radio"] {
  margin-top: -1px;
  vertical-align: middle;
}
zakangelle
la source
9
Cela a fonctionné pour moi, mais j'ai dû ajouter un height= 100%;car mon élément parent ne définissait pas explicitement la hauteur.
DaKaZ
1
Cela semble me donner l'approche la plus cohérente entre Mac, Windows et Linux, en utilisant Chrome, Firefox ou IE. De plus, j'ai remarqué que si je donne un rembourrage sur mon étiquette et que je mets la radio à l'intérieur de l'étiquette, alors je devrai peut-être définir margin-top à une valeur inférieure à -1px (comme -3px) en fonction de la quantité de remplissage que j'utilisais. cette étiquette. (J'aime donner à mes étiquettes de boîte radio une couleur de survol et un effet de bordure arrondie pour leur donner un aspect plus frais.)
Volomike
3
Pour expliquer pourquoi c'est la seule bonne réponse: certains éléments en HTML ont des valeurs de marge ou de remplissage par défaut, comme les éléments <p> ou <li> ou les boutons radio. Vous pouvez le voir si vous passez en mode développeur (F12) et passez votre souris sur la balise. En fait, c'est un bon comportement, car le navigateur lui-même utilise CSS pour positionner des éléments prédéfinis que l'utilisateur peut ensuite réinitialiser. Mais cela peut être déroutant si vous ne savez pas pourquoi quelque chose est mal aligné en premier lieu. Essayez donc toujours d'écraser les paramètres que vous n'avez pas définis, si cela semble étrange par défaut.
StanE
Cela ne semble pas fonctionner lorsque vous augmentez ou diminuez la taille de la police. Veuillez me prouver le contraire avec un exemple fonctionnel, cependant!
Protector one
15
input {
    display: table-cell;
    vertical-align: middle
}

Mettez de la classe pour toutes les radios. Cela fonctionnera pour tous les boutons radio de la page html.

Violon

Vusan
la source
C'est de loin la meilleure solution que j'ai vue pour cela. L'alignement des étiquettes des boutons radio me tourmente depuis des années. Fonctionne à chaque fois pour moi.
G-Man
Notez que cela se rompt lorsque l'étiquette comporte plusieurs lignes de texte.
Daan
Votre exemple Fiddle s'applique également padding: 0; margin: 0aux éléments d'entrée, et il semble nécessaire pour obtenir le bon alignement.
Emmanuel Bourg
13

Je sais que j'avais choisi la réponse de menuka devinda, mais en regardant les commentaires ci-dessous, je suis d'accord et j'ai essayé de trouver une meilleure solution. J'ai réussi à trouver cela et à mon avis c'est une solution beaucoup plus élégante:

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

Merci à tous ceux qui ont offert une réponse, votre réponse n'est pas passée inaperçue. Si vous avez encore d'autres idées, n'hésitez pas à ajouter votre propre réponse à cette question.

ninjacodeur
la source
9

essayez d'ajouter vertical-align:topdans le css

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

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

Muthu Kumaran
la source
1
Cela ne tient pas lorsque vous augmentez ou diminuez la taille de la police.
Protector one
@Protectorone C'est une vieille réponse et spécifique à la question OP. Si vous essayez de faire de même avec, font-sizeessayez d'utiliser display:flex. Voici une démo, jsfiddle.net/et8z47q5
Muthu Kumaran
8

Pourrait aussi ajouter un peu de flexibilité aux réponses.

.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>

Dominique
la source
7

Vous pouvez faire comme ceci:

input {
    vertical-align:middle;
}

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

DEMO

Shailender Arora
la source
Très bien. Je voulais aligner le bouton au lieu de l'étiquette, et cela fait l'affaire.
posfan12
1

Quelque chose comme ça devrait fonctionner

CSS:

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

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

Je suis juste aligner le milieu vertical des boîtes avec la ligne de base de la boîte parent plus la moitié de la hauteur x (en.wikipedia.org/wiki/X-height) du parent.

Pavel Blagodov
la source
1

Beaucoup de ces réponses disent à utiliser vertical-align: middle;, ce qui rapproche l'alignement mais pour moi, il est toujours décalé de quelques pixels. La méthode que j'ai utilisée pour obtenir un véritable alignement 1 à 1 entre les étiquettes et les entrées radio est la suivante, avec 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
la source
1

J'aime mettre les entrées à l'intérieur des étiquettes (bonus supplémentaire: maintenant vous n'avez plus besoin de l' forattribut sur l'étiquette), et mettre vertical-align: middlesur l'entrée.

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>

(C'est -2px margin-topune question de goût.)

Une autre option que j'aime beaucoup est d'utiliser une table. (Tenez vos fourches! C'est vraiment sympa!) Cela signifie que vous devez ajouter l' forattribut à toutes vos étiquettes et idà vos entrées. J'avais recommandé cette option pour les étiquettes avec un long contenu textuel, sur plusieurs lignes.

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

Protecteur un
la source
0

Bien que je sois d'accord, les tableaux ne doivent pas être utilisés pour les mises en page de conception contrairement à la croyance populaire, ils passent la validation. autrement dit, la balise table n'est pas obsolète. La meilleure façon d'aligner les boutons radio est d'utiliser le CSS central d'alignement vertical avec des marges ajustées sur les éléments d'entrée.

PixelBlender
la source
-1

Ajouter display:inline-blockdes étiquettes et leur donner padding-topréglerait ce problème, je pense. En outre, il suffit de définir line-heightles étiquettes sur les étiquettes.

Anriëtte Myburgh
la source
-2

il y a plusieurs façons, je préférerais utiliser une table en html. vous pouvez ajouter deux colonnes trois rangées de table et placer les boutons radio et l'étiquette.

<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>
nouveau jour
la source
6
Veuillez ne pas utiliser de tableaux à des fins de mise en page.
PeeHaa
4
-1 tables ne doivent pas être utilisées pour la mise en page et ce code ne passera pas la validation ... @ninjacoder, pourquoi diable avez-vous choisi cela comme "réponse"?
tereško
7
En effet ... sérieusement ... chaque fois que quelqu'un apprend à utiliser des tableaux pour le balisage de formulaire, un mignon chaton meurt quelque part dans le monde ..
Damien Overeem
2
@PeeHaa, tereško, Damien Overeem Je pense que vous avez probablement raison, j'ai pu trouver ma propre solution que j'ai publiée ci-dessous ici. Merci les gars! Votre aide et vos conseils sont très appréciés.
ninjacoder
3
J'ai essayé les autres options et elles n'étaient pas très bonnes. Les tables fonctionnent. .tablecell{dispay:table-cell;} ... <div class="tablecell">semble plus comme une solution de contournement bancale pour les personnes qui ne veulent pas admettre qu'elles utilisent des tables ...