Давайте, нарешті, поглянемо на джерело проблеми
Прапорці відображаються за допомогою зображень (можна встановити власні за допомогою CSS). Ось (не поставлений галочку) прапорець у FireFox, виділений інспектором DOM:
А ось такий же нестиркий прапорець у Chrome:
Ви можете бачити маржу (помаранчевий); прокладки немає (було б показано зеленим). Отже, що це за псевдополя праворуч і внизу прапорця? Це частини зображення, які використовуються для прапорця . Ось чому використання просто vertical-align: middle
насправді недостатньо, і це джерело проблем із перехресним браузером.
То що ми можемо з цим зробити?
Один очевидний варіант - замінити зображення! На щастя, це можна зробити за допомогою CSS та замінити зображення зовнішніми зображеннями, зображеннями base64 (в CSS), in-CSS svg або просто псевдоелементами. Це надійний (крос-браузер!) Підхід, і ось приклад такого коригування, викраденого з цього питання :
.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,0 пікселів в абсолютних одиницях. Хоча може бути поставлена під сумнів точність: спробуйте різні значення zoom
для прапорця. У моїх тестах як у Chrome, так і у Вівальді відносний розмір псевдо-поля дуже відрізняється при 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, Край: 13 пікселів
- Safari: n / a (я вважаю, це слід порівнювати на одному екрані)
Тепер, перш ніж ми обговоримо будь-які рішення чи хитрощі, давайте запитаємо: що таке правильне вирівнювання? Чого ми намагаємось досягти? До певного моменту це питання смаку, але в основному я можу придумати такі "приємні" аспекти вирівнювання:
текст і прапорець на тій же базовій лінії (я навмисно не змінюю розмір прапорця тут):
або мати однаковий середній рядок у вигляді малих літер:
або однакова середня лінія з великої літери (простіше помітити різницю для різного розміру шрифту):
а також ми маємо вирішити, чи розмір прапорця повинен бути рівний висоті малої літери, великої літери чи чогось іншого (більшого, меншого розміру або між малим і великим літером).
Для цього обговорення давайте назвемо вирівнювання приємним, якщо прапорець розташований на тій же базовій лінії, що і текст, і має розмір великої літери (дуже спірний вибір):
Тепер які інструменти ми маємо:
- відрегулювати розмір прапорця
- розпізнати 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. Моя остаточна пропозиція: замість цього використовуйте власні прапорці - і ви уникнете розчарувань :)