Akhirnya mari kita lihat sumber masalahnya
Kotak centang diberikan menggunakan gambar (satu dapat mengatur yang khusus melalui CSS). Berikut adalah kotak centang (tidak dicentang) di FireFox, disorot dengan inspektur DOM:
Dan inilah kotak centang tanpa gaya yang sama di Chrome:
Anda dapat melihat margin (oranye); padding tidak ada (akan ditampilkan hijau). Jadi, apa margin palsu ini di sebelah kanan dan di bawah kotak centang? Ini adalah bagian dari gambar yang digunakan untuk kotak centang . Itu sebabnya menggunakan hanya vertical-align: middle
tidak cukup dan itu adalah sumber masalah lintas-browser.
Jadi apa yang bisa kita lakukan tentang ini?
Salah satu opsi yang jelas adalah - ganti gambar! Untungnya, seseorang dapat melakukan ini melalui CSS dan menggantinya dengan gambar eksternal, gambar base64 (in-CSS), in-CSS svg atau hanya elemen pseudo. Ini adalah pendekatan yang kuat (lintas browser!), Dan ini adalah contoh penyesuaian yang dicuri dari pertanyaan ini :
.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>
Anda mungkin ingin membaca lebih banyak artikel mendalam tentang gaya seperti itu seperti beberapa yang tercantum di sini ; itu di luar jangkauan jawaban ini.
Ok, masih bagaimana dengan solusi no-custom-images-or-pseudo-elements?
TL; DR: sepertinya ini tidak akan berfungsi, gunakan kotak centang khusus sebagai gantinya
Pertama, mari kita perhatikan bahwa jika di browser lain ikon pseudo-margin di dalam kotak centang itu berubah-ubah, tidak ada solusi yang konsisten. Untuk membangunnya, kita harus menjelajahi anatomi gambar seperti itu di browser yang ada.
Jadi browser apa yang memiliki margin semu di kotak centang? Saya sudah memeriksa Chrome 75, Vivaldi 2.5 (berbasis Chromium), FireFox 54 (jangan tanya kenapa ketinggalan jaman), IE 11, Edge 42, Safari ?? (meminjam satu menit, lupa memeriksa versinya). Hanya Chrome dan Vivaldi yang memiliki margin semu seperti itu (saya menduga semua browser berbasis Chromium juga, seperti Opera).
Berapa ukuran margin semu itu? Untuk mengetahui ini, orang dapat menggunakan kotak centang yang diperbesar:
input {
zoom: 10;
box-shadow: 0 0 1px inset #999;
}
<input type=checkbox>
hasil saya adalah ~ 7% dari lebar / tinggi dan karenanya 0,9-1.0px dalam satuan absolut. Akurasi mungkin dipertanyakan, meskipun: coba nilai yang berbeda zoom
untuk kotak centang. Dalam pengujian saya di Chrome dan Vivaldi, ukuran relatif dari margin semu sangat berbeda pada zoom
nilai 10, 20 dan pada nilai 11-19 (??):
scale
tampaknya lebih konsisten:
input {
transform: scale(10) translate(50%, 50%);
box-shadow: 0 0 1px inset #999;
}
<input type=checkbox>
jadi mungkin ~ 14% dan 2px adalah nilai yang benar.
Sekarang kita tahu (?) Ukuran pseudo-margin, mari kita perhatikan ini tidak cukup. Apakah ukuran ikon kotak centang sama untuk semua browser? Sayang! Inilah yang diperlihatkan oleh pemeriksa DOM untuk kotak centang yang tidak distilasi:
- FireFox: 13.3px
- Berbasis kromium: 12.8px untuk semuanya, karenanya 12.8 (100% - 14%) = 11px untuk apa yang secara visual dianggap sebagai kotak centang
- IE 11, Edge: 13px
- Safari: n / a (ini harus dibandingkan pada layar yang sama, saya percaya)
Sekarang sebelum kita membahas solusi atau trik, mari kita tanyakan: apa yang benar penyelarasan yang ? Apa yang ingin kita capai? Untuk titik tertentu itu masalah selera, tetapi pada dasarnya saya bisa memikirkan aspek "bagus" berikut:
teks dan kotak centang pada baseline yang sama (saya sengaja tidak menyesuaikan ukuran kotak centang di sini):
atau memiliki garis tengah yang sama dalam hal huruf kecil:
atau garis tengah yang sama dalam hal huruf kapital (lebih mudah untuk melihat perbedaan untuk ukuran font yang berbeda):
dan juga kita harus memutuskan apakah ukuran kotak centang harus sama dengan tinggi huruf kecil, huruf besar atau yang lain (lebih besar, lebih kecil atau antara huruf kecil dan kapital).
Untuk diskusi ini, mari panggil alignment nice jika kotak centang berada pada baseline yang sama dengan teks dan memiliki ukuran huruf kapital (pilihan yang sangat diperdebatkan):
Sekarang alat apa yang harus kita miliki:
- sesuaikan ukuran kotak centang
- mengenali Chromium dengan kotak centang pseudo-margined dan mengatur gaya tertentu
- sesuaikan kotak centang / label perataan vertikal
?
Mengenai ukuran kotak centang penyesuaian : ada width
, height
, size
, zoom
, scale
(memiliki aku melewatkan sesuatu?). zoom
dan scale
jangan izinkan untuk mengatur ukuran absolut, sehingga mereka hanya dapat membantu dengan menyesuaikan ke ukuran teks, tidak mengatur ukuran lintas-browser (kecuali kita dapat menulis aturan khusus browser). size
tidak bekerja dengan Chrome (apakah itu bekerja dengan IE lama? Lagi pula, itu tidak menarik). width
dan height
bekerja di Chrome dan peramban lain, sehingga kami dapat menetapkan ukuran umum, tetapi sekali lagi, di Chrome itu menetapkan ukuran seluruh gambar, bukan kotak centang itu sendiri. Catatan: minimum (lebar, tinggi) yang menentukan ukuran kotak centang (jika lebar ≠ tinggi, area di luar kotak centang ditambahkan ke "pseudo-margin").
Sayangnya, pseudo-margin di kotak centang Chrome tidak disetel ke nol untuk lebar dan ketinggian apa pun, sejauh yang saya bisa lihat.
Saya khawatir tidak ada metode hanya CSS yang dapat diandalkan hari ini.
Mari kita pertimbangkan perataan vertikal. vertical-align
tidak dapat memberikan hasil yang konsisten ketika disetel ke middle
atau baseline
karena margin semu Chrome, satu-satunya opsi nyata untuk mendapatkan "sistem koordinat" yang sama untuk semua browser adalah menyelaraskan label dan input ke top
:
(pada gambar: penyelarasan vertikal: atas, bawah dan bawah tanpa bayangan kotak)
Jadi apa hasil yang kita dapatkan dari ini?
input[type="checkbox"] {
height: 0.95em;
width: 0.95em;
}
label, input {
vertical-align: top;
}
<label><input type="checkbox">label</label>
Cuplikan di atas berfungsi dengan Chrome (browser berbasis Chromium), tetapi browser lain memerlukan ukuran yang lebih kecil dari kotak centang. Tampaknya tidak mungkin untuk menyesuaikan ukuran dan perataan vertikal dengan cara yang bekerja di sekitar kekhasan gambar kotak centang Chromium. Saran terakhir saya adalah: gunakan kotak centang khusus - dan Anda akan menghindari frustrasi :)