18

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

8

Заголовок: Проблема вертикального выравнивания checkbox и label в разных браузерах

Это одна из тех мелких проблем с CSS, которые постоянно меня преследуют. Как пользователи Stack Overflow добиваются стабильного вертикального выравнивания checkbox и их labels в разных браузерах?

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

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

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

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

5 ответ(ов)

2

Иногда для корректного отображения вертикального выравнивания необходимо расположить два встроенных (inline) элемента (таких как span, label, input и др.) рядом друг с другом. Приведенные ниже чекбоксы корректно выровнены по вертикали в IE, Safari, Firefox и 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><input type="checkbox"> <span>Label text x</span></label>
    <label><input type="checkbox"> <span>Label text y</span></label>
    <label><input type="checkbox"> <span>Label text z</span></label>
  </div>
</form>

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

.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><input type="checkbox"> <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><input type="checkbox"> <span>Label text y</span></label>
    <label><input type="checkbox"> <span>Label text z</span></label>
  </div>
</form>

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

1

Попробуйте использовать vertical-align: middle.

Также ваш код, скорее всего, должен выглядеть так:

<form>
    <div>
        <input id="blah" type="checkbox"><label for="blah">Текст метки</label>
    </div>
</form>
0

Попробуйте моё решение. Я тестировал его в 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>

Если у вас возникли проблемы с отображением, пожалуйста, убедитесь, что вы применяете вышеупомянутый CSS. Это должно решить проблему с отображением элементов в строку и их выравниванием.

0

Для настройки вертикального положения статического текста я обычно использую свойство line-height. В вашем примере вы можете задать line-height для элемента label и input, чтобы добиться нужного выравнивания:

label {
  line-height: 18px; /* Высота строки для метки */
}
input {
  width: 13px; /* Ширина элемента input */
  height: 18px; /* Высота элемента input */
  font-size: 12px; /* Размер шрифта для текста внутри input */
  line-height: 12px; /* Высота строки для текста внутри input */
}
<form>
  <div>
    <label><input type="checkbox" /> Label text</label>
  </div>
</form>

Это должно помочь вам выровнять текст и элемент управления в соответствии с вашим дизайном. Если у вас будут дополнительные вопросы, не стесняйтесь спрашивать!

0

Да, с тех пор как flexbox поддерживается во всех современных браузерах, использование такого подхода действительно является более простым. Ваш код выглядит отлично. Вы правильно применили flexbox для выравнивания элементов внутри label.

Вот ваш пример с полными префиксами, который обеспечивает поддержку в старых браузерах:

label {
  display: -webkit-box; /* Для старых веб-китов */
  display: -webkit-flex; /* Для старых веб-китов */
  display: -ms-flexbox;  /* Для IE 10 */
  display: flex;         /* Современные браузеры */
  -webkit-box-align: center; /* Для старых веб-китов */
  -webkit-align-items: center; /* Для старых веб-китов */
  -ms-flex-align: center; /* Для IE 10 */
  align-items: center;   /* Современные браузеры */
}

input[type=radio], 
input[type=checkbox] {
  -webkit-box-flex: 0;   /* Для старых веб-китов */
  -webkit-flex: none;    /* Для старых веб-китов */
  -ms-flex: none;        /* Для IE 10 */
  flex: none;            /* Современные браузеры */
  margin-right: 10px;    /* Отступ справа для лучшего вида */
}

/* Для демонстрации выравнивания (только для демонстрационных целей) */
form {
  max-width: 200px;      /* Ограничение ширины формы */
}

И вот HTML-код для демонстрации:

<form>
  <label>
    <input type="radio" checked>
    Я выровненный радио и метка
  </label>
  <label>
    <input type="checkbox" checked>
    Я выровненный чекбокс и метка
  </label>
</form>

С таким подходом элементы будут корректно выровнены и выглядеть аккуратно, что делает его отличным решением для работы с формами. Flexbox значительно упрощает управление выравниванием и расположением элементов на странице.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь