Li içinde CSS dikey hizalama metni


101

<li> etiketlerinden oluşturulan sabit yükseklik ve genişlikte arka arkaya kutu sayısını görüntülüyorum. şimdi metni dikey merkeze hizalamam gerekiyor. CSS dikey hizalamasının hiçbir etkisi yoktur, belki bir şeyi kaçırıyorum ???

(Margin, padding, line-height) kullanarak hileler aramıyorum, bunlar çalışmayacak çünkü bazı metinler uzun ve iki satıra bölünecek.

Lütfen gerçek kodu bulun:

CSS kodu

ul.catBlock{
  width:960px; 
  height: 270px; 
  border:1px solid #ccc; 
}

ul.catBlock li{
  list-style: none; 
  float:left; 
  display:block; 
  text-align: center; 
  width:160px; 
  height: 100px;
}

ul.catBlock li a{ 
  display: block;  
  padding: 30px 10px 5px 10px; 
  height:60px;
}

HTML Kodu

<ul class="catBlock">
 <li><a href="#">IP Phone</a></li>
 <li><a href="#">Dual SIM Switch Server</a></li>
 <li><a href="#">IP PBX</a></li>
</ul>

3
daha fazla bilgi vermeniz gerekebilir. Kutular aynı yükseklikte mi? Li'deki kutuların içindeki metni hizalıyor musunuz? "çünkü bazı metinler uzun ... iki satırdır" ??? Bir ekran görüntüsü olabilir veya bir keman yardımcı olabilir.
KMC

1
Sadece bir ekran görüntüsü göndermeyi denedim ama hesabım yeni olduğu için bana izin vermiyor.
AK4668

Yanıtlar:


101

İle ebeveyn tanımlayın display: tableve birlikte elemanı kendisi vertical-align: middleve display: table-cell.


4
Ekran tablosu / tablo hücresi kullanmak için +1. Görünüşe göre pek çok insan varlığından haberdar değil.
powerbuoy

5
Bu W3CSchool'dan ... Not: "inline-table", "run-in", "table", "table-caption", "table-cell", "table-column", "table-column- değerleri grup "," tablo satırı "," tablo satırı grubu "ve" devralma "IE7 ve önceki sürümlerde desteklenmez. IE8 bir! DOCTYPE gerektirir. IE9 değerleri destekler.
AK4668

21
bu çözüm, marjın herhangi bir etkisini tamamen kapattığı için berbattır. Bunun tek çözümü, tonlarca sözde eleman yapmaktır. CSS neden bu kadar berbat?
Muhammed Umer

<li>Tek sıraya girmeye ne dersin ?
polkovnikov.ph

1
Ayrıca, aslında tablo verilerini GÖSTERMİYORSANIZ, bu CATO erişilebilirlik uyumlu değildir.
Stevo Perisic

59

line-heightmetni dikey olarak nasıl hizaladığınızdır. Oldukça standart ve ben bunu bir "hack" olarak görmüyorum. Sadece line-height: 100pxkendinize ekleyin ul.catBlock live iyi olacak.

Bu durumda ul.catBlock li a, içindeki tüm metin lide bir a. Bunu yaptığınızda bazı tuhaf şeyler olduğunu gördüm, bu yüzden ikisini de deneyin ve hangisinin işe yaradığını görün.


22
Başlangıçta satır yüksekliği kullandım ancak içerik uzun olduğunda 2 satıra bölünecek ve diyelim her satırda 100px boşluk ve daha kötü görünecek. başka yol var mı
AK4668

2
Sanırım sahip olmanın bir yolu vertical-align: middlevar display: table-cell. Yine de hiç kullanmadım. Şuraya
Logan Serman

Harika çözüm - li 'satır yüksekliğini' minimum yüksekliğimle aynı olacak şekilde ayarladım ve metin dikey olarak hizalı - en azından görsel bir inceleme için yeterince yakın. Yukarıdaki 'tablo' çözümü kesinlikle anlambilimsel değildir ve doğası gereği hilekârdır. Bunu her yaptığımızda, duyarlı ortamın herhangi bir yerinde bozuk ekranlar veya ilginç davranışlar olasılığını artırıyoruz.
CodeFinity

Teşekkürler! <a> öğesinde harika çalışıyor! Ne kadar basit bir çözüm :-) Doğru değere ayarlayın ve dikey olarak mükemmel bir şekilde ortalanır!
Asle

46

Ne kadar uzun yıllar geç olursa olsun, bu yanıtla karşılaşan herhangi biri sadece denemek isteyebilir

li {
    display: flex;
    flex-direction: row;
    align-items: center;
}

Flexbox için tarayıcı desteği, @scottjoudry yukarıdaki yanıtını yayınladığında olduğundan çok daha iyidir, ancak çok daha eski tarayıcıları desteklemeye çalışıyorsanız, yine de ön ek veya diğer seçenekleri düşünmek isteyebilirsiniz. caniuse: esnek


1
Bu, list-style-imageChrome'da hoş görünmüyor - görüntü kayboluyor
Benjineer

1
Bunu bootstrap 4 nav öğesinde kullandım ve mükemmel çalıştı. Teşekkürler.
010110110101

esnek kutu tasarrufu her zamanki gibi canlı
Arthur Medeiros

16

Şaşırtıcı bir şekilde (ya da değil), vertical-alignaraç aslında bu iş için en iyi sonucu verir. Hepsinden iyisi, Javascript gerekli değildir.

Aşağıdaki örnekte outersınıfı vücudun innerortasında, outersınıfı da sınıfın ortasında konumlandırıyorum .

Önizleme: http://jsfiddle.net/tLkSV/513/

HTML:

<div id="container">
    <span></span><div class="outer">
        <span></span><div class="inner">

        </div>
    </div>
</div>

CSS:

html, body {
    height: 100%;
    margin: 0;
    padding: 0; }
#container {
    text-align: center;
    height: 100%; }
span { 
    height: 100%;
    vertical-align: middle;
    display: inline-block; }
.outer {
    width: 100px;
    height: 200px;
    padding: 0;
    border: 1px solid #000;
    vertical-align: middle;
    display: inline-block; }
.inner {
    background: red;
    width: 30px;
    height: 20px;    
    vertical-align: middle;
    display: inline-block; }

Dikey hizalama, yan yana olan öğelerin merkezlerini hizalayarak çalışır. Tek bir öğeye dikey hizalama uygulamak kesinlikle hiçbir şey yapmaz. Genişliği olmayan ancak kabın yüksekliği olan ikinci bir öğe eklerseniz, tek öğeniz bu genişliksiz öğeyle dikey olarak ortalanacak ve böylece dikey olarak ortalanacaktır. Tek gereksinim, her iki öğeyi de satır içi (veya satır içi blok) ve dikey hizalama özniteliklerini olarak ayarlamanızdır vertical-align: middle.

Not: Aşağıdaki kodumda <span>etiketimin ve <div>etiketimin birbirine dokunduğunu fark edebilirsiniz. Her ikisi de satır içi öğeler olduğundan, boşluk aslında genişliksiz öğe ile div öğeniz arasına bir boşluk ekleyecektir, bu nedenle boş bıraktığınızdan emin olun.


1
Harika, mantıklı. // Cevabınıza şu anda oy veremiyorum çünkü minimum itibarım 15 olmalı.
AK4668

1
Doğrudan soruya uygulanan bu tekniği arayanlar için - jsfiddle.net/utGVt/385
Wex

16

Gelecekte bu sorun flexbox ile çözülecektir. Şu anda tarayıcı desteği yetersiz, ancak mevcut tüm tarayıcılarda şu veya bu şekilde destekleniyor.

Tarayıcı desteği: http://caniuse.com/flexbox

.vertically_aligned {

    /* older webkit */
    display: -webkit-box;
    -webkit-box-align: center;
    -webkit-justify-content: center;

    /* older firefox */
    display: -moz-box;
    -moz-box-align: center;
    -moz-box-pack: center;

    /* IE10*/
    display: -ms-flexbox;
    -ms-flex-align: center;
    -ms-flex-pack: center;

    /* newer webkit */
    display: -webkit-flex;
    -webkit-align-items: center;
    -webkit-box-pack: center;

    /* Standard Form - IE 11+, FF 22+, Chrome 29+, Opera 17+ */
    display: flex;
    align-items: center;
    justify-content: center;
}

Flexbox ile ilgili arka plan: http://css-tricks.com/snippets/css/a-guide-to-flexbox/


2
Bu soru sorulduğunda, bunun iyi bir cevap olacağından emin değilim, ancak bugün ~% 95 önekli destek görüyoruz , bu yüzden kesinlikle bunun geçerli bir seçenek olduğunu düşünüyorum.
Wex

<li> öğelerinin sarılmasını istiyorsanız (küçültülmek yerine), flex-wrap: wrap; <ul> seviyesinde
Thierry

Bu sınıfa hangi öğeyi ekledim?
Mat M.

6

Burada hiçbir kod veya örnek sağlamayan Asaf'ın cevabı dışında mükemmel cevaplar yok, bu yüzden benimkine katkıda bulunmak istiyorum ...

Yapmak için Inorder vertical-align: middle;çalışmaları, kullanmak gerekir display: table;sizin için uleleman ve display: table-cell;için lielemanlar ve kullanabileceğiniz daha vertical-align: middle;için lielemanlar.

Herhangi açık sağlamak gerekmez margins, paddingsmetin dikey olarak orta yapmak.

Demo

ul.catBlock{
    display: table;
    width:960px; 
    height: 270px; 
    border:1px solid #ccc; 
}

ul.catBlock li {
    list-style: none;
    display: table-cell; 
    text-align: center; 
    width:160px; 
    vertical-align: middle;
}

ul.catBlock li a { 
    display: block;
}

Dikey olarak hizalanmasının tek nedeni, etiketi bir etiketin üzerine doldurmaya
zorlamanız olduğu için yardımcı olmuyor

@ Bay Alien Bu çözümle ilgili tek sorunun, marj kurallarının göz ardı edilmesi olduğunu yinelemek istiyorum.
Thomas

4

Burada açıklandığı gibi: https://css-tricks.com/centering-in-the-unknown/ .

Gerçek uygulamada test edildiği gibi, en güvenilir ancak zarif çözüm, <li />1. çocuk olarak elemana yardımcı bir satır içi eleman eklemektir, bu eleman yüksekliği% 100'e (ebeveynin yüksekliğine göre, a <li />) ve vertical-alignorta olarak ayarlanmalıdır. . Bunu başarmak için a koyabilirsiniz <span />, ancak en uygun yol li:aftersözde sınıf kullanmaktır .

Ekran görüntüsü: görüntü açıklamasını buraya girin

ul.menu-horizontal {
    list-style-type: none;
    margin: 0;
    padding: 0;
    display: inline-block;
    vertical-align: middle;
}

ul.menu-horizontal:after {
    content: '';
    clear: both;
    float: none;
    display: block;
}

ul.menu-horizontal li {
    padding: 5px 10px;
    box-sizing: border-box;
    height: 100%;
    cursor: pointer;
    display: inline-block;
    vertical-align: middle;
    float: left;
}

/* The magic happens here! */
ul.menu-horizontal li:before {
    content: '';
    display: inline;
    height: 100%;
    vertical-align: middle;
}

1

Bu çözümü bir deneyin

Çoğu durumda en iyi şekilde çalışır

Kullanmak gerekebilir div yerine li bunun için

.DivParent {
    height: 100px;
    border: 1px solid lime;
    white-space: nowrap;
}
.verticallyAlignedDiv {
    display: inline-block;
    vertical-align: middle;
    white-space: normal;
}
.DivHelper {
    display: inline-block;
    vertical-align: middle;
    height:100%;
}
<div class="DivParent">
    <div class="verticallyAlignedDiv">
        <p>Isnt it good!</p>
     
    </div><div class="DivHelper"></div>
</div>


1
Neden dikey hizalamak için bir divHelper'a ihtiyaç var? Bunu başka bir konuda gördüm, ama neden başka bir div olmadan kendisini hizalamadığını anlayamıyorum ..
Sasha Chirico

0

Dikey hizalama orta için basit çözüm ... benim için bir cazibe gibi çalışıyor

ul{display:table; text-align:center; margin:0 auto;}
li{display:inline-block; text-align:center;}
li.items_inside_li{display:inline-block; 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.