Як вертикально вирівняти перемикач html за його міткою?


95

У мене є форма з перемикачами, які знаходяться в тому ж рядку, що і їх ярлики. Однак перемикачі не суміщені вертикально зі своїми мітками, як показано на скріншоті нижче.

Перемикачі.

Як я можу вертикально вирівняти перемикачі за їх мітками?

Редагувати:

Ось 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

Відповіді:


149

Спробуйте це:

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

9
Це працювало для мене, однак мені довелося додати a, height= 100%;оскільки мій батьківський елемент явно не встановив висоту.
DaKaZ

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

3
Щоб пояснити, чому це єдина правильна відповідь: Деякі елементи в HTML мають значення полів або відступів за замовчуванням, наприклад елементи <p> або <li> або перемикачі. Ви можете переконатися в цьому, якщо перейти в режим розробника (F12) і навести вказівник миші на тег. Насправді це хороша поведінка, оскільки браузер сам використовує CSS для позиціонування заздалегідь визначених елементів, які користувач потім може скинути. Але це може заплутати, якщо ви не знаєте, чому взагалі щось зсувається. Тому завжди намагайтеся перезаписати налаштування, які ви не встановили, якщо це виглядає дивним за замовчуванням.
StanE

Здається, це не працює, коли ви збільшуєте або зменшуєте розмір шрифту. Будь ласка, доведіть мені помилку на робочому прикладі!
Захисник один

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

Покладіть клас для всіх радіо. Це буде працювати для всіх перемикачів на сторінці html.

Скрипка


Це, безумовно, найкраще рішення, яке я бачив для цього. Вирівнювання етикетки радіокнопки переслідувало мене роками до цього. Працює кожен раз для мене.
G-Man

Зверніть увагу, що це порушується, коли на мітці є кілька рядків тексту.
Даан,

Ваш приклад скрипки також застосовується padding: 0; margin: 0до елементів введення, і, здається, він потрібен для отримання правильного вирівнювання.
Еммануель Бур,

13

Я знаю, що вибрав анвер за допомогою 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
Це не зберігається, коли ви збільшуєте або зменшуєте розмір шрифту.
Захисник, один

@Protectorone Це стара відповідь і специфічна для питання OP. Якщо ви намагаєтеся зробити те саме з, font-sizeспробуйте скористатися display:flex. Ось демо, jsfiddle.net/et8z47q5
Muthu Kumaran

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

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>


1

Мені подобається вводити входи всередину міток (додатковий бонус: тепер вам не потрібен 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>


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.