Как совместить флажки и их метки последовательно в кросс-браузерах - PullRequest
1623 голосов
/ 20 ноября 2008

Это одна из мелких проблем CSS, которая постоянно мучает меня. Как люди вокруг переполнения стека вертикально выравнивают checkboxes и их labels последовательно кросс-браузер ? Всякий раз, когда я корректно выравниваю их в Safari (обычно с помощью vertical-align: baseline на input), они полностью отключаются в Firefox и IE. Исправьте это в Firefox, и Safari и IE неизбежно испортятся. Я трачу время на это каждый раз, когда кодирую форму.

Вот стандартный код, с которым я работаю:

<form>
    <div>
        <label><input type="checkbox" /> Label text</label>
    </div>
</form>

Я обычно использую сброс Эрика Мейера, поэтому элементы формы относительно чисты от переопределений. Ждем любых советов или рекомендаций, которые вы можете предложить!

Ответы [ 38 ]

966 голосов
/ 20 ноября 2008

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

  1. Входы должны быть на отдельной линии.
  2. Входные данные флажков должны выравниваться по вертикали с текстом метки одинаково (если не одинаково) во всех браузерах.
  3. Если текст метки переносится, его необходимо сделать с отступом (поэтому не ставить его под флажок).

Прежде чем я приведу какое-либо объяснение, я просто дам вам код:

label {
  display: block;
  padding-left: 15px;
  text-indent: -15px;
}
input {
  width: 13px;
  height: 13px;
  padding: 0;
  margin:0;
  vertical-align: bottom;
  position: relative;
  top: -1px;
  *overflow: hidden;
}
<form>
  <div>
    <label><input type="checkbox" /> Label text</label>
  </div>
</form>

Вот рабочий пример в JSFiddle .

В этом коде предполагается, что вы используете сброс, такой как Эрик Майер, который не переопределяет поля формы ввода и отступы (следовательно, вводит сброс полей и отступов в CSS ввода). Очевидно, что в реальной среде вы, вероятно, будете вкладывать / переопределять материал для поддержки других элементов ввода, но я хотел, чтобы все было просто.

На что обратить внимание:

  • Объявление *overflow - это встроенный взлом IE (взлом свойства star). И IE 6 и 7 заметят это, но Safari и Firefox будут правильно игнорировать это. Я думаю, что это мог бы быть действительный CSS, но вам все еще лучше с условными комментариями; просто использовал его для простоты.
  • Насколько я могу судить, единственное утверждение vertical-align, которое было одинаковым для всех браузеров, было vertical-align: bottom. Установка этого и затем относительное позиционирование вверх в Safari, Firefox и IE вела себя почти одинаково с разницей в один или два пикселя.
  • Основная проблема в работе с выравниванием заключается в том, что IE накапливает загадочное пространство вокруг элементов ввода. Это не отступы или отступы, и это чертовски настойчиво. Установка ширины и высоты для флажка, а затем overflow: hidden по какой-то причине обрезает дополнительное пространство и позволяет позиционированию IE действовать очень похоже на Safari и Firefox.
  • В зависимости от размера текста, вам, без сомнения, потребуется настроить относительное расположение, ширину, высоту и т. Д., Чтобы все выглядело правильно.

Надеюсь, это поможет кому-то еще! Я не пробовал эту конкретную технику на каких-либо проектах, кроме тех, над которыми я работал этим утром, поэтому определенно подготовьтесь, если найдете что-то, что работает более последовательно.

188 голосов
/ 30 января 2009

Иногда для вертикального выравнивания требуются два встроенных элемента (span, label, input и т. Д.) Рядом друг с другом для правильной работы. Следующие флажки правильно отцентрированы по вертикали в IE, Safari, FF и Chrome, даже если размер текста очень маленький или большой.

Они все плавают рядом друг с другом в одной строке, но nowrap означает, что весь текст метки всегда остается рядом с флажком.

Недостатком являются дополнительные бессмысленные теги SPAN.

.checkboxes label {
  display: inline-block;
  padding-right: 10px;
  white-space: nowrap;
}
.checkboxes input {
  vertical-align: middle;
}
.checkboxes label span {
  vertical-align: middle;
}
<form>
  <div class="checkboxes">
    <label for="x"><input type="checkbox" id="x" /> <span>Label text x</span></label>
    <label for="y"><input type="checkbox" id="y" /> <span>Label text y</span></label>
    <label for="z"><input type="checkbox" id="z" /> <span>Label text z</span></label>
  </div>
</form>

Теперь, если у вас был очень длинный текст метки, который требовал для переноса без переноса под флажком, вы бы использовали отступ и отрицательный отступ для текста на элементах метки:

.checkboxes label {
  display: block;
  padding-right: 10px;
  padding-left: 22px;
  text-indent: -22px;
}
.checkboxes input {
  vertical-align: middle;
}
.checkboxes label span {
  vertical-align: middle;
}
<form>
  <div class="checkboxes">
    <label for="x"><input type="checkbox" id="x" /> <span>Label text x so long that it will probably wrap so let's see how it goes with the proposed CSS (expected: two lines are aligned nicely)</span></label>
    <label for="y"><input type="checkbox" id="y" /> <span>Label text y</span></label>
    <label for="z"><input type="checkbox" id="z" /> <span>Label text z</span></label>
  </div>
</form>
174 голосов
/ 05 апреля 2009

Отработка решения One Crayon , у меня есть кое-что, что работает для меня и проще:

.font2 {font-family:Arial; font-size:32px} /* Sample font */

input[type=checkbox], input[type=radio] {
  vertical-align: middle;
  position: relative;
  bottom: 1px;
}

input[type=radio] { 
  bottom: 2px; 
} 
<label><input type="checkbox" /> Label text</label>
<p class="font2">
  <label><input type="checkbox"/> Label text</label>
</p>

Отрисовывает пиксель за пикселем то же самое в Safari (базовый уровень которого я доверяю), и Firefox и IE7 проверяются как хорошие. Он также работает для шрифтов различных размеров, больших и маленьких. Теперь для исправления базовой линии IE на выборках и входах ...


Обновление: (стороннее редактирование)

Правильная позиция bottom зависит от семейства шрифтов и размера шрифта! Я обнаружил, что использование bottom: .08em; для флажка и радиоэлементов является хорошим общим значением. Я тестировал его в Chrome / Firefox / IE11 в Windows со шрифтами Arial и Calibri, используя несколько шрифтов маленького / среднего / большого размера.

.font2, .font2 input {font-family:Arial; font-size:32px} /* Sample font */

input[type=checkbox], input[type=radio] {
  vertical-align: middle; 
  position: relative;
  bottom: .08em; /* this is a better value for different fonts! */
}
<label><input type="checkbox" /> Label text</label> 

<p class="font2">
  <label><input type="checkbox"/> Label text</label>
</p>
130 голосов
/ 11 мая 2010

Одна простая вещь, которая, кажется, работает хорошо, состоит в том, чтобы применить настройку вертикального положения флажка с вертикальным выравниванием. Это будет по-разному в разных браузерах, но решение несложное.

input {
    vertical-align: -2px;
}

Ссылка

86 голосов
/ 20 ноября 2008

попробуй vertical-align: middle

также ваш код выглядит так:

<form>
    <div>
        <input id="blah" type="checkbox"><label for="blah">Label text</label>
    </div>
</form>
36 голосов
/ 28 декабря 2008

Попробуйте мое решение, я попробовал его в IE 6, FF2 и Chrome, и он рендерил пиксель за пикселем во всех трех браузерах.

* {
  padding: 0px;
  margin: 0px;
}
#wb {
  width: 15px;
  height: 15px;
  float: left;
}
#somelabel {
  float: left;
  padding-left: 3px;
}
<div>
  <input id="wb" type="checkbox" />
  <label for="wb" id="somelabel">Web Browser</label>
</div>
24 голосов
/ 24 февраля 2015

Единственное идеально работающее решение для меня:

input[type=checkbox], input[type=radio] {
    vertical-align: -2px;
    margin: 0;
    padding: 0;
}

Проверено сегодня в Chrome, Firefox, Opera, IE 7 и 8. Пример: Fiddle

19 голосов
/ 21 ноября 2008

Я обычно использую высоту строки, чтобы отрегулировать вертикальное положение моего статического текста:

label {
  line-height: 18px;
}
input {
  width: 13px;
  height: 18px;
  font-size: 12px;
  line-height: 12px;
}
<form>
  <div>
    <label><input type="checkbox" /> Label text</label>
  </div>
</form>

Надеюсь, это поможет.

12 голосов
/ 17 апреля 2013

Я не полностью протестировал свое решение, но, похоже, оно отлично работает.

Мой HTML просто:

<label class="checkbox"><input type="checkbox" value="0000">0000 - 0100</label>

Затем я устанавливаю все флажки на 24px для высоты и ширины. Для выравнивания текста я делаю метку line-height также 24px и назначаю vertical-align: top; следующим образом:

РЕДАКТИРОВАТЬ: После тестирования IE я добавил vertical-align: bottom; к входу и изменил CSS метки. Возможно, вам понадобится условный регистр IE css для сортировки отступов, но текст и поле встроены.

input[type="checkbox"] {
    width: 24px;
    height: 24px;
    vertical-align: bottom;
}
label.checkbox {
    vertical-align: top;
    line-height: 24px;
    margin: 2px 0;
    display: block;
    height: 24px;
}

Если кто-нибудь обнаружит, что это не работает, пожалуйста, дайте мне знать. Вот оно в действии (в Chrome и IE - извинения за то, что скриншоты были сделаны на сетчатке и с использованием параллелей для IE):

screenshot of checkboxes: Chrome screenshot of checkboxes: IE

10 голосов
/ 21 ноября 2013

Я думаю, что это самый простой способ

input {
    position: relative;
    top: 1px;
}

Fiddle

...