Sonunda sorunun kaynağına bir göz atalım
Onay kutuları görüntüler kullanılarak oluşturulur (biri CSS ile özel olanlar ayarlanabilir). İşte, FireFox'ta DOM denetçisi ile vurgulanan (işaretlenmemiş) bir onay kutusu:
İşte Chrome'daki aynı stilsiz onay kutusu:
Kenar boşluğunu (turuncu) görebilirsiniz; dolgu mevcut değildir (yeşil renkle gösterilecektir). Onay kutusunun sağındaki ve altındaki bu sahte kenar boşluğu nedir? Bunlar, onay kutusu için kullanılan görüntünün parçalarıdır . Bu yüzden sadecevertical-align: middle
gerçekten yeterli değildir ve tarayıcılar arası sorunların kaynağı budur.
Peki bu konuda ne yapabiliriz?
Açık bir seçenek - görüntüleri değiştirin! Neyse ki, bunu CSS ile yapabilir ve bunları harici görüntüler, base64 (CSS'de) görüntüler, CSS'de svg veya sadece sözde elemanlarla değiştirebilirsiniz. Bu sağlam (tarayıcılar arası!) Bir yaklaşımdır ve işte bu sorudan çalınan bu tür bir ayarlama örneği :
.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>
Burada listelenen bazı stiller hakkında daha ayrıntılı makaleler okumak isteyebilirsiniz. ; bu cevabın kapsamı dışında.
Tamam, hala özel görüntüler veya sahte elemanlar çözümü ne olacak?
TL; DR: Bu işe yaramaz gibi görünüyor, bunun yerine özel onay kutusunu kullanın
İlk olarak, diğer tarayıcılarda onay kutusu simgesinin içindeki sözde kenar boşluklarının keyfi olması durumunda, tutarlı bir çözüm olmadığını fark edelim. Bir tane oluşturmak için, mevcut tarayıcılarda bu tür görüntülerin anatomisini keşfetmeliyiz.
Peki, hangi tarayıcıların onay kutularındaki sahte kenar boşlukları var? Chrome 75, Vivaldi 2.5 (Krom tabanlı), FireFox 54 (neden bu kadar eski olduğunu sorma), IE 11, Edge 42, Safari'yi kontrol ettim ?? (bir dakikalığına ödünç aldı, sürümü kontrol etmeyi unuttum). Sadece Chrome ve Vivaldi'nin bu tür sahte kenar boşlukları var (Opera gibi tüm Chromium tabanlı tarayıcılardan da şüpheleniyorum).
Bu sözde marjların büyüklüğü nedir? Bunu anlamak için yakınlaştırılmış bir onay kutusu kullanılabilir:
input {
zoom: 10;
box-shadow: 0 0 1px inset #999;
}
<input type=checkbox>
sonucum, genişlik / yüksekliğin ~% 7'si ve dolayısıyla mutlak birimlerde 0.9-1.0 piksel. Bununla birlikte, doğruluk sorgulanabilir: zoom
onay kutusu için farklı değerler deneyin . Hem Chrome hem de Vivaldi'deki testlerimde sözde marjın göreceli boyutu, zoom
10, 20 değerlerinde ve 11-19 değerlerinde (??) çok farklı :
scale
daha tutarlı görünüyor:
input {
transform: scale(10) translate(50%, 50%);
box-shadow: 0 0 1px inset #999;
}
<input type=checkbox>
muhtemelen ~% 14 ve 2 piksel doğru değerlerdir.
Şimdi sahte kenar boşluğunun boyutunu (?) Bildiğimize göre, bunun yeterli olmadığını belirtelim. Onay kutusu simgelerinin boyutları tüm tarayıcılar için aynı mıdır? Yazık! DOM denetçisinin stilsiz onay kutuları için gösterdikleri:
- FireFox: 13.3 piksel
- Krom bazlı: 12.8px her şey için, dolayısıyla 12,8 (% 100 -% 14) = 11px görsel onay kutusu olarak algılanan ne için
- IE 11, Kenar: 13 piksel
- Safari: yok (bunlar aynı ekranda karşılaştırılmalı, inanıyorum)
Şimdi herhangi bir çözüm veya püf noktasını tartışmadan önce şunu soralım: doğru hizalama nedir? Ne başarmak için çalışıyoruz? Belirli bir noktaya gelince, bu bir zevk meselesidir, ancak temel olarak aşağıdaki "güzel" hizalamaların yönlerini düşünebilirim:
metin ve onay kutusunu aynı satır tabanındaki (Burada kasıtlı olarak onay kutusu boyutunu ayarlamıyorum):
veya küçük harflerle aynı orta satıra sahip olabilir:
veya büyük harfler açısından aynı orta satır (farklı yazı tipi boyutu için farkı görmek daha kolaydır):
ve ayrıca onay kutusunun boyutunun küçük harf, büyük harf veya başka bir şeye (daha büyük, daha küçük veya küçük ve büyük harf arasında) eşit olup olmadığına karar vermeliyiz.
Bu tartışma için, onay kutusu metnin satır taban çizgisindeyse ve büyük harf büyüklüğüne (yüksek düzeyde tartışmalı bir seçim) sahipse, hizalamayı güzel olarak adlandıralım:
Şimdi hangi araçlara ihtiyacımız var:
- onay kutusu boyutunu ayarla
- Sahte kenarlıklı onay kutusuyla Chromium'u tanır ve belirli stiller ayarlar
- onay kutusunu / etiketi dikey hizalamayı ayarlama
?
İlgili onay kutusu boyutu ayarı : var width
, height
, size
, zoom
, scale
(bir şey kaçırmış var?). zoom
ve scale
(biz tarayıcıya özel kurallar yazabilirsiniz sürece) sadece metin boyutu, değil set çapraz tarayıcı boyutuna göre ayarlama ile yardımcı olabilir, böylece mutlak boyutunu ayarlamak için izin vermez. size
Chrome ile çalışmaz (eski IE ile çalıştı mı? Neyse, o kadar da ilginç değil). width
ve height
Chrome'da ve diğer tarayıcılarda çalışır, böylece ortak bir boyut ayarlayabiliriz, ancak yine Chrome'da onay kutusunun kendisini değil, tüm görüntünün boyutunu ayarlar. Not: bir onay kutusunun boyutunu tanımlayan minimumdur (genişlik, yükseklik) (genişlik yüksekliği varsa, onay kutusu karesinin dışındaki alan "sözde kenar boşluğuna" eklenir).
Talihsiz bir şey, Chrome onay kutusundaki sözde kenar boşlukları, görebildiğim kadarıyla herhangi bir genişlik ve yükseklik için sıfıra ayarlanmamış.
Korkarım bu günlerde sadece güvenilir bir CSS yöntemi yok .
Dikey hizalamayı ele alalım. Chrome'un sahte kenar boşluğuna vertical-align
ayarlandığında middle
veya baseline
nedeniyle tutarlı sonuçlar veremezse , tüm tarayıcılar için aynı "koordinat sistemini" almanın tek gerçek seçeneği, etiketi ve girişi şuna hizalamaktır top
:
(resimde: dikey hizalama: kutu gölgesiz üst, alt ve alt)
Peki bundan ne sonuç alıyoruz?
input[type="checkbox"] {
height: 0.95em;
width: 0.95em;
}
label, input {
vertical-align: top;
}
<label><input type="checkbox">label</label>
Yukarıdaki snippet, Chrome (Chromium tabanlı tarayıcılar) ile çalışır, ancak diğer tarayıcılar daha küçük bir onay kutusu boyutu gerektirir. Hem boyut hem de dikey hizalamayı Chromium'un onay kutusu görüntü tuhaflığında çalışacak şekilde ayarlamak imkansız görünüyor. Son önerim: bunun yerine özel onay kutularını kullanın - ve hayal kırıklığını önleyeceksiniz :)