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

Asaf Chertkoff
sumber
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.

Logan Serman
sumber
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

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

Wex
sumber
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/

Scott Joudry
sumber
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;
}
Tuan Alien
sumber
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;
}
Jeff Tian
sumber
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>

keshav
sumber
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;}
Fahad Ali
sumber