Wyrównanie tekstu CSS w pionie wewnątrz li

100

Wyświetlam liczbę pól w rzędzie z ustaloną wysokością i szerokością, wygenerowaną z tagów <li>. teraz muszę wyrównać tekst do środka w pionie. Wyrównanie w pionie CSS nie ma wpływu, może coś mi brakuje ???

Nie szukam trików z użyciem (margines, dopełnienie, wysokość linii), te nie zadziałają, ponieważ niektóre teksty są długie i podzielą się na dwie linie.

Znajdź aktualny kod:

Kod CSS

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

Kod HTML

<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>
AK4668
źródło
2
może być konieczne podanie dodatkowych informacji. Czy pudełka są tej samej wysokości? Czy wyrównujesz tekst wewnątrz pól w li? „ponieważ niektóre teksty są długie ... dwie linie” ??? Może pomóc zrzut ekranu lub skrzypce.
KMC
1
Właśnie próbowałem opublikować zrzut ekranu, ale mi to nie pozwala, ponieważ moje konto jest nowe.
AK4668

Odpowiedzi:

100

Zdefiniuj rodzica za pomocą display: tablei sam element za pomocą vertical-align: middlei display: table-cell.

Asaf Chertkoff
źródło
4
+1 za korzystanie z tabeli wyświetlania / komórki tabeli. Wydaje się, że niewielu ludzi zdaje sobie sprawę z ich istnienia.
powerbuoy
5
To pochodzi z W3CSchool ... Uwaga: wartości „inline-table”, „run-in”, „table”, „table-caption”, „table-cell”, „table-column”, „table-column- group ”,„ table-row ”,„ table-row-group ”i„ inherit ”nie są obsługiwane w przeglądarce IE7 i starszych. IE8 wymaga! DOCTYPE. IE9 obsługuje te wartości.
AK4668,
20
to rozwiązanie jest do bani, ponieważ całkowicie eliminuje efekt marży. Jedynym rozwiązaniem tego jest zrobienie mnóstwa pseudoelementów. Dlaczego css tak bardzo ssie.
Muhammad Umer
A co z <li>wejściem w jeden rząd?
polkovnikov.ph
1
Nie jest to również zgodne z ułatwieniami dostępu CATO, jeśli w rzeczywistości NIE wyświetlasz danych tabelarycznych.
Stevo Perisic
59

line-heightto sposób wyrównania tekstu w pionie. Jest to dość standardowe i nie uważam tego za „hack”. Po prostu dodaj line-height: 100pxdo swojego ul.catBlock lii wszystko będzie dobrze.

W takim przypadku może być konieczne dodanie go ul.catBlock li azamiast tego, ponieważ cały tekst wewnątrz liznajduje się również wewnątrz pliku a. Widziałem kilka dziwnych rzeczy, kiedy to robisz, więc spróbuj obu i zobacz, która działa.

Logan Serman
źródło
21
Na początku użyłem linii wysokości, ale kiedy zawartość jest długa, podzieli się na 2 linie i powiedzmy, że każda linia jest przerwana o 100 pikseli i sprawi, że będzie wyglądać gorzej. czy jest jakiś inny sposób?
AK4668
2
Myślę, że jest sposób, aby to vertical-align: middlezrobić, jeśli masz display: table-cell. Jednak nigdy go nie używałem. Spójrz tutaj: phrogz.net/css/vertical-align/index.html
Logan Serman,
Świetne rozwiązanie - ustawiłem li 'wysokość linii' na taką samą, jak moja minimalna wysokość, a tekst jest wyrównany w pionie - przynajmniej na tyle blisko, aby można go było obejrzeć. Powyższe rozwiązanie „tabelowe” z pewnością nie jest semantyczne i ma charakter hackerski. Za każdym razem, gdy to robimy, zwiększamy prawdopodobieństwo zepsutych wyświetlaczy lub dziwacznego zachowania gdzieś w responsywnym krajobrazie.
CodeFinity,
Dzięki! Świetnie działa na elemencie <a>! Co za proste rozwiązanie :-) Po prostu dostosuj go, aby poprawić wartość, a wyśrodkuje się idealnie w pionie!
Asle
45

Jakkolwiek wiele lat opóźni się ta odpowiedź, każdy, kto się z tym spotka, może po prostu spróbować

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

Obsługa przeglądarki flexbox jest znacznie lepsza niż wtedy, gdy @scottjoudry opublikował swoją odpowiedź powyżej, ale nadal możesz rozważyć prefiksowanie lub inne opcje, jeśli próbujesz obsługiwać znacznie starsze przeglądarki. caniuse: flex

latanie
źródło
To nie gra dobrze list-style-imagew Chrome - obraz znika
Benjineer
1
Użyłem tego na module nawigacyjnym bootstrap 4 i działało idealnie. Dzięki.
010110110101
zapisywanie flex box na żywo jak zawsze
Arthur Medeiros
16

Zaskakujące (lub nie) vertical-alignnarzędzie faktycznie sprawdza się najlepiej w tym zadaniu. A co najlepsze, nie jest wymagany Javascript.

W poniższym przykładzie umieszczam outerklasę w środku ciała, a innerklasę w środku outerklasy.

Podgląd: 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; }

Wyrównanie w pionie polega na wyrównaniu środków elementów, które są obok siebie. Zastosowanie wyrównania w pionie do pojedynczego elementu nie daje absolutnie nic. Jeśli dodasz drugi element, który nie ma szerokości, ale jest wysokością kontenera, pojedynczy element przesunie się do środka w pionie z tym elementem bez szerokości, a tym samym wyśrodkuje go w pionie. Jedyne wymagania to ustawienie obu elementów na inline (lub inline-block) i ustawienie ich atrybutu vertical-align na vertical-align: middle.

Uwaga: w moim kodzie poniżej możesz zauważyć, że mój <span>tag i <div>tag stykają się. Ponieważ oba są elementami wbudowanymi, spacja faktycznie doda spację między elementem bez szerokości a elementem div, więc pamiętaj, aby go pominąć.

Wex
źródło
1
Fantastycznie, to ma sens. // Nie mogę teraz głosować na twoją odpowiedź, ponieważ moja minimalna reputacja powinna wynosić 15.
AK4668,
1
Dla tych z Was, którzy szukają tej techniki, zastosowanej bezpośrednio do pytania - jsfiddle.net/utGVt/385
Wex
15

W przyszłości ten problem zostanie rozwiązany przez flexbox. Obecnie obsługa przeglądarek jest fatalna, ale jest obsługiwana w takiej czy innej formie we wszystkich obecnych przeglądarkach.

Obsługa przeglądarek: 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;
}

Informacje o Flexbox: http://css-tricks.com/snippets/css/a-guide-to-flexbox/

Scott Joudry
źródło
1
W chwili, gdy zadano to pytanie, nie jestem pewien, czy byłaby to dobra odpowiedź, ale dzisiaj widzimy ~ 95% wsparcia z prefiksem, więc z pewnością uważam, że jest to realna opcja.
Wex,
Jeśli chcesz, aby elementy <li> były zawijane (zamiast zmniejszane), dodaj flex-wrap: wrap; na poziomie <ul>
Thierry
Jaki element mam dodać do tej klasy?
Matt M.
6

Nie ma tutaj doskonałych odpowiedzi poza odpowiedzią Asafa, która nie zawiera żadnego kodu ani żadnego przykładu, więc chciałbym wnieść swój ...

Aby vertical-align: middle;działać, musisz użyć display: table;dla swojego ulelementu i display: table-cell;dla lielementów, a potem możesz użyć vertical-align: middle;dla lielementów.

Nie musisz podawać żadnych wyraźnych informacji margins, paddingsaby tekst był ustawiony pionowo na środku.

Próbny

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;
}
Mr. Alien
źródło
To nie pomaga, ponieważ jedynym powodem, dla którego został wyrównany w pionie, jest to, że
wymusiłeś
@ Panie Alien Powtórzę, że jedynym problemem związanym z tym rozwiązaniem jest ignorowanie zasad dotyczących marginesów.
Thomas
4

Jak wyjaśniono tutaj: https://css-tricks.com/centering-in-the-unknown/ .

Jak zostało przetestowane w praktyce, najbardziej niezawodnym, ale eleganckim rozwiązaniem jest wstawienie pomocniczego elementu inline do <li />elementu jako pierwszego dziecka, którego wysokość należy ustawić na 100% (wzrostu jego rodzica, the <li />) i vertical-alignustawić na środek . Aby to osiągnąć, możesz wstawić a <span />, ale najwygodniejszym sposobem jest użycie li:afterpseudoklasy.

Zrzut ekranu: wprowadź opis obrazu tutaj

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;
}
Jeff Tian
źródło
1

Wypróbuj to rozwiązanie

Działa najlepiej w większości przypadków

Może trzeba użyć div zamiast li za to

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

keshav
źródło
1
Po co ten divHelper do wyrównania w pionie? Widziałem go na inny temat, ale nie mogę zrozumieć, dlaczego nie wyrównać to samo bez innego div ..
Sasha Chirico
0

Proste rozwiązanie do wyrównywania w pionie środka ... u mnie działa jak urok

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;}
Fahad Ali
źródło