Sắp xếp theo chiều dọc văn bản bên cạnh một hình ảnh?


1967

Tại sao không vertical-align: middlelàm việc? Tuy nhiên, vertical-align: top không hoạt động.

span{
  vertical-align: middle;
}
<div>
  <img src="http://lorempixel.com/30/30/" alt="small img" />
  <span>Doesn't work.</span>
</div>


12
Đây là một bài viết thú vị: Hiểu biếtvertical-align
Phaedrus

Câu trả lời:


2253

Trên thực tế, trong trường hợp này khá đơn giản: áp dụng căn chỉnh dọc cho hình ảnh. Vì tất cả trong một dòng, nó thực sự là hình ảnh bạn muốn căn chỉnh, không phải văn bản.

<!-- moved "vertical-align:middle" style from span to img -->
<div>
  <img style="vertical-align:middle" src="https://placehold.it/60x60">
  <span style="">Works.</span>
</div>

Đã thử nghiệm trong FF3.

Bây giờ bạn có thể sử dụng flexbox cho kiểu bố trí này.

.box {
   display: flex;
   align-items:center;
}
<div class="box">
    <img src="https://placehold.it/60x60">
    <span style="">Works.</span>
</div>


188
"Vì tất cả trong một dòng, nó thực sự là hình ảnh bạn muốn căn chỉnh, không phải văn bản." - Không, hình ảnh vẫn ổn ở đó. Chúng tôi muốn văn bản phù hợp. Không phải hình ảnh. - Tôi hiểu rằng điều này hoạt động (trong một số trường hợp, ví dụ: khi bạn không sử dụng "float: left" trên hình ảnh ...), nhưng thật kỳ lạ và không trực quan khi di chuyển văn bản sang giữa dọc bạn thay vào đó sẽ phải áp dụng một thuộc tính cho hình ảnh bên cạnh nó.
BrainSlugs83

35
@ BrainSlug83 Nó chắc chắn không kỳ quái nhưng tôi có thể thấy những người mới có thể bị vấp ngã như thế nào. Theo mặc định, một hình ảnh sẽ được đặt trên đường cơ sở văn bản. Tất cả những gì bạn đang làm là di chuyển nơi hình ảnh được đính kèm so với văn bản. Đối với việc sử dụng float: left, bạn nên thực hiện điều đó trên khối chứa hình ảnh và văn bản hoặc trên chính văn bản.
jamesrom

14
@ BrainSlugs83 Đồng ý rằng nó có thể được xem là phản trực giác. Phải mất một chút thay đổi về tinh thần, bởi vì theo CSS, điều bạn cần làm là căn giữa hình ảnh vào văn bản. Không phải văn bản cho hình ảnh.
Greg Pettit

6
Nó không hoạt động nếu bạn tăng spankích thước phông chữ. Xem câu trả lời của tôi .
Mori

2
Nhưng nếu bạn đặt kích thước hình ảnh thành nhỏ hơn (như width:16px;height:16px), bạn có thể thấy hình ảnh sẽ quá thấp ...
Matthieu Charbonnier

340

Dưới đây là một số kỹ thuật đơn giản để căn chỉnh theo chiều dọc:

Căn dọc một dòng: giữa

Điều này thật dễ dàng: đặt chiều cao dòng của phần tử văn bản bằng với giá trị của vùng chứa

<div>
  <img style="width:30px; height:30px;">
  <span style="line-height:30px;">Doesn't work.</span>
</div>

Nhiều đường thẳng đứng: đáy

Hoàn toàn định vị một div bên trong so với container của nó

<div style="position:relative;width:30px;height:60px;">
  <div style="position:absolute;bottom:0">This is positioned on the bottom</div>
</div>

Nhiều đường thẳng đứng: giữa

<div style="display:table;width:30px;height:60px;">
  <div style="display:table-cell;height:30px;">This is positioned in the middle</div>
</div>

Nếu bạn phải hỗ trợ các phiên bản IE cổ <= 7

Để làm cho điều này hoạt động chính xác trên bảng, bạn sẽ phải hack CSS một chút. May mắn thay, có một lỗi IE hoạt động có lợi cho chúng tôi. Đặt top:50%trên container và top:-50%trên div bên trong, bạn có thể đạt được kết quả tương tự. Chúng tôi có thể kết hợp cả hai bằng một tính năng khác mà IE không hỗ trợ: bộ chọn CSS nâng cao.

<style type="text/css">
  #container {
    width: 30px;
    height: 60px;
    position: relative;
  }
  #wrapper > #container {
    display: table;
    position: static;
  }
  #container div {
    position: absolute;
    top: 50%;
  }
  #container div div {
    position: relative;
    top: -50%;
  }
  #container > div {
    display: table-cell;
    vertical-align: middle;
    position: static;
  }
</style>

<div id="wrapper">
  <div id="container">
    <div><div><p>Works in everything!</p></div></div>
  </div>
</div>

Biến chiều cao container dọc-align: giữa

Giải pháp này đòi hỏi một trình duyệt hiện đại hơn một chút so với các giải pháp khác, vì nó sử dụng transform: translateYtài sản. ( http://caniuse.com/#feat=transforms2d )

Áp dụng 3 dòng CSS sau đây cho một phần tử sẽ căn giữa nó theo chiều dọc trong phần gốc của nó bất kể chiều cao của phần tử cha:

position: relative;
top: 50%;
transform: translateY(-50%);

15
Các bộ chọn display:tabledisplay:table-cellCSS hoạt động rất tốt, tất nhiên, ngoại trừ, trong IE7 trở xuống. Sau khi xé tóc trong vài giờ, tôi quyết định rằng tôi không thực sự cần phải đối phó với bất cứ ai vẫn sử dụng IE7-.
banncee

2
display:tablecó một số hạn chế trong các trình duyệt khác nhau (trong IE11 max-heightkhông hoạt động nếu phần tử nằm trong một ô của bảng), vì vậy trong một số trường hợp cạnh, không nên căn chỉnh theo chiều dọc bằng cách sử dụng các ô của bảng.
jahu

97

Thay đổi của bạn divthành một thùng chứa flex:

div { display:flex; }


Bây giờ có hai phương pháp để căn giữa sự sắp xếp cho tất cả các nội dung:

Cách 1:

div { align-items:center; }

BẢN GIỚI THIỆU


Cách 2:

div * { margin-top:auto; margin-bottom:auto; }

BẢN GIỚI THIỆU


Hãy thử các giá trị chiều rộng và chiều cao khác nhau trên imgvà các giá trị kích thước phông chữ khác nhau trên spanvà bạn sẽ thấy chúng luôn ở giữa thùng chứa.


Để căn giữa văn bản bên cạnh hoặc giữa các hình ảnh (theo chiều ngang trên trang), bạn cũng cần thêm justify-content: center;và để khoảng cách (không sử dụng thẻ <br/>), bạn cũng có thể muốn ném vào a padding: 1em;. Cập nhật tuyệt vời cho chúng tôi trình duyệt dev hiện đại.
CSS

Điều này làm việc tốt. Tôi đã thử từng câu trả lời khác, và trong khi chúng hoạt động ở một mức độ nào đó, nó không hiệu quả với tôi. Tôi có khoảng 3 dòng văn bản để căn chỉnh, và câu trả lời này hoạt động hoàn hảo. Cảm ơn @Mori
semaj0

87

Bạn phải áp dụng vertical-align: middlecho cả hai yếu tố để nó được tập trung hoàn hảo.

<div>
  <img style="vertical-align:middle" src="http://lorempixel.com/60/60/">
  <span style="vertical-align:middle">Perfectly centered</span>
</div>

Các câu trả lời được chấp nhận làm trung tâm biểu tượng xung quanh một nửa số x-height của văn bản bên cạnh nó (theo quy định tại các thông số kỹ thuật CSS ). Điều này có thể đủ tốt nhưng có thể trông hơi khác một chút, nếu văn bản có các mức tăng hoặc giảm dần nổi bật ở trên cùng hoặc dưới cùng:

so sánh biểu tượng trung tâm

Ở bên trái, văn bản không được căn chỉnh, bên phải nó như hình trên. Một bản demo trực tiếp có thể được tìm thấy trong bài viết này về căn chỉnh dọc .

Có ai nói về lý do tại sao vertical-align: toplàm việc trong kịch bản? Hình ảnh trong câu hỏi có thể cao hơn văn bản và do đó xác định cạnh trên của hộp dòng. vertical-align: toptrên phần tử span sau đó chỉ cần đặt nó ở đầu hộp dòng.

Sự khác biệt chính trong hành vi giữa vertical-align: middletoplà các yếu tố di chuyển đầu tiên liên quan đến đường cơ sở của hộp (được đặt bất cứ nơi nào cần thiết để thực hiện tất cả các sắp xếp theo chiều dọc và do đó cảm thấy khá khó đoán ) và thứ hai liên quan đến giới hạn bên ngoài của hộp đường (đó là hữu hình hơn).


1
Tôi nhận thấy công trình hàng đầu và công trình dưới cùng nhưng không phải giữa. Về cơ bản, "giữa" không được định nghĩa là nửa chừng giữa đỉnh và đáy. Nó có nghĩa là "khi nó cao hơn văn bản, hãy tìm ra cả hai cách như nhau." Và ở đây bạn không cần căn chỉnh dọc: ở giữa văn bản, chỉ là hình ảnh.
Curtis

61

Kỹ thuật được sử dụng trong câu trả lời được chấp nhận chỉ hoạt động đối với văn bản một dòng ( bản demo ), nhưng không phải là văn bản nhiều dòng ( bản demo ) - như đã lưu ý ở đó.

Nếu bất cứ ai cần định tâm văn bản nhiều dòng theo chiều dọc cho một hình ảnh, đây là một vài cách (Phương pháp 1 và 2 lấy cảm hứng từ bài viết Thủ thuật CSS này )

Phương pháp # 1: Bảng CSS ( FIDDLE ) (IE8 + ( caniuse ))

CSS:

div {
    display: table;
}
span {
    vertical-align: middle;
    display: table-cell;
}

Phương pháp # 2: Phần tử giả trên container ( FIDDLE ) (IE8 +)

CSS:

div {
   height: 200px; /* height of image */
}

div:before {
  content: '';
  display: inline-block;
  height: 100%;
  vertical-align: middle;
  margin-right: -0.25em; /* Adjusts for spacing */
}

img {
    position: absolute;
}

span {
  display: inline-block;
  vertical-align: middle;
  margin-left: 200px;  /* width of image */
}

Phương pháp # 3: Flexbox ( FIDDLE ) ( caniuse )

CSS (Fiddle trên chứa tiền tố nhà cung cấp):

div {   
    display: flex; 
    align-items: center;    
}
img {
    min-width: 200px; /* width of image */
}

3
Các phương pháp hoạt động tốt nếu hình ảnh lớn hơn (chiều cao) so với văn bản. Nhưng nếu hình ảnh nhỏ hơn thì tất cả đều thất bại một cách đáng buồn
Thomas

28

Mã này hoạt động trong IE cũng như FF:

<div>
  <img style="width:auto; height:auto;vertical-align: middle;">
  <span>It does work on all browsers</span>
</div>

19

Bởi vì bạn phải đặt line-heightchiều cao của div để làm việc này


2
Tôi đã thử đặt chiều cao dòng thành 30px và nó vẫn không hoạt động.
sam

12

Về cơ bản, bạn sẽ phải truy cập CSS3.

-moz-box-align: center;
-webkit-box-align: center;

11

Đối với bản ghi, căn chỉnh "các lệnh" không nên hoạt động trên SPAN, vì đó là thẻ nội tuyến , không phải thẻ cấp khối . Những thứ như căn chỉnh, lề, đệm, v.v. sẽ không hoạt động trên thẻ nội tuyến vì điểm nội tuyến không làm gián đoạn luồng văn bản.

CSS chia các thẻ HTML thành hai nhóm: cấp độ nội tuyến và cấp độ khối. Tìm kiếm "khối css vs nội tuyến" và một bài viết tuyệt vời xuất hiện ...

http://www.webdesignfromscratch.com/html-css/css-block-and-inline/

(Hiểu các nguyên tắc CSS cốt lõi là một chìa khóa để nó không quá khó chịu)


2
text-alignvertical-align(với ngoại lệ của ứng dụng của nó trên tdcác yếu tố cho mục đích di sản) có nghĩa là đặc biệt cho inlineinline-blockyếu tố ( span, img, vv).
Kevin Peno

11

Sử dụng line-height:30pxcho khoảng sao cho văn bản thẳng hàng với hình ảnh:

<div>
  <img style="width:30px; height:30px;">
  <span style="line-height:30px;">Doesn't work.</span>
</div>

11

Một điều khác bạn có thể làm là đặt văn bản line-heightthành kích thước của hình ảnh trong <div>. Sau đó đặt hình ảnh thànhvertical-align: middle;

Đó thực sự là cách dễ nhất.


3
Lưu ý rằng điều này không hoạt động chính xác nếu nội dung của bạn được trải rộng trên nhiều dòng.
Ahmad Alfy

và tại sao không chỉ là chiều cao dòng: 100%?
Jean Paul AKA kéo dài

8

Chưa thấy giải pháp marginnào trong bất kỳ câu trả lời nào, vì vậy đây là giải pháp của tôi cho vấn đề này.

Giải pháp này chỉ hoạt động nếu bạn biết chiều rộng của hình ảnh của bạn.

HTML

<div>
    <img src="https://placehold.it/80x80">
    <span>This is my very long text what should align. This is my very long text what should align.</span>
</div>

CSS

div {
  overflow:hidden;
}
img {
   width:80px
   margin-right:20px;
   display:inline-block;
   vertical-align:middle;
}
span {
   width:100%;
   margin-right:-100px;
   padding-right:100px;
   display:inline-block;
   vertical-align:middle;
   box-sizing:border-box;
   -moz-box-sizing:border-box;
   -webkit-box-sizing:border-box;
}

1
Đây là giải pháp chính xác. Nó cũng hoạt động cho các văn bản nhiều dòng, ... Aboves không thích hợp cho nhiều dòng.
efirat

6
background:url(../images/red_bullet.jpg) left 3px no-repeat;

Tôi thường sử dụng 3px thay cho top. Bằng cách tăng / giảm giá trị đó, hình ảnh có thể được thay đổi theo chiều cao yêu cầu.


Không giúp đỡ trong các tình huống kích thước hình ảnh không xác định hoặc động.
Dan

6

Viết các thuộc tính span này

span{
    display:inline-block;
    vertical-align:middle;
}

Sử dụng display:inline-block;Khi bạn sử dụng vertical-alignthuộc tính. Đây là các thuộc tính được xác định


6

Bạn có thể đặt hình ảnh như inline elementsử dụng thuộc displaytính

<div>
  <img style="vertical-align: middle; display: inline;" src="https://placehold.it/60x60">
  <span style="vertical-align: middle; display: inline;">Works.</span>
</div>


3

Chẳng hạn, trên một nút trong jQuery mobile, bạn có thể tinh chỉnh nó một chút bằng cách áp dụng kiểu này cho hình ảnh:

.btn-image {
    vertical-align:middle;
    margin:0 0 3px 0;
}

2

Giải pháp đa dòng:

http://jsfiddle.net/zH58L/6/

<div style="display:table;width:30px;height:160px;">
    <img style="display:table-cell;width:30px;height:60px;padding:50px" src='...' />
    <div style="display:table-cell;height:30px;vertical-align:middle">
      Multiline text centered vertically
    </div>
</div>
<!-- note: img (height + 2x padding) must be equal to root div height -->

Hoạt động trong tất cả các trình duyệt và eg9 +


2

Nó có thể gây nhầm lẫn, tôi đồng ý. Hãy thử sử dụng các tính năng bảng. Tôi sử dụng thủ thuật CSS đơn giản này để định vị các phương thức ở trung tâm của trang web. Nó có hỗ trợ trình duyệt lớn:

<div class="table">
    <div class="cell">
        <img src="..." alt="..." />
        <span>It works now</span>
    </div>
</div>

và phần CSS:

.table { display: table; }
.cell { display: table-cell; vertical-align: middle; }

Lưu ý rằng bạn phải tạo kiểu và điều chỉnh kích thước của hình ảnh và thùng chứa bảng để làm cho nó hoạt động như bạn muốn. Thưởng thức.


0

Đầu tiên CSS nội tuyến không được khuyến nghị, nó thực sự làm rối HTML của bạn.

Để căn chỉnh hình ảnh và khoảng, bạn chỉ cần làm vertical-align:middle.

.align-middle {
  vertical-align: middle;
}
<div>
  <img class="align-middle" src="https://i.stack.imgur.com/ymxaR.png">
  <span class="align-middle">I'm in the middle of the image! thanks to CSS! hooray!</span>
</div>


2
Có nhiều lý do tốt để sử dụng CSS nội tuyến. Phản ứng: CSS trong JS chẳng hạn.
jlyonsmith

0

Không chắc chắn về lý do tại sao nó không hiển thị nó trên trình duyệt điều hướng của bạn, nhưng tôi thường sử dụng một đoạn như thế này khi cố gắng hiển thị một tiêu đề với một hình ảnh và một văn bản ở giữa, hy vọng nó sẽ giúp!

https://output.jsbin.com/jeqorahupo

            <hgroup style="display:block; text-align:center;  vertical-align:middle;  margin:inherit auto; padding:inherit auto; max-height:inherit">

            <header style="background:url('http://lorempixel.com/30/30/') center center no-repeat; background-size:auto; display:inner-block; vertical-align:middle; position:relative; position:absolute; top:inherit; left:inherit; display: -webkit-box; display: -webkit-flex;display: -moz-box;display: -ms-flexbox;display: flex;-webkit-flex-align: center;-ms-flex-align: center;-webkit-align-items: center;align-items: center;">

            <image src="http://lorempixel.com/60/60/" title="Img title" style="opacity:0.35"></img>
                    http://lipsum.org</header>
                    </hgroup>

-4

Bạn có thể muốn điều này:

<div>
   <img style="width:30px; height:30px;">
   <span style="vertical-align:50%; line-height:30px;">Didn't work.</span>
</div>

Như những người khác đã đề xuất, hãy thử vertical-aligntrên hình ảnh:

<div>
   <img style="width:30px; height:30px; vertical-align:middle;">
   <span>Didn't work.</span>
</div>

CSS không gây phiền nhiễu. Bạn không đọc tài liệu . ; P


6
Và nếu chiều cao hình ảnh là năng động? Tôi bị lừa :( PS, chỉ vì tài liệu tồn tại cho CSS không gây khó chịu hoặc không trực quan.
sam

Bạn có nghĩa là unannoying và trực quan? Bạn đã không xác định xem chiều cao của hình ảnh anh ấy có động không trong câu hỏi của bạn, vì vậy tôi cho rằng chiều cao cố định là thứ bạn sẽ gắn bó.
strager

2
Tôi với sam về điều này. Tôi giả định rằng các mục phải được đặt ở giữa với chiều cao của img. Tôi nghĩ rằng tất cả chúng ta có thể đứng để hạ nhiệt một chút mặc dù.
Michael Haren
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.