Это одна из незначительных проблем с CSS, которые постоянно меня беспокоят.
Как люди вокруг Stack Overflow вертикально выравнивают checkboxes и их labels последовательно кроссбраузерность?
Когда я правильно выравниваю их в Safari (обычно используя vertical-align: baseline на input), они полностью отключаются в Firefox и IE.
Исправьте это в Firefox, и Safari и IE неизбежно испортятся. Я трачу на это время каждый раз, когда кодирую форму.
Вот стандартный код, с которым я работаю:
<form>
<div>
<label><input type = "checkbox" /> Label text</label>
</div>
</form>Я обычно использую сброс Эрика Мейера, поэтому элементы формы относительно чисты от переопределений. С нетерпением жду любых советов и уловок, которые вы можете предложить!
Я добился этого, используя атрибуты height и line-height, взгляните на jsfiddle.net/wepw5o57/3
Манипуляция с position и top решит эту проблему. Пример: jsfiddle.net/ynkjc22s
2019. все та же проблема. все еще нужны хаки, чтобы заставить его работать :(
@dieter, посмотри мой ответ, я объяснил, зачем нужны хаки и какой подход не хакерский: stackoverflow.com/a/56558431/3995261






попробуйте vertical-align: middle
также ваш код кажется таким, как будто он должен быть:
<form>
<div>
<input id = "blah" type = "checkbox"><label for = "blah">Label text</label>
</div>
</form><label for = "blah"> необходим только в том случае, если вы используете что-то, что не имеет смысла переносить этикетку (например, текстовое поле; я обычно использую <label for = "blah">Foo</label><input id = "blah" type = "text" /> в этом случае). Я считаю, что с флажками меньше разметки, чтобы обернуть его.
Не совсем так: метка для позволит пользователям щелкнуть метку, чтобы установить флажок, в дополнение к простому щелчку самого флажка. Это очень удобно, чтобы связать два элемента вместе.
Если вход вложен внутри метки, то щелкнув по метке с активировать / переключить фокус на вход; атрибут for предназначен исключительно для случая, когда ввод не вложен.
Это правда One Crayon, но по-прежнему рекомендуется использовать атрибут «for», иначе у вас возникнут проблемы с некоторыми браузерами, которые не распознают этот синтаксис кашель IE.
если вы не хотите, чтобы у вашего флажка был идентификатор, вам нужно обернуть флажок внутри метки
Я обычно оставляю флажок без метки, а затем делаю его «метку» отдельным элементом. Это больно, но между тем, как отображаются флажки и их метки, существует такая большая разница между браузерами (как вы заметили), что это единственный способ приблизиться к контролю за тем, как все выглядит.
По той же причине я поступаю так же при разработке winforms. Я думаю, что основная проблема с флажком состоит в том, что на самом деле это два разных элемента управления: поле и метка. Используя флажок, вы оставляете на усмотрение разработчиков элемента управления, как эти два элемента отображаются рядом друг с другом (и они всегда ошибаются, где неправильно = не то, что вы хотите).
Я очень надеюсь, что у кого-то есть лучший ответ на ваш вопрос.
I'm not the poster of this answer, but at the time of writing this, this is the most voted answer by far in both positive and negative votes (+1035 -17), and it's still marked as accepted answer (probably because the original poster of the question is the one who wrote this answer).
Как уже много раз отмечалось в комментариях, этот ответ больше не работает в большинстве браузеров (и, похоже, не работает с 2013 года).
После более чем часа настройки, тестирования и опробования различных стилей разметки я думаю, что у меня может быть достойное решение. Требования к этому конкретному проекту были:
Прежде чем приступить к каким-либо объяснениям, я просто дам вам код:
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 (взлом звездного свойства). И IE 6, и 7 заметят это, но Safari и Firefox будут игнорировать это должным образом. Я думаю, что это может быть действительный CSS, но вам все же лучше использовать условные комментарии; просто использовал это для простоты.vertical-align, который был согласован во всех браузерах, был vertical-align: bottom. Установка этого, а затем относительное позиционирование вверх ведет себя почти одинаково в Safari, Firefox и IE с одним или двумя несоответствиями.overflow: hidden по какой-то причине обрезает лишнее пространство и позволяет позиционированию IE действовать очень похоже на Safari и Firefox.Надеюсь, это поможет кому-то другому! Я не пробовал эту конкретную технику ни в одном другом проекте, кроме того, над которым работал сегодня утром, поэтому обязательно обращайтесь, если найдете что-то, что работает более стабильно.
Примечание. Вам, вероятно, следует поместить на ярлык атрибут «for», чтобы он работал во всех браузерах и программах для чтения текста. (Я понимаю, что вы, вероятно, оставили это для простоты)
Какое горе, я не осознал, сколько людей игнорируют это: если вы заключаете ввод в тег label, атрибут «for» не нужен. Не стесняйтесь убедиться в этом сами: w3.org/TR/html401/interact/forms.html#h-17.9.1
Я не согласен с предложением об использовании условных комментариев. Сохраните хак * foobar CSS. Это хорошо работает, используется такими фреймворками, как YUI, и позволяет объединить то, что принадлежит друг другу.
Я видел проблемы с IE при переносе ввода меткой. Например, нажатие на метку или же ввода не вызывает курсора. ymmv ...
@ gms8994: можете ли вы воспроизвести ошибку IE, или это анекдотично? Я бы хотел избежать этой конкретной проблемы. :-)
Вы можете переключить все эти значения в пикселях на более полезные значения em, и у вас будет гораздо меньше проблем с размерами шрифта.
@IDisposable: поскольку ни одно из значений пикселей не влияет удаленно на размер шрифта, я не понимаю, почему они лучше использовать em. Если размер флажка не увеличивается при увеличении font-size, пиксели лучше подходят для такого кода позиционирования.
позиция свойств: относительная и значения меньше нуля кажутся мне слишком сложными для повседневного использования - я предпочитаю вариант stackoverflow.com/questions/306252/… с моим добавлением в комментарии
@One Crayon: Это один из тех, кто спасает жизнь за волосы в 4 часа утра. Делал это так много раз раньше, никогда не удавалось найти это решение.
С этим есть большая проблема! Поскольку метка является элементом уровня блока, теперь вы можете щелкнуть справа от текста метки и активировать изменение переключателя / флажка.
Проблема с заключением флажка внутри метки заключается в том, что вы не можете получить доступ к этому правилу: input[type=checkbox]:checked+label
Установка флажка в метку без «for», похоже, не работает для меня в IE6 (под IETester), все другие браузеры кажутся в порядке. Репродукция: jsfiddle.net/2Cz2y/7
Не работает на Android (2.3), в браузере которого флажки больше, чем в других браузерах, поэтому отступ во второй строке был отключен.
@One Crayon: исключение for в label приведет к ошибке в IE6
@Enrique с использованием селектора соседнего брата (+) не работает в IE lt 9 afaik, так что в любом случае это компромисс. Решения JS достойны передергивания, когда существуют чистые решения css, но для этого js может быть лучшим способом.
@jinglesthula: нет, это неправда, отлично работает даже в IE7 (reference.sitepoint.com/css/adjacentsiblingselector)
@One Crayon: -1 на невежественный комментарий. Atømix просто указал на поддержку всех браузеров, по той же причине, по которой вы добавили хак со звездными свойствами.
Читатели текста @OneCrayon могут быть запутаны вводом в метку: «Пока разработчики браузеров не исправят поддержку специальных возможностей, если вы хотите, чтобы элементы управления были понятны пользователям AT [вспомогательные технологии], помечайте элементы управления, используя for и id. Не используйте элемент управления внутри метки метод. Не используйте комбинацию этих 2 методов ". от: blog.paciellogroup.com/2011/07/…
Пробовал это в Chrome 28, Mac OSX, и флажок заметно ниже текста
Я ошибаюсь, с 7 декабря 2013 года флажки выровнены правильно во всех браузерах, без взлома?
Возможно, другие вещи / стили на моей странице вызвали конфликт, но я обнаружил, что для IE7 мне нужно свойство vertical-align: baseline вместо bottom.
верх: -4px; * верх: -2 пикселя; на самом деле сработало лучше всего для меня.
Фантастическое решение! Я просто изменил padding-left и text-indent на 16 пикселей, а не на 15 пикселей, и все работает отлично.
Обратите внимание: похоже, это не работает в последних версиях Chrome (я использую v36). i.imgur.com/y9Ffxsh.png Edit: ни Firefox (v31)
Размещение ввода внутри метки ADA-совместимый / доступный?
Текст слишком высок в Chrome 58 (Windows).
Я создавал флажки через jquery, и что бы я ни делал, текст и флажок всегда будут на отдельных строках. Это исправило его на 100%. Большое спасибо. Я использую Firefox. Надеюсь, он появится и в других браузерах, о чем я скоро узнаю.
Плохо выглядит, много констант, отрицательные значения ... Этот ответ stackoverflow.com/a/494922/4548520 мне кажется намного лучше (первый пример)
Текст находится выше, чем флажок в Edge, Firefox, Chrome (последние версии на момент написания) в Windows 10, по крайней мере, они все примерно в одном и том же положении в каждом браузере, просто нужно настроить.
У меня никогда не было проблем с этим:
<form>
<div>
<input type = "checkbox" id = "cb" /> <label for = "cb">Label text</label>
</div>
</form>
Как я сказал предыдущим авторам, которые рекомендовали это: мне это не нравится, потому что это требует ненужной разметки. Кроме того, я попробовал эту разметку, но было сложно предотвратить обертывание метки под полем ввода (при этом каждая группа меток / ввода по-прежнему располагалась на своих строках).
Итак, вместо «ненужной» разметки (используемой, вероятно, почти все) вы бы предпочли использовать ненужный CSS?
Проблема с упаковкой стоит. Но в целом да, я бы предпочел использовать посторонний CSS, чем разметку, поскольку CSS кэшируется, но разметку, возможно, придется загружать заново для каждой новой страницы.
Сравните: 1 экземпляр лишнего CSS -vs- много экземпляров дополнительной разметки.
Обычно я использую высоту строки, чтобы отрегулировать вертикальное положение моего статического текста:
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>Надеюсь, это поможет.
высота строки, да. Всегда забывай об этом. Хорошая работа, отлично работает.
Попробуйте мое решение, я пробовал его в 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>Интересно; Мне нравится идея плавающих обоих элементов; это элегантно устраняет проблему с упаковкой. Я являюсь привязан к упаковке ввода меткой, но этот код чертовски чище, чем решение, к которому я пришел.
в этом примере поле ввода и метка флажка также должны иметь свойство display: block, и в таком случае они будут обрабатываться как обычные DIV, которые можно легко выровнять
это проблема, что произойдет, если этикетка не умещается в доступном пространстве? метка и флажок разделены (флажок находится вверху вправо, а метка внизу-влево). Если вы поместите флажок внутри ярлыка, у вас не будет этой проблемы.
Он не работал с пикселями, но был достаточно приличным, чтобы все выглядело лучше в трех основных браузерах. Полагаю, я мог бы потратить еще час, чтобы убедиться, что это сработает лучше ...
Иногда для вертикального выравнивания требуется два встроенных элемента (диапазон, метка, ввод и т. д.) Рядом друг с другом для правильной работы. Следующие флажки правильно центрированы по вертикали в 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>Спасибо! "Vertical-align: middle" как на входе, так и на промежутке сработало для меня отлично.
display: block; float: left; кажется лишним
Так разве нельзя опускать атрибут for при использовании диапазона? (например, One Crayon прокомментировал принятый ответ) w3.org/TR/html401/interact/forms.html#h-17.9.1
Вам не нужно использовать атрибут for, если у вас есть ввод внутри метки. Без него работает.
На мой взгляд, это должен быть принятый ответ. Никаких настроек не требуется.
Потрясающе и подтверждено все еще работает в Chrome 58 (Windows) (в отличие от текущего верхнего ответа).
Вам даже не нужен промежуток. Достаточно поставить галочку vertical-align: middle.
вертикальное выравнивание: по центру; И ярлык, и флажок работали для меня из коробки. Больше ничего не нужно
Я отредактировал ответ, чтобы удалить избыточный бит float: left, как предложил @PHPst. Если у вас нет ни одной проблемы по этому поводу, прокомментируйте. Биты display нужны здесь только для выравнивания 3 примеров в строке / столбце.
label>span { vertical-align: calc(4px - 0.125em); } дал мне лучший результат для нескольких размеров шрифта, протестировал Chrome и Firefox. Это заставляет его менять в основном мелкие шрифты. Флажок и переключатель сохраняют выравнивание базовой линии по умолчанию.
У меня это хорошо работает:
fieldset {
text-align:left;
border:none
}
fieldset ol, fieldset ul {
padding:0;
list-style:none
}
fieldset li {
padding-bottom:1.5em;
float:none;
clear:left
}
label {
float:left;
width:7em;
margin-right:1em
}
fieldset.checkboxes li {
clear:both;
padding:.75em
}
fieldset.checkboxes label {
margin:0 0 0 1em;
width:20em
}
fieldset.checkboxes input {
float:left
}<form>
<fieldset class = "checkboxes">
<ul>
<li>
<input type = "checkbox" name = "happy" value = "yep" id = "happy" />
<label for = "happy">Happy?</label>
</li>
<li>
<input type = "checkbox" name = "hungry" value = "yep" id = "hungry" />
<label for = "hungry">Hungry?</label>
</li>
</ul>
</fieldset>
</form>Благослови вас за использование em вместо пикселей.
Ура, спасибо! Это тоже всегда сводило меня с ума.
В моем конкретном случае это сработало для меня:
input {
width: 13px;
height: 13px;
padding: 0;
margin:0;
vertical-align: top;
position: relative;
*top: 1px;
*overflow: hidden;
}
label {
display: block;
padding: 0;
padding-left: 15px;
text-indent: -15px;
border: 0px solid;
margin-left: 5px;
vertical-align: top;
}
Я использую reset.css, который может объяснить некоторые различия, но мне кажется, что он работает хорошо.
Отработка Решение 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>Просто замечание для других: это не будет работать в IE6, потому что он не поддерживает таргетинг CSS [type = checkbox].
Вы можете просто добавить класс вместо использования неподдерживаемых селекторов, если требуется поддержка IE6.
Этот сработал для меня. Однако вместо установки «position: relative; bottom: 1px» вы можете использовать «margin: 0 0 1px 0» для достижения того же результата.
С флажком типа ввода, обернутым внутри метки и перемещенным влево следующим образом:
<label for = "id" class = "checkbox">
<input type = "checkbox" id = "id">
<span>The Label</span>
</label>
это сработало для меня:
label.checkbox {
display: block;
}
.checkbox input {
float: left;
height: 18px;
vertical-align: middle;
}
.checkbox span {
float: left;
line-height: 18px;
margin: 0 0 0 20px;
}
Убедитесь, что высота идентична высоте строки (blocklevel).
input {
margin: 0;
}
на самом деле трюк
также необходимо добавить vertical-align: top или vertical-align: bottom. Зависит от положения, в котором его нужно выровнять
Одна простая вещь, которая, кажется, работает хорошо, - это применить настройку вертикального положения флажка с помощью vertical-align. Он по-прежнему будет варьироваться в зависимости от браузера, но решение несложное.
input {
vertical-align: -2px;
}
Это было наименьшее изменение среди всех остальных, которое у меня работает в самых последних версиях браузеров.
Это работает даже лучше, чем с vertical-align и position: relative, потому что он также корректно работает в IE9 :)
но это зависит от размера шрифта. для больших размеров шрифта необходимо установить более высокие отрицательные значения, например: vertical-align: -6px;
по-видимому, это может лучше работать с другими шрифтами, если установлено в em
Это не лучший способ решения проблемы
vertical-align: middle
Добавление style = "position:relative;top:2px;" в поле ввода переместит его вниз по 2px. Поэтому в зависимости от размера шрифта вы можете перемещать его.
position: relative; имеет некоторые проблемы в IE с z-index и анимацией, такой как jQuery slideUp / slideDown.
CSS:
input[type=checkbox], input[type=radio] {
vertical-align: baseline;
position: relative;
top: 3px;
margin: 0 3px 0 0;
padding: 0px;
}
input.ie7[type=checkbox], input.ie7[type=radio] {
vertical-align: middle;
position: static;
margin-bottom: -2px;
height: 13px;
width: 13px;
}
jQuery:
$(document).ready(function () {
if ($.browser.msie && $.browser.version <= 7) {
$('input[type=checkbox]').addClass('ie7');
$('input[type=radio]').addClass('ie7');
}
});
Стиль, вероятно, нуждается в доработке в зависимости от размера шрифта, используемого в <label>.
PS:
Я использую ie7js, чтобы CSS работал в IE6.
<fieldset class = "checks">
<legend>checks for whatevers</legend>
<input type = "" id = "x" />
<label for = "x">Label</label>
<input type = "" id = "y" />
<label for = "y">Label</label>
<input type = "" id = "z" />
<label for = "z">Label</label>
</fieldset>
В любом случае вам следует обернуть элементы управления формой, сгруппированные вместе в их собственные наборы полей, здесь он играет обертку. установить ввод / метку do display: block, input float left, label float right, установить ширину, управлять интервалом с левым / правым полями, соответствующим образом выровнять текст метки.
так
fieldset.checks {
width:200px
}
.checks input, .checks label {
display:block;
}
.checks input {
float:right;
width:10px;
margin-right:5px
}
.checks label {
float:left;
width:180px;
margin-left:5px;
text-align:left;
text-indent:5px
}
вам, вероятно, потребуется установить границу, контур и высоту строки для обоих решений для кроссбраузерности и мультимедиа.
Если вы используете Веб-формы ASP.NET, вам не нужно беспокоиться о DIV и других элементах или фиксированных размерах. Мы можем выровнять текст <asp:CheckBoxList>, установив float:left на тип ввода CheckboxList в CSS.
Пожалуйста, проверьте следующий пример кода:
.CheckboxList
{
font-size: 14px;
color: #333333;
}
.CheckboxList input
{
float: left;
clear: both;
}
.ASPX-код:
<asp:CheckBoxList runat = "server" ID = "c1" RepeatColumns = "2" CssClass = "CheckboxList">
</asp:CheckBoxList>
<form>
<div>
<label style = "display: inline-block">
<input style = "vertical-align: middle" type = "checkbox" />
<span style = "vertical-align: middle">Label text</span>
</label>
</div>
</form>Хитрость заключается в том, чтобы использовать выравнивание по вертикали только в ячейках таблицы или в строчном блоке при использовании тега метки.
CSS:
.threeCol .listItem {
width:13.9em;
padding:.2em;
margin:.2em;
float:left;
border-bottom:solid #f3f3f3 1px;
}
.threeCol input {
float:left;
width:auto;
margin:.2em .2em .2em 0;
border:none;
background:none;
}
.threeCol label {
float:left;
margin:.1em 0 .1em 0;
}
HTML:
<div class = "threeCol">
<div class = "listItem">
<input type = "checkbox" name = "name" id = "id" value = "checkbox1" />
<label for = "name">This is your checkBox</label>
</div>
</div>
Приведенный выше код разместит элементы вашего списка в трех цветах и просто изменит ширину в соответствии с требованиями.
Я нашел один способ сделать это, который дает одинаковый результат почти во всех браузерах. По крайней мере, современные браузеры. Работает в Firefox, Chrome, Safari, Opera. В IE это будет выглядеть почти так, как если бы для входов или меток не применялись правила (т.е. у него все еще будет метка в несколько пикселей ниже вход), поэтому я думаю, что это простительно.
HTML
<label class = "boxfix"><input type = "radio">Label</label>
CSS
.boxfix {
vertical-align: bottom;
}
.boxfix input {
margin: 0;
vertical-align: bottom;
position: relative;
top: 1.999px; /* the inputs are slightly more centered in IE at 1px (they don't interpret the .999 here), and Opera will round it to 2px with three decimals */
}
Если вы используете Twitter Bootstrap, вы можете просто использовать класс checkbox на <label>:
<label class = "checkbox">
<input type = "checkbox"> Remember me
</label>
Я не полностью протестировал свое решение, но, похоже, оно отлично работает.
Мой 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;
}<label class = "checkbox"><input type = "checkbox" value = "0000">0000 - 0100</label>
<label class = "checkbox"><input type = "checkbox" value = "0100">0100 - 0200</label>
<label class = "checkbox"><input type = "checkbox" value = "0200">0200 - 0300</label>
<label class = "checkbox"><input type = "checkbox" value = "0300">0300 - 0400</label>Если кто-то обнаружит, что это не работает, пожалуйста, дайте мне знать. Вот это в действии (в Chrome и IE - извинения, скриншоты были сделаны на сетчатке и с использованием параллелей для IE):


Это довольно давно, но, поскольку вы просили сообщить вам, это не работает в FireFox (флажки находятся над базовым уровнем). Возможно, вас заинтересует подробный объяснение, который я опубликовал
Может, кто-то совершает ту же ошибку, что и я? Это было ... Я установил ширину для полей ввода, потому что они в основном были типа "текст", но потом забыл переопределить эту ширину для флажков - поэтому мой флажок пытался занять много лишней ширины и поэтому было сложно выровнять этикетку рядом с ним.
.checkboxlabel {
width: 100%;
vertical-align: middle;
}
.checkbox {
width: 20px !important;
}
<label for='acheckbox' class='checkboxlabel'>
<input name = "acheckbox" id='acheckbox' type = "checkbox" class='checkbox'>Contact me</label>
Предоставляет интерактивные метки и правильное выравнивание еще в IE6 (с использованием селектора классов) и в поздних версиях Firefox, Safari и Chrome
Для согласованности с полями формы в браузерах мы используем: размер коробки: рамка-коробка
button, checkbox, input, radio, textarea, submit, reset, search, any-form-field {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
Выбранный ответ с более чем 400 положительными голосами не сработал для меня в Chrome 28 OSX, вероятно, потому, что он не был протестирован в OSX или что он действительно работал во всем, что было в 2008 году, когда на этот вопрос был дан ответ.
Времена изменились, и теперь возможны новые решения CSS3. Мое решение использует псевдоэлементы для создания настраиваемый флажок. Итак, условия (плюсы или минусы, как вы на это смотрите) заключаются в следующем:
div.checkbox {
position: relative;
font-family: Arial;
font-size: 13px;
}
label {
position: relative;
padding-left: 16px;
}
label::before {
content :"";
display: inline-block;
width: 10px;
height: 10px;
background-color: white;
border: solid 1px #9C9C9C;
position: absolute;
top: 1px;
left: 0px;
}
label::after {
content:"";
width: 8px;
height: 8px;
background-color: #666666;
position: absolute;
left: 2px;
top: 3px;
display: none;
}
input[type=checkbox] {
visibility: hidden;
position: absolute;
}
input[type=checkbox]:checked + label::after {
display: block;
}
input[type=checkbox]:active + label::before {
background-color: #DDDDDD;
}<form>
<div class = "checkbox">
<input id = "check_me" type=checkbox />
<label for = "check_me">Label for checkbox</label>
</div>
</form>Это решение скрывает флажок и добавляет псевдоэлементы и стили к метке для создания видимого флажка. Поскольку метка привязана к скрытому флажку, поле ввода все равно будет обновляться, а значение будет отправлено вместе с формой.
И если вам интересно, вот мой взгляд на переключатели: http://jsfiddle.net/DtKrV/2/
Надеюсь, кто-то сочтет это полезным!
попробуйте этот код
input[type = "checkbox"] {
-moz-appearance: checkbox;
-webkit-appearance: checkbox;
margin-left:3px;
border:0;
vertical-align: middle;
top: -1px;
bottom: 1px;
*overflow: hidden;
box-sizing: border-box; /* 1 */
*height: 13px; /* Removes excess padding in IE 7 */
*width: 13px;
background: #fff;
}
Я думаю это самый простой способ
input {
position: relative;
top: 1px;
}<form>
<div>
<label><input type = "checkbox" /> Label text</label>
</div>
<form>вопрос: во всех ли браузерах он работает? ;-)
Итак, я знаю, что на этот вопрос много раз отвечали, но я чувствую, что у меня есть более элегантное решение, чем те, которые уже были предоставлены. И не только одно элегантное решение, но и два разных решения, которые порадуют вас. С учетом сказанного, все, что вам нужно знать и видеть, содержится в двух скриптах JS с комментариями.
Решение №1 полагается на собственный «Флажок» данного браузера, хотя и с изюминкой ... Он содержится в div, который легче позиционировать в кросс-браузере, с переполнением: скрыто, чтобы убрать избыток растянутого флажка на 1 пиксель (это для того, чтобы вы не могли видеть уродливые границы FF)
Простой HTML: (перейдите по ссылке, чтобы просмотреть css с комментариями, блок кода должен удовлетворять требованиям stackoverflow)http://jsfiddle.net/KQghJ/
<label><div class = "checkbox"><input type = "checkbox" /></div> Label text</label>
Решение № 2 использует «Checkbox Toggle Hack» для переключения состояния CSS DIV, который был правильно размещен в браузере, и настройки с помощью простого спрайта для состояния снятого флажка и отмеченного флажка. Все, что нужно, это настроить положение фона с помощью указанного Checkbox Toggle Hack. Это, на мой взгляд, более элегантное решение, поскольку у вас больше контроля над вашими флажками и радио, и вы можете гарантировать, что они будут выглядеть одинаково во всех браузерах.
Простой HTML: (перейдите по ссылке, чтобы просмотреть CSS с комментариями, блок кода должен удовлетворять требованиям StackOverflow)http://jsfiddle.net/Sx5M2/
<label><input type = "checkbox" /><div class = "checkbox"></div>Label text</label>
Если кто-то не согласен с этими методами, пожалуйста, оставьте мне комментарий, я хотел бы услышать отзывы о том, почему другие не сталкивались с этими решениями, или, если они есть, почему я не вижу здесь ответов на них? Если кто-то увидит, что один из этих методов не работает, было бы неплохо увидеть это тоже, но они были протестированы в последних браузерах и полагаются на методы HTML / CSS, которые являются довольно старыми и универсальными, насколько я видел.
Жестко закодируйте высоту и ширину флажка, удалите его отступы и сделайте его высоту плюс вертикальные поля равной высоте строки метки. Если текст метки является встроенным, установите флажок. Firefox, Chrome и IE7 + идентично визуализируют следующий пример: http://www.kornea.com/css-checkbox-align
Хороший! Но вам следует подумать о том, чтобы скопировать здесь код HTML и CSS. Ответы, которые так сильно зависят от внешней ссылки, не приветствуются. Ссылка по-прежнему полезна для просмотра результатов, но я думаю, что показ кода здесь поможет вам получить больше голосов.
нет, они этого не делают (сравните в FireFox и в Chrome, в Chrome флажки находятся над базовой линией), Я объяснил почему
Вы заявляете о том, что не поддерживается даже со скриншотами из обоих браузеров. Ваша задача - предоставить доказательства для заявления, когда вы делаете одно, а не другие, чтобы опровергнуть его. Я сравнивал их и добавлял скриншоты, но комментарии не поддерживают добавление картинок; вы можете взглянуть на картинки в моем ответе. Однако это может отличаться в зависимости от версии браузера, поэтому было бы полезно предоставить снимки экрана с аннотациями, содержащими версии браузера.
Посетите страницу, на которую я ссылался в разных браузерах.
Так я сделал это, а ты? :) Разве вы не видите разницы? imagebin.ca/v/50stCZZGl7Ugimagebin.ca/v/50stNBiv29Ks В то время как в FireFox они идеально выровнены, в Chrome флажок указывает на базовый уровень (кстати, вы можете использовать упоминания через @, если вас интересуют более быстрые ответы)
Не часто люди расходятся во мнениях относительно того, что они видят. Я посмотрел на ваши изображения на уровне пикселей, и они действительно одинаково выровнены. Единственное отличие состоит в том, что флажок Chrome кажется на один пиксель короче, потому что его нижний ряд пикселей светлее, чем строка над ним (то есть то, что глаз видит как нижнюю «границу» флажка, на самом деле является второй снизу строкой. пикселей).
Мне не нравится относительное позиционирование, потому что оно делает элемент визуализированным выше всего остального на своем уровне (он может оказаться поверх чего-то, если у вас сложная компоновка).
Я обнаружил, что vertical-align: sub заставляет флажки выглядеть достаточно хорошо выровненными в Chrome, Firefox и Opera. Не могу проверить Safari, так как у меня нет MacOS, а IE10 немного не работает, но я считаю, что это достаточно хорошее решение для меня.
Другим решением может быть попытка создать определенный CSS для каждого браузера и настроить его с некоторым выравниванием по вертикали в% / пикселей / EM: http://css-tricks.com/snippets/css/browser-specific-hacks/
Кажется, работает, если размер шрифта не слишком большой.
Единственное идеально работающее решение для меня:
input[type=checkbox], input[type=radio] {
vertical-align: -2px;
margin: 0;
padding: 0;
}
Сегодня протестировано в Chrome, Firefox, Opera, IE 7 и 8. Пример: Скрипка
Следующее обеспечивает идеальную согласованность между браузерами, даже IE9:
Подход вполне разумный, вплоть до очевидности:
Это приводит к глобально применимому общему правилу:
input, label {display:block;float:left;height:1em;line-height:1em;}
Размер шрифта настраивается для каждой формы, набора полей или элемента.
#myform input, #myform label {font-size:20px;}
Протестировано в последних версиях Chrome, Safari и Firefox на Mac, Windows, Iphone и Android. И IE9.
Этот метод, вероятно, применим ко всем типам ввода, длина которых не превышает одной строки текста. Примените подходящее правило типа.
хм, это выглядит хорошо, когда метка начинается со строчной буквы, но если она начинается с заглавной, это намного хуже. Не могли бы вы добавить сюда фрагмент?
Теперь, когда flexbox поддерживается во всех современных браузерах, мне кажется, что это более простой подход.
<style>
label {
display: flex;
align-items: center;
}
input[type=radio], input[type=checkbox]{
flex: none;
}
</style>
<form>
<div>
<label><input type = "checkbox" /> Label text</label>
</div>
</form>
Вот полная демонстрация версии с префиксом:
label {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
}
input[type=radio],
input[type=checkbox] {
-webkit-box-flex: 0;
-webkit-flex: none;
-ms-flex: none;
flex: none;
margin-right: 10px;
}
/* demo only (to show alignment) */
form {
max-width: 200px
}<form>
<label>
<input type = "radio" checked>
I am an aligned radio and label
</label>
<label>
<input type = "checkbox" checked>
I am an aligned checkbox and label
</label>
</form>input[type=checkbox]
{
vertical-align: middle;
} <input id = "testCheckbox" name = "testCheckbox" type = "checkbox">
<label for = "testCheckbox">I should align</label>Простое решение:
<label style = "display:block">
<input style = "vertical-align:middle" type = "checkbox">
<span style = "vertical-align:middle">Label</span>
</label>
Протестировано в Chrome, Firefox, IE9 +, Safari, iOS 9+
Я обнаружил, что единственный способ выстроить их в ряд - использовать абсолютную позицию для ввода. Поиграясь с верхней переменной input, я получил желаемый результат.
div {
clear: both;
float: none;
position: relative;
}
input {
left: 5px;
position: absolute;
top: 3px;
}
label {
display: block;
margin-left: 20px;
}
label {
display: inline-block;
padding-right: 10px;
}
input[type=checkbox] {
position: relative;
top: 2px;
}
Возможно, вы захотите добавить объяснение того, чем этот ответ отличается от других 47 ответов.
Поместите каждый флажок и метку в элемент <li>. Добавьте overflow: hidden в <li> и переместите метку и флажок влево. Тогда все они идеально совпадают. Не устанавливайте явно флажок внутри элемента метки.