Onay kutularını ve etiketlerini sürekli olarak çapraz tarayıcılarla hizalama


1733

Bu beni sürekli rahatsız eden küçük CSS problemlerinden biri. Yığın Taşması çevresindeki kişiler dikey olarak nasıl hizalanır checkboxesve labelssürekli olarak çapraz tarayıcıları nasıl olur? Safari'de (genellikle vertical-align: baselineaçıkken input) doğru şekilde hizaladığımda , Firefox ve IE'de tamamen kapalıdır. Firefox'ta düzeltin ve Safari ve IE kaçınılmaz olarak berbat durumda. Her formu kodladığımda bunun için zaman harcıyorum.

İşte ben çalıştığım standart kod:

<form>
    <div>
        <label><input type="checkbox" /> Label text</label>
    </div>
</form>

Genelde Eric Meyer sıfırlamasını kullanıyorum, bu yüzden form öğeleri geçersiz kılmalardan nispeten temiz. Sunduğunuz ipuçlarını veya püf noktalarını dört gözle bekliyorum!


7
Her onay kutusunu ve etiketi bir <li> öğesinin içine koyun. Taşma ekle: <li> öğesine gizlenir ve etiketi ve onay kutusunu sola kaydırır. Sonra hepsi mükemmel bir şekilde hizalanır. Onay kutusunu etiket öğesinin içine açıkça koymayın.
cilt bir

5
Kullanarak heightve line-heightnitelikleri kullanarak elde ettim
TheGr8_Nik

Bu problemle manipülasyon positionve topbu sorunu çözecek Örnek: jsfiddle.net/ynkjc22s
Profesor08

2019. hala aynı sorun. hala işe almak için bazı kesmek gerekir :(
dieter

@dieter cevabımı gör, neden kesmek gerektiğini ve hangi yaklaşımın hacky olmadığını açıkladım: stackoverflow.com/a/56558431/3995261
YakovL

Yanıtlar:


1009

Bir saatten fazla süren tweaking, test ve farklı biçimlendirme stillerini denedikten sonra, iyi bir çözümüm olabileceğini düşünüyorum. Bu proje için gereksinimler şunlardı:

  1. Girdiler kendi satırlarında olmalıdır.
  2. Onay kutusu girişlerinin, tüm tarayıcılarda benzer şekilde (aynı değilse) etiket metniyle dikey olarak hizalanması gerekir.
  3. Etiket metni sarılırsa, girintili olması gerekir (bu nedenle onay kutusunun altına sarılmamalıdır).

Herhangi bir açıklama yapmadan önce, size sadece kodu vereceğim:

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>

İşte JSFiddle'daki çalışma örneği .

Bu kod, Eric Meyer gibi form giriş kenar boşluklarını ve dolguyu geçersiz kılmayan bir sıfırlama kullandığınızı varsayar (bu nedenle giriş CSS'sine kenar boşluğu ve dolgu sıfırlamaları koymak). Açıkçası, canlı bir ortamda muhtemelen diğer giriş öğelerini desteklemek için bir şeyler iç içe geçireceksiniz / geçersiz kılacaksınız, ancak işleri basit tutmak istedim.

Dikkat edilmesi gerekenler:

  • *overflowBeyanı bir satır içi IE kesmek (yıldız-mülk hack) 'dir. Hem IE 6 hem de 7 bunu fark edecek, ancak Safari ve Firefox bunu görmezden gelecek. Geçerli CSS olabileceğini düşünüyorum, ancak koşullu yorumlarla hala daha iyi durumdasınız; basitlik için kullandım.
  • Söyleyebileceğim en iyi şey, vertical-aligntarayıcılar arasında tutarlı olan tek ifadeydi vertical-align: bottom. Bunu ayarlamak ve daha sonra nispeten yukarı doğru konumlandırmak Safari, Firefox ve IE'de sadece bir veya iki piksel tutarsızlığı ile neredeyse aynı şekilde davrandı.
  • Hizalama ile çalışmanın en büyük problemi IE'nin girdi öğeleri etrafına bir sürü gizemli alan yapıştırmasıdır. Dolgu veya kenar boşluğu değildir ve kalıcıdır. Onay kutusunda bir genişlik ve yükseklik ayarlamak ve daha sonra overflow: hiddenbir nedenle fazladan alanı keser ve IE'nin konumlandırmasının Safari ve Firefox'a çok benzer şekilde hareket etmesini sağlar.
  • Metin boyutunuza bağlı olarak, işlerin doğru görünmesini sağlamak için göreceli konumlandırma, genişlik, yükseklik vb.

Umarım bu başka birine yardımcı olur! Bu spesifik tekniği bu sabah üzerinde çalıştığım projeden başka bir projede denemedim, bu yüzden daha tutarlı çalışan bir şey bulursanız kesinlikle pipetleyin.


8
Not. Tüm tarayıcılar ve metin okuyucuları için çalıştığından emin olmak için etiketinize muhtemelen bir "for" özelliği eklemelisiniz. (Muhtemelen basitlik için bıraktığınızı anlıyorum)
Armstrongest

306
İyi keder, bunun kaç kişi olduğunu bilmiyordum: etiket etiketindeki girdiyi sarıyorsanız, "for" özelliği gereksizdir. Kendiniz görmekten çekinmeyin: w3.org/TR/html401/interact/forms.html#h-17.9.1
One Crayon

10
Koşullu yorumları kullanma önerisine katılmıyorum. * Foobar CSS hack'ini saklayın. Bu iyi çalışıyor, YUI gibi çerçeveler tarafından kullanılıyor ve birbirine ait olanları bir arada tutmanıza izin veriyor.
ebruchez

50
Bunun Chrome 28, Mac OSX'te olduğunu ve onay kutusunun metinden belirgin şekilde daha düşük olduğunu
denedi

9
Bu, Chrome'un en son sürümlerinde çalışmıyor gibi görünüyor (v36 kullanıyorum). i.imgur.com/y9Ffxsh.png Düzenleme: ne Firefox ( v31 )
Hans

214

Bazen dikey hizalamanın düzgün çalışması için yan yana iki satır içi (aralık, etiket, giriş vb.) Öğeye ihtiyacı olabilir. Aşağıdaki onay kutuları, metin boyutu çok küçük veya büyük olsa bile IE, Safari, FF ve Chrome'da düzgün bir şekilde ortalanmıştır.

Hepsi aynı satırda yan yana yüzer, ancak nowrap, tüm etiket metninin her zaman onay kutusunun yanında kaldığı anlamına gelir.

Dezavantajı ekstra anlamsız SPAN etiketleri.

.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>

Şimdi, onay kutusunun altına sarmadan sarılması gereken çok uzun bir etiket metniniz varsa, etiket öğelerinde dolgu ve negatif metin girintisi kullanırsınız:

.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>


19
Teşekkürler! Hem giriş hem de aralıktaki "dikey hizalama: orta" benim için harika çalıştı.
William Gross

6
display: block; float: left;gereksiz görünüyor
PHPst

4
Etiketin içinde girdi olduğunda bir for niteliği kullanmanız gerekmez. O olmadan çalışır.
Tommy Sørensen

6
Bu benim görüşüme göre kabul edilen cevap olmalı. Ayarlamaya gerek yoktur.
Tim

4
Müthiş ve onaylanmış hala Chrome 58'de (Windows) çalışıyor (mevcut üst yanıtın aksine).
Jason C

188

One Crayon'un çözümü üzerinde çalışırken , benim için çalışan ve daha basit bir şeyim var:

.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'de (temeline güvendiğim) piksel için pikseli piksel oluşturur ve hem Firefox hem de IE7 iyi bir şekilde kontrol eder. Ayrıca büyük ve küçük çeşitli etiket yazı tipi boyutları için çalışır. Şimdi, IE'nin taban çizgisini seçimler ve girdiler üzerine sabitlemek için ...


Güncelleme: (Üçüncü Taraf Düzenleme)

Uygun bottomkonum yazı tipi ailesine ve yazı tipi boyutuna bağlıdır! bottom: .08em;Onay kutusu ve radyo elemanları için kullanmanın iyi bir genel değer olduğunu buldum . Birkaç küçük / orta / büyük yazı tipi boyutu kullanarak Arial & Calibri yazı tipleriyle Windows / Chrome / Firefox / IE11'de test ettim.

.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>


10
Başkaları için yalnızca bir not: IE6'da çalışmaz, çünkü [type = onay kutusu] CSS hedeflemesini desteklemez.
Bir Crayon

3
IE6 desteği gerekiyorsa desteklenmeyen seçiciler kullanmak yerine bir sınıf ekleyebilirsiniz.
HartleySan

1
Bu benim için çalıştı. Ancak, "position: relative; bottom: 1px" yerine, aynı sonucu elde etmek için "margin: 0 0 1px 0" kullanabilirsiniz.
newman

142

İyi çalışıyor gibi görünen basit bir şey, onay kutusunun dikey konumunu dikey hizalama ile ayarlamaktır. Tarayıcılar arasında hala değişecektir, ancak çözüm karmaşık değildir.

input {
    vertical-align: -2px;
}

Referans


9
Bu, tarayıcıların en son sürümlerinde benim için çalışan diğer tüm değişiklikler arasında en küçük değişiklikti.
Johnny_D

6
Bu daha iyi çalışır vertical-alignve position: relativeayrıca
IE9'da

5
ancak yazı tipi boyutuna bağlıdır. büyük yazı tipi boyutları için, daha yüksek negatif değerlere ayarlanmalıdır, örneğin: vertical-align: -6px;
S.Serpooshan

1
muhtemelen bu ayarlanırsa farklı yazı tipleri ile daha iyi çalışabilirem
YakovL

92

Deneyin vertical-align: middle

Ayrıca kodunuz olması gerektiği gibi görünüyor:

<form>
    <div>
        <input id="blah" type="checkbox"><label for="blah">Label text</label>
    </div>
</form>


<label for="blah">yalnızca etiketin kaydırılmasının mantıklı olmadığı bir şey kullanıyorsanız gereklidir (metin kutusu gibi; genellikle <label for="blah">Foo</label><input id="blah" type="text" />bu örnekte kullanacağım ). Onay kutuları ile sarmanın daha az biçimlendirmesi olduğunu düşünüyorum.
Bir Pastel Boya

13
Tam olarak doğru değil: Etiket for, kullanıcıların onay kutusunu işaretlemek için etiketi tıklatmasına ve ayrıca onay kutusunu tıklatmasına izin verir. İki elemanı birbirine bağlamak için oldukça kullanışlıdır.
Nesli Tehlike Altında

26
Bir giriş etiketin içine yerleştirilmişse, girdiyi etkinleştirmek / odaklamak için etiketi tıklatmak; for özniteliği yalnızca girişin yuvalanmadığı durum içindir.
One Crayon

3
Bu bir One Crayon, ama "for" özniteliğini kullanmak hala iyi bir uygulamadır, ya da bu sözdizimi öksürük IE'yi tanımayan bazı tarayıcılarda sorunlarınız olacaktır .
Armstrongest

onay kutunuzun bir kimliğe sahip olmasını istemiyorsanız onay kutusunu etiketin içine sarmanız gerekir
Simon_Weaver

39

Çözümümü deneyin, IE 6, FF2 ve Chrome'da denedim ve her üç tarayıcıda da piksel piksel işler.

* {
  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>


3
İlginç; Her iki unsuru da yüzmek fikrini seviyorum; bu, sarma sorununu zarif bir şekilde düzeltir. Ben am etiketle giriş sarma bağlı, ama bu kod ben geldi çözümü çok daha temiz bir halt.
Bir Mum Boya

bu örnekte, onay kutusu girişi ve etiketi de özellik ekranına sahip olmalıdır: blok ve bu durumda kolayca hizalanabilecek normal
DIV'ler

5
bunun bir sorunu vardır, etiket kullanılabilir alana sığmazsa ne olur? etiket ve onay kutusu ayrılır (onay kutusu sağda ve etiket soldadır). Onay kutusunu etiketinizin içine sarırsanız bu sorunla karşılaşmazsınız.
Enrique

Piksel için işe yaramadı, ancak 3 büyük tarayıcıda daha iyi görünmesi için bir şeyler elde etmek için yeterince iyi oldu. Sanırım daha iyi çalışacağını görmek için bir saat daha harcayabilirdim ...
Alexis Wilke

26

Benim için mükemmel çalışan tek çözüm:

input[type=checkbox], input[type=radio] {
    vertical-align: -2px;
    margin: 0;
    padding: 0;
}

Bugün Chrome, Firefox, Opera, IE 7 ve 8'de test edildi. Örnek: Fiddle


22

Çözümümü tam olarak test etmedim, ancak harika çalışıyor gibi görünüyor.

HTML kodum basitçe:

<label class="checkbox"><input type="checkbox" value="0000">0000 - 0100</label>

Sonra tüm onay kutularını 24pxyükseklik ve genişlik olarak ayarladım . Metni hizalı hale getirmek için etiketin line-heightde yapmasını 24pxsağlarım vertical-align: top;:

DÜZENLEME: IE testinden sonra vertical-align: bottom;girdiye ekledim ve etiketin CSS'sini değiştirdim. Doldurmayı sıralamak için koşullu bir IE css kasasına ihtiyacınız olabilir - ancak metin ve kutu satır içi.

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>

Biri bunun işe yaramadığını fark ederse, lütfen bana bildirin. İşte eylemde (Chrome ve IE'de - retinada ekran görüntüleri çekildiği ve IE için paralellikler kullanıldığında özür dileriz):

onay kutularının ekran görüntüsü: Chrome checkboxes: IE ekran görüntüsü


1
Bu oldukça eskidir, ancak size bildirmeniz istendiğinden, bu FireFox'ta iyi çalışmaz (onay kutuları taban çizgisinin üzerindedir). Ayrıntılı bir ilginizi çekebilir açıklama Yayınladığım
YakovL

20

Statik metnimin dikey konumunu ayarlamak için genellikle satır yüksekliğini kullanırım:

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>

Umarım yardımcı olur.


satır yüksekliği, duh. Bunu daima unut. İyi iş, harika çalışıyor.
Craig

13

<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>

Hile, yalnızca etiket hücrelerinde dikey hizalama kullanmak için tablo hücrelerinde veya satır içi blok kullanmaktır.


11

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:

bu sadece bir kare

İşte Chrome'daki aynı stilsiz onay kutusu:

sağda ve altta "kenar boşlukları" olan merkezsiz bir kare

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: zoomonay kutusu için farklı değerler deneyin . Hem Chrome hem de Vivaldi'deki testlerimde sözde marjın göreceli boyutu, zoom10, 20 değerlerinde ve 11-19 değerlerinde (??) çok farklı :

zoom = 10 için% 7 zum = 11 için bu değerin neredeyse iki katı

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):

resim açıklamasını buraya girin

veya küçük harflerle aynı orta satıra sahip olabilir:

resim açıklamasını buraya girin

veya büyük harfler açısından aynı orta satır (farklı yazı tipi boyutu için farkı görmek daha kolaydır):

resim açıklamasını buraya girin

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:

resim açıklamasını buraya girin

Şimdi hangi araçlara ihtiyacımız var:

  1. onay kutusu boyutunu ayarla
  2. Sahte kenarlıklı onay kutusuyla Chromium'u tanır ve belirli stiller ayarlar
  3. onay kutusunu / etiketi dikey hizalamayı ayarlama

?

  1. İlgili onay kutusu boyutu ayarı : var width, height, size, zoom, scale(bir şey kaçırmış var?). zoomve 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. sizeChrome ile çalışmaz (eski IE ile çalıştı mı? Neyse, o kadar da ilginç değil). widthve heightChrome'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ış.

  2. Korkarım bu günlerde sadece güvenilir bir CSS yöntemi yok .

  3. Dikey hizalamayı ele alalım. Chrome'un sahte kenar boşluğuna vertical-alignayarlandığında middleveya baselinenedeniyle 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:

    dikey hizalama karşılaştırması: üst ve alt

    (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 :)


Bu cevap çok derin!
Marecky

10

Şimdi flexbox tüm modern tarayıcılarda destekleniyor, böyle bir şey bana daha kolay bir yaklaşım gibi görünüyor.

<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>


İşte tam ön ekli sürüm demosu:


10

Bence bu en kolay yol

input {
    position: relative;
    top: 1px;
}
<form>
    <div>
        <label><input type="checkbox" /> Label text</label>
    </div>
<form>


soru şudur: tüm tarayıcılarda iyi çalışır mı? ;-)
JonSnow

9

Göreceli konumlandırmayı sevmiyorum çünkü öğesinin seviyesinde her şeyin üstünde işlenen bir öğe yapar (karmaşık bir düzeniniz varsa bir şeyin üstüne çıkabilir).

vertical-align: subOnay kutularının Chrome, Firefox ve Opera'da yeterince iyi görünmesini sağladığını keşfettim . MacOS'um yok ve IE10 biraz kapalı olduğu için Safari'yi kontrol edemiyorum, ancak benim için yeterince iyi bir çözüm buldum.

Başka bir çözüm, her tarayıcı için özel CSS yapmak ve% / piksel / EM'de dikey hizalama ile ince ayar yapmak olabilir: http://css-tricks.com/snippets/css/browser-specific-hacks/


Yazı tipi boyutu çok büyük olmadığı sürece çalışıyor gibi görünüyor.
robsch

9

Bu benim için iyi çalışıyor:

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>


8
pks yerine ems kullandığınız için sizi kutsasın.
ıdisposable

7

400+ upvotes ile seçilen cevap Chrome 28 OSX'te benim için işe yaramadı, muhtemelen OSX'te test edilmediğinden veya bu soru cevaplandığında 2008'de etrafta çalıştığı için işe yaradı.

Zaman değişti ve yeni CSS3 çözümleri artık mümkün. Çözümüm , özel bir onay kutusu oluşturmak için sözde öğeler kullanır . Yani şartlar (artılar veya eksiler, ancak ona bakarsanız) aşağıdaki gibidir:

  • Yalnızca modern tarayıcılarda çalışır (FF3.6 +, IE9 +, Chrome, Safari)
  • Her tarayıcıda / işletim sisteminde tam olarak aynı hale getirilecek özel olarak tasarlanmış bir onay kutusuna güvenir. Burada sadece bazı basit renkler seçtim, ama her zaman daha fazla patlama sağlamak için doğrusal degradeler ve benzeri ekleyebilirsiniz.
  • Değiştirilirse, dikey olarak hizalanmış görünmesi için onay kutusunun konumunu ve boyutunu değiştireceğiniz belirli bir yazı tipi / yazı tipi boyutuna yöneliktir. Doğru şekilde ayarlanmışsa, sonuç tüm tarayıcı / işletim sistemlerinde hala tam olarak aynı olmalıdır.
  • Dikey hizalama özelliği yok, yüzdürme yok
  • Örneğimde sağlanan işaretlemeyi kullanmalı, soru gibi yapılandırılmışsa çalışmaz, ancak düzen esasen aynı görünecektir. Bir şeyi hareket ettirmek istiyorsanız, ilişkili CSS'yi de taşımanız gerekir

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>

Bu çözüm onay kutusunu gizler ve görünür onay kutusunu oluşturmak için etikete sözde öğeler ekler ve stillere stil uygular. Etiket gizli onay kutusuna bağlı olduğundan, giriş alanı güncellenmeye devam eder ve değer formla birlikte gönderilir.

Ve eğer ilgileniyorsanız, işte radyo düğmelerimi ele alalım: http://jsfiddle.net/DtKrV/2/

Umarım birisi bunu faydalı bulur!


6

Hiç böyle bir sorun yaşamadım:

<form>
  <div>
    <input type="checkbox" id="cb" /> <label for="cb">Label text</label>
  </div>
</form>

4
Bunu tavsiye eden önceki posterlere söylediğim gibi: Sevmiyorum çünkü gereksiz işaretleme gerektiriyor. Ayrıca, bu işaretlemeyi denedim, ancak etiketin girişin altına sarılmasını önlemek zordu (yine de her biri kendi satırlarında etiket / giriş grubu varken).
One Crayon

7
Yani, "gereksiz" işaretleme yerine (muhtemelen hemen hemen herkes tarafından kullanılır), gereksiz CSS mi tercih edersiniz?
Robert C. Barth

10
Sarma sorunu duruyor. Ancak genel olarak, evet, CSS önbelleğe alındığından biçimlendirme yerine yabancı CSS'ye sahip olmayı tercih ederim, ancak işaretlemenin her yeni sayfa için yeniden yüklenmesi gerekebilir.
Bir Mum Boya

4
Karşılaştır: 1 ekstra CSS -vs- birçok ekstra işaretleme örneği.
Greg

6

ASP.NET Web Formları kullanıyorsanız, DIV'ler ve diğer öğeler veya sabit boyutlar hakkında endişelenmenize gerek yoktur. CSS'deki CheckboxList giriş türüne <asp:CheckBoxList>ayarlayarak metni hizalayabiliriz float:left.

Lütfen aşağıdaki örnek kodu kontrol edin:

.CheckboxList
{
    font-size: 14px;
    color: #333333;
}
.CheckboxList input
{
    float: left;
    clear: both;
}

.ASPX kodu:

<asp:CheckBoxList runat="server" ID="c1" RepeatColumns="2" CssClass="CheckboxList">
</asp:CheckBoxList>

3

Twitter Bootstrap kullanıyorsanız, checkboxsınıfı aşağıdakiler üzerinde kullanabilirsiniz <label>:

<label class="checkbox">
    <input type="checkbox"> Remember me
</label>

3

Etiketin içine sarılı ve sola doğru kayan bir giriş tipi onay kutusu ile:

<label for="id" class="checkbox">
    <input type="checkbox" id="id">
    <span>The Label</span>
</label>

bu benim için çalıştı:

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;
}

Yüksekliğinin (blok seviyesi) satır yüksekliği ile aynı olduğundan emin olun.


3

Onay kutusunun yüksekliğini ve genişliğini kodlayın, dolgusunu kaldırın ve yüksekliğini artı dikey kenar boşluklarını etiketin satır yüksekliğine eşit yapın. Etiket metni satır içi ise, onay kutusunu kaydırın. Firefox, Chrome ve IE7 +, şu örneği aynı şekilde oluşturur: http://www.kornea.com/css-checkbox-align


Güzel! Ancak, HTML ve CSS kodunu buraya kopyalamayı düşünmelisiniz. Dış bağlantıya bu kadar bağımlı olan cevaplar önerilmez. Bağlantı hala sonuçları görmek için değerli, ama burada kodu göstermek daha fazla oy almak yardımcı olacaktır düşünüyorum.
Mariano Desanze

hayır, onlar (FireFox ve Chrome'da, Chrome'da onay kutuları taban çizgisinin üzerinde) karşılaştırın, nedenini açıkladım
YakovL

Neden, her iki tarayıcıdan da ekran görüntülerinde bile desteklenmeyen bir şey olduğunu iddia ediyorsunuz. Bir iddiada bulunduğunuzda, başkalarının onaylamaması için değil, bir iddia için kanıt sağlamak sizin işinizdir. Bunları karşılaştırdım ve ekran görüntüleri ekledim, ancak yorumlar resim eklemeyi desteklemiyor; cevabımdaki resimlere bir göz atabilirsiniz. Ancak bu, tarayıcı sürümlerinde farklılık gösterebileceğinden, tarayıcı sürümlerini içeren ek açıklamalar içeren ekran görüntüleri sağlamak yardımcı olacaktır.
YakovL

Bağlandığım sayfayı farklı tarayıcılarda ziyaret edin.
Vladimir Kornea

Bunu ben yaptım, değil mi? :) Farkı görmüyor musunuz? imagebin.ca/v/50stCZZGl7Ug imagebin.ca/v/50stNBiv29Ks FireFox'ta mükemmel bir şekilde hizalandıklarında, Chrome'da onay kutusu taban çizgisi ile ilgilidir (bu arada, daha hızlı yanıtlarla ilgileniyorsanız @ yoluyla bahsedebilirsiniz)
YakovL

3

input[type=checkbox]
{
    vertical-align: middle;
} 
<input id="testCheckbox" name="testCheckbox" type="checkbox">
<label for="testCheckbox">I should align</label>


2

Ben genellikle bir onay kutusunu etiketsiz bırakın ve sonra onun "etiket" ayrı bir öğe yapmak. Bu bir acıdır, ancak onay kutularının ve etiketlerinin görüntülenme şekli arasında (fark ettiğiniz gibi) tarayıcılar arasında çok fazla fark vardır, bu her şeyin nasıl göründüğünü kontrol etmeye yaklaşmanın tek yoludur.

Bunu da aynı nedenden ötürü winforms geliştirmede yapıyorum. Onay kutusu kontrolü ile ilgili temel sorun gerçekten iki farklı kontrol olmasıdır: kutu ve etiket. Bir onay kutusu kullanarak, bu iki öğenin yan yana nasıl görüntüleneceğine karar vermek için kontrolün uygulayıcılarına bırakıyorsunuz (ve her zaman yanlış anlıyorlar, nerede yanlışsa, ne istediğinizi değil).

Umarım birinin sorunuza daha iyi bir cevabı vardır.


2

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>

Yukarıdaki kod, liste öğelerinizi üç sütun halinde yerleştirecek ve genişlikleri uygun olacak şekilde değiştirecektir.


2

Aşağıdaki tarayıcılarda, hatta IE9'da mükemmel piksel tutarlılığı sağlar:

Yaklaşım açık olmak için oldukça mantıklı:

  1. Bir girdi ve etiket oluşturun.
  2. Bunları blok olarak görüntüleyin, böylece istediğiniz gibi yüzebilirsiniz.
  3. Dikey olarak ortalandıklarından ve hizalandıklarından emin olmak için yüksekliği ve çizgi yüksekliğini aynı değere ayarlayın.
  4. İçin em ölçümlerinin, elemanların yüksekliği, tarayıcı bu elemanlar için yazı yüksekliğini bilmesi gerekir hesaplamak ve kendisi em ölçümlerde belirlenen olmamalıdır.

Bu, küresel olarak uygulanabilir bir genel kural ile sonuçlanır:

input, label {display:block;float:left;height:1em;line-height:1em;}

Yazı tipi boyutu form, alan kümesi veya öğe başına uyarlanabilir.

#myform input, #myform label {font-size:20px;}

Mac, Windows, Iphone ve Android'de en son Chrome, Safari ve Firefox'ta test edildi. Ve IE9.

Bu yöntem, büyük olasılıkla bir metin satırından daha yüksek olmayan tüm giriş türleri için geçerlidir. Uyması için bir tür kuralı uygulayın.


hm, etiket küçük harfle başladığında bu iyi görünür, ancak büyük bir harfle başlarsa, çok daha kötüdür. Buraya bir pasaj ekleyebilir misiniz?
YakovL

2

Bunun birçok kez yanıtlandığını biliyorum, ancak daha önce verilmiş olanlardan daha zarif bir çözüm bulduğumu hissediyorum. Ve sadece 1 zarif çözüm değil, süslemenizi gıdıklamak için 2 ayrı çözüm. Bununla birlikte, bilmeniz ve görmeniz gereken her şey yorumlarla birlikte 2 JS Fiddle'da bulunmaktadır.


Çözüm # 1, bir bükülme ile birlikte verilen tarayıcının yerel "Onay Kutusu" na güveniyor ... Bir taşma ile çapraz tarayıcıyı konumlandırmak daha kolay olan bir div içinde yer alıyor: 1 piksel uzatılmış onay kutusunun fazlalığını kesmek için gizli (bu yüzden FF'nin çirkin sınırlarını göremezsiniz)

Basit HTML: (css yorumlarla incelemek için bağlantıyı takip edin, kod bloğu yığın akışını tatmin etmektir) http://jsfiddle.net/KQghJ/

<label><div class="checkbox"><input type="checkbox" /></div> Label text</label>

Çözüm # 2, tarayıcı arasında düzgün bir şekilde konumlandırılmış bir DIV'nin CSS durumunu değiştirmek için "Onay Kutusu Açma / Kapama Düğmesini" kullanır ve onay kutusu işaretlenmemiş ve kontrol edilmiş durumlar için basit bir hareketli grafikle kurulum yapar. Gereken tek şey, söz konusu Checkbox Toggle Hack ile arka plan konumunu ayarlamaktır. Bu, bence, onay kutularınız ve radyolarınız üzerinde daha fazla kontrole sahip olduğunuzdan ve tarayıcılarda aynı görünmelerini garanti edebildiğinizden daha zarif bir çözümdür.

Basit HTML: (CSS'yi yorumlarla incelemek için bağlantıyı takip edin, kod bloğu StackOverflow'u tatmin etmek içindir) http://jsfiddle.net/Sx5M2/

<label><input type="checkbox" /><div class="checkbox"></div>Label text</label>

Birisi bu yöntemlere katılmıyorsa, lütfen bana bir yorum bırakın, başkalarının neden bu çözümlerle karşılaşmadığına dair bir geri bildirim duymak isterim veya eğer varsa, neden bunlarla ilgili hiçbir cevap görmüyorum? Herkes bu yöntemlerden birinin başarısız olduğunu görürse, bunu görmek güzel olurdu, ancak bunlar en son tarayıcılarda test edildi ve gördüğüm kadarıyla oldukça eski ve evrensel olan HTML / CSS yöntemlerine güveniyor.


1

Teşekkürler! Bu da beni sonsuza dek çıldırtıyor.

Benim özel durumumda, bu benim için çalıştı:

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;
}

Bazı farklılıkları açıklayabilecek reset.css kullanıyorum, ancak bu benim için iyi çalışıyor gibi görünüyor.


1

position: relative; IE'de z-endeksi ve jQuery'nin slideUp / slideDown gibi animasyonlarıyla ilgili bazı sorunlar var.

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');
    }
});

Stilin, kullanılan font boyutuna bağlı olarak muhtemelen ince ayarlara ihtiyacı var <label>

PS: IE7 içinde css çalışması
için ie7js kullanın.


1

Basitçe vertical-align: sub, pokrishka zaten önerildiği gibi kullanın .

Vaktini boşa harcamak

HTML Kodu:

<div class="checkboxes">
    <label for="check1">Test</label>
    <input id="check1" type="checkbox"></input>
</div>

CSS Kodu:

.checkboxes input {
    vertical-align: sub;
}

1

Basit çözüm:

<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+'da test edildi

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.