CSS: Bir "div" içinde "etiket" ve "giriş" dikey olarak nasıl hizalanır?


92

Aşağıdaki kodu göz önünde bulundurun :

HTML:

<div>
    <label for='name'>Name:</label>
    <input type='text' id='name' />
</div>

CSS:

div {
    height: 50px;
    border: 1px solid blue;
}

Koymak için en kolay yöntem ne olurdu labelve inputortasında div(dikey)?


1
Bildiğim kadarıyla, alt çizgi "yapamazsın" dir ve çevresinde en tembel yolu basit kullanmaktır <table>ve uygulamak valign='middle'onun için <td>s.
BeemerGuy

Yanıtlar:


97

div {
    display: table-cell;
    vertical-align: middle;
    height: 50px;
    border: 1px solid red;
}
<div>
    <label for='name'>Name:</label>
    <input type='text' id='name' />
</div>

Bu yöntemin avantajları div, yazı alanının yüksekliğini değiştirebilmeniz, yazı alanının yüksekliğini değiştirebilmeniz ve yazı tipi boyutunu değiştirebilmeniz ve her şeyin her zaman ortada kalmasıdır.

http://jsfiddle.net/53ALd/6/


1
zarif görünüyor :) bu yöntemin tarayıcıyla ne kadar uyumlu olduğunu bilen var mı?
Zaven Nahapetyan

1
IE için, yalnızca IE8 veya daha iyisi üzerinde çalıştığını düşünüyorum. Diğer web tarayıcıları için sorun değil.
Marc-François

1
Hakkında bilmiyordum display: table-cell. Bu belirli tarayıcılarda destekleniyor mu?
BeemerGuy

7
@Misha, girişinizin / etiketinizin kesinlikle konumlandırılmış olduğunu belirtmiş olmalısınız. Bu, sorunun koşullarını tamamen değiştirir. Marc'a +1 veriyorum. Mükemmel cevap.
jessegavin

2
Jenson'un yapmaya çalıştığı (ve açıkça ifade etmesi gereken) noktanın display: table-cell, div'lerin aynı satırda / vb. Sonraki div'lerin oluşturulması gibi davranması beklenmeyen şekillerde davranmasını sağladığından oldukça eminim .
taswyn

74

daha modern bir yaklaşım css flex-box kullanmak olacaktır.

div {
  height: 50px;
  background: grey;
  display: flex;
  align-items: center
}
<div>
  <label for='name'>Name:</label>
  <input type='text' id='name' />
</div>

daha karmaşık bir örnek ... esnek akışta birden çok öğeye sahipseniz, tek öğeleri belirtilen hizalamaya farklı şekilde hizalamak için kendini hizalamayı kullanabilirsiniz ...

div {
  display: flex;
  align-items: center
}

* {
  margin: 10px
}

label {
  align-self: flex-start
}
<div>
  <img src="https://de.gravatar.com/userimage/95932142/195b7f5651ad2d4662c3c0e0dccd003b.png?size=50" />
  <label>Text</label>
  <input placeholder="Text" type="text" />
</div>

ayrıca yatay ve dikey olarak ortalanması çok kolaydır:

div {
  position:absolute;
  top:0;left:0;right:0;bottom:0;
  background: grey;
  display: flex;
  align-items: center;
  justify-content:center
}
<div>
  <label for='name'>Name:</label>
  <input type='text' id='name' />
</div>


Etikete sarılmış bir resim ve metin olduğunda bunun işe yaramasını diliyorum. Metin ve ardından küçük bir simge var, ancak metin yerinden oynamıyor.
Kevin Scharnhorst

etiket ve metin ayrı öğelerse veya etiketinizi de esnek kutu yaparsanız işe yarar ...
Holger Will

display:flexdaha az uyumluluğu var, chrome

14

Bu, tarayıcılar arası çalışır, daha fazla erişilebilirlik sağlar ve daha az işaretleme ile gelir. div'i bırakın. Etiketi sarın

label{
     display: block; 
     height: 35px; 
     line-height: 35px; 
     border: 1px solid #000; 
}

input{margin-top:15px; height:20px}

<label for="name">Name: <input type="text" id="name" /></label>

3
Bu açıkça iki satırlı bir etiket için çalışmayacaktır. Ve eğer etiketin her zaman tek satır olduğundan eminseniz, milyonlarca başka alternatif vardır.
Lashae

16
soru tek satırlık bir etiketle ilgiliydi ve buna göre cevap verdim. Buradaki nokta (ları) nızdan veya niyetinizden emin değilim, ancak x bu kadar açıksa, gidip milyonlarca örnek yapmalısınız. en azından cevabımın altında övünebilir ve milyonlarca zaferinizin gücünü hissedebilirsiniz. Bravo.
albert

2
Bu, tek satırlı etiketler için en iyi cevaptır. Spesifikasyon şöyle der: "for özniteliği belirtilmezse, ancak etiket öğesinin etiketlenebilir formla ilişkili bir alt öğesi varsa, ağaç sırasındaki bu türden ilk alt öğe, etiket öğesinin etiketli kontrolüdür." Bu nedenle, maksimum basitlik için forve idniteliklerini atlayabileceğiniz tek yaklaşım budur .
parlamento

8

Bu sorunun iki yıldan uzun bir süre önce sorulduğunun farkındayım, ancak yeni izleyiciler için işte Marc-François'nın çözümüne göre birkaç avantajı olan alternatif bir çözüm:

div {
    height: 50px;
    border: 1px solid blue;
    line-height: 50px;
}

Burada sadece line-heightdiv'in yüksekliğine eşit bir ekliyoruz . Bunun avantajı, div'in display özelliğini artık uygun gördüğünüz gibi değiştirebilmenizdir ve inline-blockiçeriği dikey olarak ortalanmış olarak kalacaktır. Kabul edilen çözüm, div'i bir tablo hücresi olarak değerlendirmenizi gerektirir. Bu, tarayıcılar arası mükemmel şekilde çalışmalıdır.

Diğer tek avantaj, iki yerine sadece bir CSS kuralı olmasıdır :)

Şerefe!


6

Kullanım paddingüzerinde div( üst ve alt ) ve vertical-align:middleüzerinde labelve input.

http://jsfiddle.net/VLFeV/1/ adresinde örnek


Bu jsfiddle'da işe yaramaz. Yüksekliğini değiştirdim divve içindeki içerik hiç hareket etmedi. Bir şey mi kaçırıyorum?
BeemerGuy

Bence düzenler sabit piksel yüksekliğine sahip olmamalıdır ... Düzenlerin içerik etrafında akıcı bir şekilde akması gerekir. Ancak, tarayıcıların yakınlaştırırken ve uzaklaştırırken metin boyutlarını ölçeklendirdiği bir gün ve zamandan geliyorum. Son tarayıcılar aslında tüm sayfayı ölçeklendirir, bu nedenle piksel yüksekliklerini ayarlamak biraz daha iyi çalışır. Ancak, piksel yüksekliklerini ayarlamaktan kaçınmak için yepyeni nedenler var… örneğin, duyarlı yerleşim teknikleri. Bu yüzden tercih ettiğim yöntem bu olurdu.
üçüncü kişi

3

Etiketi ve girişi tanımlı bir yüksekliğe sahip başka bir div'e sarın. Bu, 8'den düşük IE sürümlerinde çalışmayabilir.

position:absolute; 
top:0; bottom:0; left:0; right:0;
margin:auto;

0

display: table-cellÖzelliği aşağıdaki kodda olduğu gibi kullanabilirsiniz :

div {
     height: 100%;
     display: table-cell; 
     vertical-align: middle;
    }
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.