Văn bản căn chỉnh dọc CSS bên trong li


99

Tôi đang hiển thị số hộp trong một hàng với chiều cao và chiều rộng cố định, được tạo từ thẻ <li>. bây giờ tôi cần căn chỉnh văn bản ở trung tâm dọc. CSS vertical-align không có tác động, có lẽ tôi đang thiếu cái gì đó ???

Tôi không tìm kiếm các thủ thuật sử dụng (margin, padding, line-height), những thủ thuật này sẽ không hoạt động vì một số văn bản dài và sẽ bị ngắt thành hai dòng.

Vui lòng tìm mã thực tế:

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

Mã 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
bạn có thể cần cung cấp thêm thông tin. Các hộp có cùng chiều cao? Bạn có đang căn chỉnh văn bản bên trong các ô trong ô li không? "vì một số văn bản dài ... hai dòng" ??? Có thể là một ảnh chụp màn hình hoặc một trò đùa sẽ hữu ích.
KMC

1
Tôi vừa cố gắng đăng một ảnh chụp màn hình nhưng nó không cho phép tôi, vì tài khoản của tôi là mới.
AK4668 17/12/11

Câu trả lời:


100

Xác định display: tablephần tử gốc với vertical-align: middlevà chính phần tử với và display: table-cell.


4
+1 để sử dụng bảng / bảng-ô hiển thị. Có vẻ như không nhiều người biết đến sự tồn tại của chúng.
powerbuoy

5
Đây là từ W3CSchool ... Lưu ý: Các giá trị "inline-table", "run-in", "table", "table-caption", "table-cell", "table-column", "table-column- group "," table-row "," table-row-group "và" inherit "không được hỗ trợ trong IE7 trở về trước. IE8 yêu cầu a! DOCTYPE. IE9 hỗ trợ các giá trị.
AK4668 25/12/11

20
giải pháp này tệ vì nó hoàn toàn tắt mọi tác động của ký quỹ. Giải pháp duy nhất cho điều này là tạo ra hàng tấn yếu tố giả. Sao css bú nhiều thế.
Muhammad Umer

Điều gì về <li>việc đi vào một hàng duy nhất?
polkovnikov.ph

1
Ngoài ra, điều này không tuân thủ khả năng truy cập CATO nếu bạn đang KHÔNG hiển thị dữ liệu dạng bảng.
Stevo Perisic

59

line-heightlà cách bạn căn chỉnh văn bản theo chiều dọc. Nó khá chuẩn và tôi không coi đó là một "bản hack". Chỉ cần thêm line-height: 100pxvào của bạn ul.catBlock livà nó sẽ ổn.

Trong trường hợp này, bạn có thể phải thêm nó vào ul.catBlock li athay vì tất cả văn bản bên trong licũng nằm trong một a. Tôi đã thấy một số điều kỳ lạ xảy ra khi bạn làm điều này, vì vậy hãy thử cả hai và xem cái nào hiệu quả.


21
Tôi đã sử dụng line-height ban đầu nhưng khi nội dung dài nó sẽ bị chia thành 2 dòng và giả sử khoảng cách mỗi dòng là 100px và sẽ làm cho nội dung trông xấu hơn. Còn cách nào khác không?
AK4668 17/12/11

2
Tôi nghĩ rằng có một cách để có vertical-align: middlenếu bạn có display: table-cell. Tôi chưa bao giờ sử dụng nó mặc dù. Hãy xem ở đây: phrogz.net/css/vertical-align/index.html
Logan Serman

Giải pháp tuyệt vời - tôi đặt 'chiều cao dòng' bằng với chiều cao tối thiểu của tôi và văn bản được căn chỉnh theo chiều dọc - ít nhất là đủ gần để kiểm tra trực quan. Giải pháp 'bảng' ở trên chắc chắn không có ngữ nghĩa và bản chất là hackish. Bất cứ lúc nào chúng tôi làm điều đó, chúng tôi đang tăng khả năng hiển thị bị hỏng hoặc hành vi kỳ quặc ở đâu đó trong bối cảnh đáp ứng.
CodeFinity

Cảm ơn! Hoạt động tuyệt vời trên phần tử <a>! Thật là một giải pháp đơn giản :-) Chỉ cần chỉnh sửa nó cho đúng giá trị và nó căn giữa hoàn hảo theo chiều dọc!
Asle

45

Tuy nhiên, phản hồi này có thể bị trễ nhiều năm, bất kỳ ai bắt gặp điều này có thể chỉ muốn thử

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

Hỗ trợ trình duyệt cho flexbox tốt hơn nhiều so với khi @scottjoudry đăng phản hồi của anh ấy ở trên, nhưng bạn vẫn có thể muốn xem xét tiền tố hoặc các tùy chọn khác nếu bạn đang cố gắng hỗ trợ các trình duyệt cũ hơn nhiều. caniuse: flex


Điều này không chơi đẹp với list-style-imagetrong Chrome - biến mất hình ảnh
Benjineer

1
Tôi đã sử dụng điều này trên bootstrap 4 nav-item và nó hoạt động hoàn hảo. Cám ơn.
010110110101

hộp flex tiết kiệm sống như mọi khi
Arthur Medeiros

16

Đáng ngạc nhiên là (hoặc không), vertical-aligncông cụ thực sự hoạt động tốt nhất cho công việc này. Hơn hết, không cần Javascript.

Trong ví dụ sau, tôi đang định vị outerlớp ở giữa phần thân và innerlớp ở giữa outerlớp.

Xem trước: 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; }

Căn chỉnh dọc hoạt động bằng cách sắp xếp các tâm của các phần tử cạnh nhau. Áp dụng căn chỉnh theo chiều dọc cho một phần tử đơn lẻ hoàn toàn không có tác dụng gì. Nếu bạn thêm phần tử thứ hai không có chiều rộng nhưng là chiều cao của vùng chứa, phần tử đơn lẻ của bạn sẽ di chuyển đến tâm theo chiều dọc với phần tử không có chiều rộng này, do đó căn giữa nó theo chiều dọc. Yêu cầu duy nhất là bạn đặt cả hai phần tử thành nội tuyến (hoặc khối nội tuyến) và đặt thuộc tính căn chỉnh dọc của chúng thành vertical-align: middle.

Lưu ý: Bạn có thể nhận thấy trong mã của tôi bên dưới rằng <span>thẻ và thẻ của tôi <div>đang chạm vào. Bởi vì cả hai đều là phần tử nội tuyến, một khoảng trắng sẽ thực sự thêm một khoảng trắng giữa phần tử no-width và div của bạn, vì vậy hãy đảm bảo loại bỏ nó.


1
Tuyệt vời, nó có ý nghĩa tốt. // Tôi không thể bỏ phiếu cho câu trả lời của bạn bây giờ vì danh tiếng tối thiểu của tôi phải là 15.
AK4668 23/12/11

1
Đối với những người bạn đang tìm kiếm kỹ thuật này áp dụng trực tiếp cho câu hỏi - jsfiddle.net/utGVt/385
Wex

15

Trong tương lai, vấn đề này sẽ được giải quyết bằng flexbox. Ngay bây giờ, hỗ trợ trình duyệt là ảm đạm, nhưng nó được hỗ trợ ở dạng này hay dạng khác trong tất cả các trình duyệt hiện tại.

Hỗ trợ trình duyệt: 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;
}

Thông tin cơ bản về Flexbox: http://css-tricks.com/snippets/css/a-guide-to-flexbox/


1
Vào thời điểm câu hỏi này được hỏi, tôi không chắc đây sẽ là một câu trả lời hay nhưng hôm nay chúng ta đang thấy hỗ trợ tiền tố ~ 95% vì vậy tôi chắc chắn nghĩ rằng đây là một lựa chọn khả thi.
Wex

Nếu bạn muốn các phần tử <li> quấn (thay vì bị thu nhỏ), hãy thêm flex-wrap: wrap; ở cấp độ <ul>
Thierry

Tôi cũng thêm lớp này vào phần tử nào?
Matt M.

6

Không có câu trả lời hoàn hảo nào được cung cấp ở đây ngoại trừ câu trả lời của Asaf không cung cấp bất kỳ mã nào cũng như bất kỳ ví dụ nào, vì vậy tôi muốn đóng góp ...

Inorder để vertical-align: middle;hoạt động, bạn cần sử dụng display: table;cho ulphần tử của mình và display: table-cell;cho licác phần tử và nhiều hơn bạn có thể sử dụng vertical-align: middle;cho licác phần tử.

Bạn không cần cung cấp bất kỳ rõ ràng margins, paddingsđể làm cho văn bản của bạn theo chiều dọc giữa.

Bản giới thiệu

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

Điều này không giúp đỡ vì lý do duy nhất của nó được liên kết theo chiều dọc là bởi vì bạn buộc nó xuống với lớp đệm trên một thẻ
str11

@ Mr.Alien Tôi sẽ nhắc lại mặc dù vấn đề duy nhất với giải pháp này là các quy tắc ký quỹ bị bỏ qua.
Thomas

4

Như đã giải thích ở đây: https://css-tricks.com/centering-in-the-unknown/ .

Như đã được thử nghiệm trong thực tế, giải pháp đáng tin cậy nhưng thanh lịch nhất là chèn một phần tử nội tuyến hỗ trợ vào <li />phần tử là phần tử con thứ nhất, chiều cao phải được đặt thành 100% (chiều cao của cha mẹ của nó, dấu <li />) và vertical-alignđặt nó thành trung bình . Để đạt được điều này, bạn có thể đặt một <span />, nhưng cách thuận tiện nhất là sử dụng li:afterlớp giả.

Ảnh chụp màn hình: nhập mô tả hình ảnh ở đây

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

Hãy thử giải pháp này

Hoạt động tốt nhất trong hầu hết các trường hợp

bạn có thể phải sử dụng div thay vì li cho điều đó

.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
Tại sao điều này cần một divHelper để căn chỉnh theo chiều dọc? Tôi thấy nó trên một chủ đề khác, nhưng tôi không thể hiểu tại sao nó không gắn kết nó tự mà không div khác ..
Sasha Chirico

0

Giải pháp đơn giản cho căn chỉnh dọc giữa ... đối với tôi, nó hoạt động như một sự quyến rũ

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;}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.