Como alinhar verticalmente um botão de rádio html ao seu rótulo?

94

Eu tenho um formulário com botões de opção que estão na mesma linha de seus rótulos. Os botões de opção, entretanto, não estão alinhados verticalmente com seus rótulos, conforme mostrado na captura de tela abaixo.

Os botões de rádio.

Como posso alinhar verticalmente os botões de opção com seus rótulos?

Editar:

Aqui está o 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/>

E o código css:

label{
    padding:5px;
    color:#222;
    font-family:corbel,sans-serif;
    font-size: 14px;
    margin: 10px;
}
ninjacoder
fonte
1
Como está o seu código no momento?
George
@ninjacoder Atualize sua pergunta com o código.
Muthu Kumaran

Respostas:

147

Experimente isto:

input[type="radio"] {
  margin-top: -1px;
  vertical-align: middle;
}
zakangelle
fonte
9
Isso funcionou para mim, entretanto, eu tive que adicionar um, height= 100%;já que meu elemento pai não definiu explicitamente a altura.
DaKaZ
1
Isso parecia me dar a abordagem mais consistente entre Mac, Windows e Linux, usando Chrome, Firefox ou IE. Além disso, percebi que, se eu der preenchimento em minha etiqueta e colocar o rádio dentro dela, talvez seja necessário definir a margem superior para um valor inferior a -1px (como -3px) com base em quanto preenchimento eu estava usando em esse rótulo. (Gosto de dar aos rótulos da minha caixa de rádio uma cor flutuante e efeito de borda arredondada para torná-los mais
legais
3
Para explicar por que esta é a única resposta correta: Alguns elementos em HTML têm valores de margem ou preenchimento padrão, como os elementos <p> ou <li> ou botões de opção. Você pode ver isso se entrar no modo de desenvolvedor (F12) e passar o mouse sobre a tag. Na verdade, esse é um bom comportamento, porque o próprio navegador usa CSS para posicionar elementos predefinidos que o usuário pode redefinir. Mas pode ser confuso se você não souber por que algo está desalinhado em primeiro lugar. Portanto, sempre tente sobrescrever as configurações que você não definiu, se parecer estranho por padrão.
StanE,
Isso não parece funcionar quando você aumenta ou diminui o tamanho da fonte. Por favor, prove que estou errado com um exemplo funcional!
Protetor um de
15
input {
    display: table-cell;
    vertical-align: middle
}

Coloque aula para todos os rádios. Isso funcionará para todos os botões de opção na página html.

Violino

vusan
fonte
Esta é de longe a melhor solução que já vi para isso. O alinhamento da etiqueta do botão de rádio tem me atormentado por anos até agora. Funciona todas as vezes para mim.
G-Man de
Observe que isso é quebrado quando o rótulo tem várias linhas de texto.
Daan
13

Sei que selecionei a resposta de menuka devinda, mas olhando os comentários abaixo concordei e tentei encontrar uma solução melhor. Consegui pensar nisso e, na minha opinião, é uma solução muito mais elegante:

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

Obrigado a todos que responderam, sua resposta não passou despercebida. Se você ainda tiver outras idéias, sinta-se à vontade para adicionar sua própria resposta a esta pergunta.

ninjacoder
fonte
9

tente adicionar vertical-align:topao css

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

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

Muthu Kumaran
fonte
1
Isso não acontece quando você aumenta ou diminui o tamanho da fonte.
Protetor um de
@Protectorone Essa é uma resposta antiga e específica para a questão do OP. Se você está tentando fazer o mesmo com font-size, tente usar display:flex. Aqui está uma demonstração, jsfiddle.net/et8z47q5
Muthu Kumaran
8

Pode muito bem adicionar um pouco de flexibilidade às respostas.

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

Você pode fazer assim:

input {
    vertical-align:middle;
}

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

DEMO

Shailender Arora
fonte
Muito bom. Eu queria alinhar o botão em vez do rótulo, e isso resolve o problema.
posfan12 de
1

Algo assim deve funcionar

CSS:

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

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

Estou apenas alinhando o ponto médio vertical das caixas com a linha de base da caixa pai mais metade da altura x (en.wikipedia.org/wiki/X-height) do pai.

Pavel Blagodov
fonte
1

Muitas dessas respostas dizem para usar vertical-align: middle;, o que aproxima o alinhamento, mas para mim ainda está errado por alguns pixels. O método que usei para obter o verdadeiro alinhamento 1 para 1 entre os rótulos e as entradas de rádio é este, com 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
fonte
1

Eu gosto de colocar as entradas dentro dos rótulos (bônus adicional: agora você não precisa do foratributo no rótulo) e colocar vertical-align: middlea 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>

(Isso -2px margin-topé uma questão de gosto.)

Outra opção que gosto muito é usar uma mesa. (Segure seus pitch forks! É muito bom!) Isso significa que você precisa adicionar o foratributo a todos os seus rótulos e ids às suas entradas. Eu recomendei essa opção para rótulos com conteúdo de texto longo, em várias linhas.

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

Protetor um
fonte
0

Embora eu concorde que as tabelas não devem ser usadas para layouts de design, ao contrário da crença popular, elas passam na validação. ou seja, a tag da tabela não está obsoleta. A melhor maneira de alinhar os botões de opção é usando o CSS do meio de alinhamento vertical com as margens ajustadas nos elementos de entrada.

PixelBlender
fonte
-1

Adicionar display:inline-blockrótulos e dar a eles padding-topresolveria isso, eu acho. Além disso, apenas definir line-heightnos rótulos também faria.

Anriëtte Myburgh
fonte
-3

Existem várias maneiras, uma que eu preferiria é usar uma tabela em html. você pode adicionar uma tabela de duas colunas e três linhas e colocar os botões de opção e a 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>
novo dia
fonte
6
Não use tabelas para fins de layout.
PeeHaa de
4
As tabelas -1 não devem ser usadas para o layout e esse código não vai passar na validação ... @ninjacoder, por que diabos você escolheu isso como a "resposta"?
tereško
7
De fato .. sério .. toda vez que alguém ensina a usar tabelas para marcação de formulário, um gatinho fofo morre em algum lugar do mundo ..
Damien Overeem
2
@PeeHaa, tereško, Damien Overeem Acho que vocês provavelmente estão certos, eu consegui encontrar minha própria solução que postei abaixo aqui. Obrigado rapazes! Sua ajuda e conselho são muito apreciados.
ninjacoder
2
Eu tentei as outras opções e não foram muito boas. As tabelas funcionam. .tablecell{dispay:table-cell;} ... <div class="tablecell">parece mais uma solução alternativa para pessoas que não querem admitir que estão usando tabelas ...