Как вертикально выровнять переключатель html к его метке?


96

У меня есть форма с переключателями, которые находятся в той же строке, что и их метки. Однако переключатели не выровнены по вертикали со своими метками, как показано на снимке экрана ниже.

Радиокнопки.

Как я могу вертикально выровнять радиокнопки с их метками?

Редактировать:

Вот 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/>

И код css:

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

1
Как выглядит ваш код в настоящий момент?
Джордж

@ninjacoder Обновите свой вопрос кодом.
Muthu Kumaran

Ответы:


152

Попробуй это:

input[type="radio"] {
  margin-top: -1px;
  vertical-align: middle;
}

9
Это сработало для меня, однако мне пришлось добавить, height= 100%;поскольку мой родительский элемент явно не устанавливал высоту.
DaKaZ 05

1
Похоже, это дало мне наиболее последовательный подход между Mac, Windows и Linux с использованием Chrome, Firefox или IE. Кроме того, я заметил, что если я добавлю отступ на своей этикетке и помещу радио внутри метки, тогда мне может потребоваться установить для margin-top значение меньше -1px (например, -3px) в зависимости от того, сколько заполнения я использовал на этот ярлык. (Мне нравится придавать своим ярлыкам радиобоксов цвет наведения и эффект закругленных границ, чтобы они выглядели круче.)
Volomike

3
Чтобы объяснить, почему это единственный правильный ответ: некоторые элементы в HTML имеют значения полей или отступов по умолчанию, такие как элементы или переключатели <p> или <li>. Вы можете увидеть это, если войдете в режим разработчика (F12) и наведите указатель мыши на тег. На самом деле это хорошее поведение, потому что сам браузер использует CSS для позиционирования предопределенных элементов, которые затем пользователь может сбросить. Но это может сбивать с толку, если вы вообще не знаете, почему что-то смещено. Поэтому всегда пытайтесь перезаписать настройки, которые вы не устанавливали, если по умолчанию это выглядит странно.
StanE

Это не работает, когда вы увеличиваете или уменьшаете размер шрифта. Пожалуйста, докажите, что я ошибаюсь на рабочем примере!
Protector one

15
input {
    display: table-cell;
    vertical-align: middle
}

Ставлю класс на все радио. Это будет работать для всех переключателей на странице html.

Скрипка


Это, безусловно, лучшее решение, которое я видел. Выравнивание меток радиокнопок мучило меня годами до этого. У меня работает каждый раз.
G-Man

Обратите внимание, что это прерывается, если на этикетке есть несколько строк текста.
Даан

Ваш пример Fiddle также применим padding: 0; margin: 0к элементам ввода, и, похоже, он необходим для правильного выравнивания.
Эммануэль Бур,

14

Я знаю, что выбрал ответ от menuka devinda, но, глядя на комментарии ниже, я согласился и попытался придумать лучшее решение. Мне удалось это придумать, и, на мой взгляд, это гораздо более элегантное решение:

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

Спасибо всем, кто дал ответ, ваш ответ не остался незамеченным. Если у вас все еще есть какие-либо другие идеи, не стесняйтесь добавить свой ответ на этот вопрос.


9

попробуйте добавить vertical-align:topв CSS

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

Тест: http://jsfiddle.net/muthkum/heAWP/


1
Это не работает, когда вы увеличиваете или уменьшаете размер шрифта.
Protector one

@Protectorone Это старый ответ, относящийся к вопросу OP. Если вы пытаетесь сделать то же самое, font-sizeпопробуйте использовать display:flex. Вот демонстрация, jsfiddle.net/et8z47q5
Кумаран

8

Можно было бы также добавить немного гибкости к ответам.

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


7

Сделать можно так:

input {
    vertical-align:middle;
}

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

Очень хорошо. Я хотел выровнять кнопку вместо метки, и это помогло.
posfan12

2

Мне нравится помещать входные данные внутри меток (дополнительный бонус: теперь вам не нужен forатрибут на метке) и помещать vertical-align: middleвходные данные.

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-topдело вкуса.)

Другой вариант, который мне очень нравится, - это стол. (Держите вилки питча! Это действительно здорово!) Это означает, что вам нужно добавить forатрибут ко всем вашим меткам и ids к вашим входам. Я рекомендовал бы этот вариант для этикеток с длинным текстовым содержимым, состоящим из нескольких строк.

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


1

Что-то вроде этого должно работать

CSS:

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

label {
    float: left;
    vertical-align: middle;
}

1
label, input {
    vertical-align: middle;
}

Я просто выравниваю вертикальную среднюю точку блоков с базовой линией родительского блока плюс половину x-высоты (en.wikipedia.org/wiki/X-height) родительского блока.


1

Многие из этих ответов говорят об использовании vertical-align: middle;, что приближает выравнивание, но для меня это все еще не на несколько пикселей. Метод, который я использовал для получения истинного выравнивания 1 к 1 между метками и радио-входами, заключается в следующем 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>


0

Хотя я согласен, что таблицы не следует использовать для макетов дизайна, вопреки распространенному мнению, они проходят проверку. т.е. тег таблицы не устарел. Лучший способ выровнять радиокнопки - использовать средний CSS-код вертикального выравнивания с полями, настроенными на элементах ввода.


-1

Думаю, добавление display:inline-blockярлыков и их предоставление padding-topисправят это. Кроме того, можно было бы просто установить line-heightна этикетках.


-2

Есть несколько способов, один из которых я бы предпочел - использовать таблицу в html. вы можете добавить двухколоночную таблицу из трех строк и разместить переключатели и метку.

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

6
Пожалуйста, не используйте таблицы для разметки.
PeeHaa

4
-1 таблицы не должны использоваться для макета, и этот код не пройдет проверку ... @ninjacoder, какого черта вы выбрали это как "ответ"?
tereško

7
Действительно ... серьезно ... каждый раз, когда кто-то учит использовать таблицы для разметки форм, милый котенок умирает где-нибудь в мире ...
Дэмиен Оверим

2
@PeeHaa, tereško, Damien Overeem Я думаю, что вы, ребята, вероятно, правы, я смог придумать собственное решение, которое я разместил здесь ниже. Спасибо ребята! Мы высоко ценим вашу помощь и советы.
ninjacoder

3
Я пробовал другие варианты, и они не очень хороши. Таблицы рабочие. .tablecell{dispay:table-cell;} ... <div class="tablecell">больше похоже на неудобный обходной путь для людей, которые не хотят признавать, что используют таблицы ...
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.