Давайте наконец посмотрим на источник проблемы
Флажки отображаются с помощью изображений (можно установить пользовательские с помощью CSS). Вот (не отмеченный) флажок в FireFox, выделенный инспектором DOM:
И вот такой же неустановленный флажок в Chrome:
Вы можете увидеть поле (оранжевый); отступа нет (будет показано зеленым). Так что же это за псевдо-поле справа и снизу флажка? Это части изображения, используемые для флажка . Вот почему с помощью простоvertical-align: middle
не достаточно, и это является источником кросс-браузерных проблем.
Так что мы можем с этим поделать?
Один очевидный вариант - заменить изображения! К счастью, это можно сделать с помощью CSS и заменить их внешними изображениями, изображениями base64 (in-CSS), SVG в CSS или просто псевдоэлементами. Это надежный (кросс-браузерный!) Подход, и вот пример такой настройки, украденной из этого вопроса :
.checkbox-custom {
opacity: 0;
position: absolute;
}
.checkbox-custom,
.checkbox-custom-label {
display: inline-block;
vertical-align: middle;
margin: 5px;
cursor: pointer;
}
.checkbox-custom + .checkbox-custom-label:before {
content: '';
display: inline-block;
background: #fff;
border-radius: 5px;
border: 2px solid #ddd;
vertical-align: middle;
width: 10px;
height: 10px;
padding: 2px;
margin-right: 10px;
text-align: center;
}
.checkbox-custom:checked + .checkbox-custom-label:before {
width: 1px;
height: 5px;
border: solid blue;
border-width: 0 3px 3px 0;
transform: rotate(45deg);
-webkit-transform: rotate(45deg);
-ms-transform: rotate(45deg);
border-radius: 0px;
margin: 0px 15px 5px 5px;
}
<div>
<input id="checkbox-1" class="checkbox-custom" name="checkbox-1" type="checkbox">
<label for="checkbox-1" class="checkbox-custom-label">First Choice</label>
</div>
<div>
<input id="checkbox-2" class="checkbox-custom" name="checkbox-2" type="checkbox">
<label for="checkbox-2" class="checkbox-custom-label">Second Choice</label>
</div>
Возможно, вы захотите прочитать более подробные статьи о таком стиле, как некоторые из перечисленных здесь ; это выходит за рамки этого ответа.
Хорошо, все же, что насчет решения «нет пользовательских изображений или псевдоэлементов»?
TL; DR: похоже, это не сработает, вместо этого используйте пользовательский флажок
Во-первых, давайте заметим, что если в других браузерах эти псевдо-поля внутри значка флажка были произвольными, единого решения не было. Чтобы создать его, мы должны изучить анатомию таких изображений в существующих браузерах.
Итак, какие браузеры имеют псевдо-поля в флажках? Я проверил Chrome 75, Vivaldi 2.5 (на основе хрома), FireFox 54 (не спрашивайте, почему такие устаревшие), IE 11, Edge 42, Safari ?? (одолжил одну на минуту, забыл проверить версию). Только Chrome и Vivaldi имеют такие псевдо-поля (я подозреваю, что все браузеры на основе Chromium, такие как Opera).
Каков размер этих псевдо-полей? Чтобы понять это, можно использовать увеличенный флажок:
input {
zoom: 10;
box-shadow: 0 0 1px inset #999;
}
<input type=checkbox>
мой результат составляет ~ 7% от ширины / высоты и, следовательно, 0,9-1,0px в абсолютных единицах. Точность может быть поставлена под сомнение, хотя: попробуйте различные значения zoom
для флажка. В моих тестах как в Chrome, так и в Vivaldi относительный размер псевдо-поля сильно различался при zoom
значениях 10, 20 и 11–19 (??):
scale
кажется более последовательным:
input {
transform: scale(10) translate(50%, 50%);
box-shadow: 0 0 1px inset #999;
}
<input type=checkbox>
поэтому, вероятно, ~ 14% и 2px - правильные значения.
Теперь, когда мы знаем (?) Размер псевдо-поля, отметим, что этого недостаточно. Являются ли размеры значков флажков одинаковыми для всех браузеров? Увы! Вот что показывает инспектор DOM для неустановленных флажков:
- FireFox: 13,3 пикселей
- На основе хрома: 12,8 пикселя в целом, следовательно, 12,8 (100% - 14%) = 11 пикселей для того, что визуально воспринимается как флажок
- IE 11, Edge: 13px
- Safari: н / д (я думаю, их следует сравнивать на одном экране)
Теперь, прежде чем обсуждать какие-либо решения или хитрости, давайте спросим: что является правильным выравнивание? Чего мы пытаемся достичь? До определенного момента это дело вкуса, но в основном я могу думать о следующих «хороших» аспектах выравниваний:
текст и флажок на одной и той же базовой линии (я специально не настраиваю здесь размер флажка):
или иметь одинаковую среднюю строку в терминах строчных букв:
или та же средняя строка с точки зрения заглавных букв (легче увидеть разницу для разного размера шрифта):
а также мы должны решить, должен ли размер флажка быть равен высоте строчной буквы, заглавной буквы или чего-то еще (больше, меньше или между строчной и заглавной буквой).
Для этого обсуждения давайте назовем выравнивание хорошим, если флажок находится на той же базовой линии, что и текст, и имеет размер заглавной буквы (весьма спорный выбор):
Теперь, какие инструменты мы должны:
- настроить размер флажка
- распознает Chromium с его псевдо-маргинальным флажком и устанавливает определенные стили
- настроить флажок / метка вертикальное выравнивание
?
Что касается корректировки размера флажка : есть width
, height
, size
, zoom
, scale
(у меня что - то пропустил?). zoom
и scale
не разрешают устанавливать абсолютный размер, поэтому они могут помочь только в адаптации к размеру текста, но не в кросс-браузерном размере (если мы не можем написать правила для браузера). size
не работает с Chrome (он работал со старым IE? в любом случае, это не так интересно). width
а такжеheight
работать в Chrome и других браузерах, поэтому мы можем установить общий размер, но опять же, в Chrome он устанавливает размер всего изображения, а не сам флажок. Примечание: это минимум (ширина, высота), который определяет размер флажка (если ширина ≠ высота, область вне квадрата флажка добавляется к «псевдо-полям»).
К сожалению, псевдо-поля в Chrome не установлены на ноль для любой ширины и высоты, насколько я вижу.
Боюсь, в наши дни не существует надежного метода только для CSS .
Давайте рассмотрим вертикальное выравнивание. vertical-align
не может дать согласованные результаты, когда установлено middle
или baseline
из-за псевдо-поля Chrome, единственная реальная возможность получить одинаковую «систему координат» для всех браузеров - это выровнять метку и ввести в top
:
(на картинке: выравнивание по вертикали: верх, низ и низ без тени)
Так какой результат мы получаем от этого?
input[type="checkbox"] {
height: 0.95em;
width: 0.95em;
}
label, input {
vertical-align: top;
}
<label><input type="checkbox">label</label>
Приведенный выше фрагмент кода работает с Chrome (браузеры на основе Chromium), но для других браузеров требуется меньший размер флажка. Кажется невозможным отрегулировать как размер, так и вертикальное выравнивание таким образом, чтобы обойти причуду изображения в Chromium. Мое последнее предложение: используйте вместо этого пользовательские флажки - и вы избежите разочарования :)