Teks perataan vertikal CSS di dalam li


100

Saya menampilkan jumlah kotak dalam satu baris dengan tinggi dan lebar tetap, yang dihasilkan dari tag <li>. sekarang saya perlu meratakan teks di tengah vertikal. Perataan vertikal CSS tidak berdampak, mungkin saya melewatkan sesuatu ???

Saya tidak mencari trik menggunakan (margin, padding, line-height), ini tidak akan berfungsi karena beberapa teks panjang dan akan pecah menjadi dua baris.

Silakan temukan kode sebenarnya:

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

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

2
Anda mungkin perlu memberikan informasi lebih lanjut. Apakah kotak-kotak itu memiliki tinggi yang sama? Apakah Anda menyelaraskan teks di dalam kotak di li? "karena beberapa teks panjang ... dua baris" ??? Mungkin tangkapan layar atau biola akan membantu.
KMC

1
Saya baru saja mencoba memposting tangkapan layar tetapi tidak mengizinkan saya, karena akun saya baru.
AK4668

Jawaban:


100

Definisikan induk dengan display: tabledan elemen itu sendiri dengan vertical-align: middledan display: table-cell.


4
1 untuk menggunakan tabel tampilan / sel tabel. Sepertinya tidak banyak orang yang sadar akan keberadaan mereka.
powerbuoy

5
Ini dari W3CSchool ... Catatan: Nilai "inline-table", "run-in", "table", "table-caption", "table-cell", "table-column", "table-column- group "," table-row "," table-row-group ", dan" inherit "tidak didukung di IE7 dan sebelumnya. IE8 membutuhkan! DOCTYPE. IE9 mendukung nilai.
AK4668

20
solusi ini menyebalkan karena benar-benar mematikan efek margin. Satu-satunya solusi untuk ini adalah membuat berton-ton elemen semu. Mengapa css sangat menyedot.
Muhammad Umer

Bagaimana dengan <li>masuk ke satu baris?
polkovnikov.ph

1
Ini juga tidak sesuai dengan aksesibilitas CATO jika Anda sebenarnya TIDAK menampilkan data tabel.
Stevo Perisic

59

line-heightadalah cara Anda meratakan teks secara vertikal. Ini cukup standar dan saya tidak menganggapnya sebagai "retasan". Tambahkan saja line-height: 100pxke Anda ul.catBlock lidan itu akan baik-baik saja.

Dalam hal ini Anda mungkin harus menambahkannya ul.catBlock li akarena semua teks di dalam lijuga ada di dalam file a. Saya telah melihat beberapa hal aneh terjadi ketika Anda melakukan ini, jadi cobalah keduanya dan lihat mana yang berhasil.


21
Saya telah menggunakan tinggi garis pada awalnya tetapi ketika kontennya panjang, itu akan pecah menjadi 2 baris dan katakanlah 100px celah setiap baris dan akan membuatnya terlihat lebih buruk. apakah ada cara lain?
AK4668

2
Saya pikir ada cara untuk memilikinya vertical-align: middlejika Anda punya display: table-cell. Saya belum pernah menggunakannya. Lihat di sini: phrogz.net/css/vertical-align/index.html
Logan Serman

Solusi hebat - Saya menyetel li 'line height' menjadi sama dengan min-height saya, dan teksnya disejajarkan secara vertikal - setidaknya cukup dekat untuk inspeksi visual. Solusi 'tabel' di atas tentunya tidak semantik, dan bersifat hackish. Setiap kali kami melakukan itu, kami meningkatkan kemungkinan tampilan rusak atau perilaku unik di suatu tempat dalam lanskap responsif.
CodeFinity

Terima kasih! Berfungsi dengan baik pada elemen <a>! Sungguh solusi yang sederhana :-) Cukup sesuaikan untuk mengoreksi nilai dan pusatnya sempurna secara vertikal!
Asle

45

Betapa pun terlambatnya tanggapan ini selama bertahun-tahun, siapa pun yang menemukan ini mungkin hanya ingin mencoba

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

Dukungan browser untuk flexbox jauh lebih baik daripada saat @scottjoudry memposting tanggapannya di atas, tetapi Anda mungkin masih ingin mempertimbangkan untuk memberi awalan atau opsi lain jika Anda mencoba mendukung browser yang jauh lebih lama. caniuse: flex


Ini tidak menyenangkan list-style-imagedi Chrome - gambar menghilang
Benjineer

1
Saya menggunakan ini pada bootstrap 4 nav-item dan bekerja dengan sempurna. Terima kasih.
010110110101

flex box saving live seperti biasa
Arthur Medeiros

16

Anehnya (atau tidak), vertical-alignalat tersebut benar-benar berfungsi paling baik untuk pekerjaan ini. Yang terbaik dari semuanya, tidak diperlukan Javascript.

Dalam contoh berikut, saya memposisikan outerkelas di tengah tubuh, dan innerkelas di tengahouter kelas.

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

Perataan vertikal bekerja dengan menyelaraskan pusat elemen yang bersebelahan. Menerapkan perataan vertikal ke satu elemen sama sekali tidak berarti. Jika Anda menambahkan elemen kedua yang tidak memiliki lebar tetapi merupakan tinggi wadah, elemen tunggal Anda akan berpindah ke tengah vertikal dengan elemen tanpa lebar ini, sehingga memusatkannya secara vertikal. Satu-satunya persyaratan adalah Anda menyetel kedua elemen menjadi sebaris (atau blok sebaris), dan menyetel atribut perataan vertikal ke vertical-align: middle.

Catatan: Anda mungkin melihat dalam kode saya di bawah bahwa <span>tag dan tag saya <div>bersentuhan. Karena keduanya adalah elemen sebaris, spasi sebenarnya akan menambahkan spasi antara elemen tanpa lebar dan div Anda, jadi pastikan untuk membiarkannya.


1
Fantastis, itu masuk akal. // Aku tidak bisa memilih jawabanmu sekarang karena reputasi
minku

1
Bagi Anda yang mencari teknik ini diterapkan langsung ke pertanyaan - jsfiddle.net/utGVt/385
Wex

15

Di masa mendatang, masalah ini akan diselesaikan dengan flexbox. Saat ini dukungan browser suram, tetapi didukung dalam satu bentuk atau lainnya di semua browser saat ini.

Dukungan browser: 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;
}

Latar belakang di Flexbox: http://css-tricks.com/snippets/css/a-guide-to-flexbox/


1
Pada saat pertanyaan ini diajukan, saya tidak yakin ini akan menjadi jawaban yang baik, tetapi hari ini kami melihat ~ 95% prefixed support jadi saya yakin ini adalah opsi yang layak.
Wex

Jika Anda ingin elemen <li> membungkus (bukan menyusut), tambahkan flex-wrap: wrap; di <ul> level
Thierry

Elemen apa yang saya tambahkan pada kelas ini juga?
Matt M.

6

Tidak ada jawaban sempurna yang diberikan di sini kecuali jawaban Asaf yang tidak memberikan kode atau contoh apa pun, jadi saya ingin berkontribusi milik saya ...

Untuk membuat vertical-align: middle;pekerjaan, Anda perlu menggunakan display: table;untuk ulelemen Anda dan display: table-cell;untuk lielemen dan daripada yang dapat Anda gunakan vertical-align: middle;untuk lielemen.

Anda tidak perlu memberikan eksplisit apa pun margins, paddingsuntuk membuat teks Anda vertikal di tengah.

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

Ini tidak membantu karena satu-satunya alasannya disejajarkan secara vertikal adalah karena Anda memaksanya turun dengan bantalan pada tag
str11

@ Tn. Alien Saya akan tegaskan bahwa satu-satunya masalah dengan solusi ini adalah aturan margin diabaikan.
Thomas

4

Seperti yang dijelaskan di sini: https://css-tricks.com/centering-in-the-unknown/ .

Seperti yang diuji dalam praktik nyata, solusi yang paling andal namun elegan adalah memasukkan elemen sebaris asisten ke dalam <li />elemen sebagai anak pertama, yang tingginya harus disetel ke 100% (dari tinggi induknya, the <li />), dan vertical-aligndisetel ke tengah . Untuk mencapai ini, Anda dapat meletakkan <span />, tetapi cara yang paling nyaman adalah dengan menggunakan li:afterkelas pseudo.

Tangkapan layar: masukkan deskripsi gambar di sini

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

Cobalah solusi ini

Berfungsi paling baik di sebagian besar kasus

Anda mungkin harus menggunakan div, bukan li untuk itu

.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
Mengapa ini membutuhkan divHelper untuk menyelaraskan vertikal? Saya melihatnya di topik lain, tapi saya tidak bisa mengerti mengapa itu tidak menyelaraskan dirinya sendiri tanpa div lain ..
Sasha Chirico

0

Solusi sederhana untuk perataan vertikal tengah ... bagi saya itu berfungsi seperti pesona

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;}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.