Làm cách nào để căn chỉnh theo chiều dọc một hình ảnh bên trong div


1456

Làm thế nào bạn có thể căn chỉnh một hình ảnh bên trong một chứa div?

Thí dụ

Trong ví dụ của tôi, tôi cần phải theo chiều dọc tập trung các <img>trong <div>với class ="frame":

<div class="frame" style="height: 25px;">
    <img src="http://jsfiddle.net/img/logo.png" />
</div>

.frameChiều cao của hình ảnh là cố định và chiều cao của hình ảnh là không xác định. Tôi có thể thêm các yếu tố mới .framenếu đó là giải pháp duy nhất. Tôi đang cố gắng làm điều này trên Internet Explorer 7 và sau đó, WebKit, Gecko.

Xem jsfiddle ở đây .

.frame {
    height: 25px;      /* Equals maximum image height */
    line-height: 25px;
    width: 160px;
    border: 1px solid red;

    text-align: center;
    margin: 1em 0;
}
img {
    background: #3A6F9A;
    vertical-align: middle;
    max-height: 25px;
    max-width: 160px;
}
<div class=frame>
   <img src="http://jsfiddle.net/img/logo.png" height=250 />
</div>
<div class=frame>
   <img src="http://jsfiddle.net/img/logo.png" height=25 />
</div>
<div class=frame>
   <img src="http://jsfiddle.net/img/logo.png" height=23 />
</div>
<div class=frame>
   <img src="http://jsfiddle.net/img/logo.png" height=21 />
</div>
<div class=frame>
   <img src="http://jsfiddle.net/img/logo.png" height=19 />
</div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=17 />
</div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=15 />
 </div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=13 />
 </div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=11 />
 </div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=9 />
 </div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=7 />
 </div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=5 />
 </div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=3 />
 </div>


3
Xin chào, xin lỗi nhưng tôi không đồng ý về việc sử dụng một người trợ giúp ở đây là giải pháp được định giá cao nhất. Nhưng nó không phải là cách duy nhất. Những người khác được hỗ trợ bởi các trình duyệt. Tôi cung cấp một giải pháp ở đây xuống stackoverflow.com/a/43308414/7733724 và W3C.org về thông tin. Bạn có thể kiểm tra. Chúc mừng
Sam

Đọc bài viết về Centering Things trên W3C sẽ hữu ích: w3.org/Style/Examples/007/center.en.html
QMaster

Hướng dẫn hoàn hảo để căn chỉnh css-tricks.com/centering-css-complete-guide
Michael Yurin

Câu trả lời:


2128

Cách duy nhất (và cách tốt nhất cho trình duyệt chéo) mà tôi biết là sử dụng một trình inline-blocktrợ giúp có height: 100%vertical-align: middletrên cả hai yếu tố.

Vì vậy, có một giải pháp: http://jsfiddle.net/kizu/4RPFa/4570/

Hoặc, nếu bạn không muốn có một phần tử phụ trong các trình duyệt hiện đại và không bận tâm sử dụng các biểu thức Internet Explorer, bạn có thể sử dụng phần tử giả và thêm nó vào Internet Explorer bằng Biểu thức tiện lợi, chỉ chạy một lần cho mỗi phần tử , vì vậy sẽ không có bất kỳ vấn đề hiệu suất:

Giải pháp với :beforeexpression()cho Internet Explorer: http://jsfiddle.net/kizu/4RPFa/4571/


Làm thế nào nó hoạt động:

  1. Khi bạn có hai inline-blockyếu tố gần nhau, bạn có thể căn chỉnh nhau về phía bên kia, vì vậy với vertical-align: middlebạn sẽ nhận được một cái gì đó như thế này:

    Hai khối liên kết

  2. Khi bạn có một khối với chiều cao cố định (trong px, emhoặc một đơn vị tuyệt đối), bạn có thể thiết lập chiều cao của khối bên trong %.

  3. Vì vậy, việc thêm một inline-blockvới height: 100%một khối có chiều cao cố định sẽ căn chỉnh một inline-blockyếu tố khác trong nó ( <img/>trong trường hợp của bạn) theo chiều dọc gần nó.

2
Bạn có thể tự mình xem: jsfiddle.net/kizu/Pw9NL - chỉ các hộp nội tuyến không tạo ra một hộp, nhưng tất cả các trường hợp khác đều hoạt động tốt.
kizu

3
Câu trả lời rất hay. Tôi đã vật lộn với khoảng cách giữa các thành phần khối nội tuyến, nghĩa là giữa .frame.frame:before. Một giải pháp được đề xuất ở đây là thêm margin-left: -4pxvào .frame. Hi vọng điêu nay co ich.
Mick

111
TRẢ LỜI rằng: <img src=""/>KHÔNG phải bên trong người <span></span>trợ giúp đã được thêm vào. Nó ở bên ngoài. Tôi chỉ kéo từng sợi tóc của mình bằng cách không nhận ra điều này.
ryan

50
Có vẻ như bạn cũng cần thêm "khoảng trắng: nowrap;" đến khung hoặc bạn sẽ gặp sự cố nếu bạn có ngắt dòng giữa hình ảnh của bạn và nhịp của trình trợ giúp. Phải mất một giờ tại sao giải pháp này không hiệu quả với tôi.
juminoz

2
Trong trường hợp của tôi, hình ảnh của tôi có chiều cao tối đa và chiều rộng tối đa được đặt thành 100% để hình ảnh sẽ chia tỷ lệ cho vùng chứa và phương pháp này không hoạt động. Giải pháp của tôi là thay đổi các giá trị này thành 90% (trong trường hợp của tôi là ổn; trong trường hợp khác, bạn có thể cần phải điều chỉnh tỷ lệ vùng chứa cho phù hợp), đồng thời thêm một trình trợ giúp vào phía bên kia của hình ảnh để phần đệm vẫn còn cả hai mặt.
Eric Dubé

513

Điều này có thể hữu ích:

div {
    position: relative;
    width: 200px;
    height: 200px;
}
img {
    position: absolute;
    top: 0;
    bottom: 0;
    margin: auto;
}
.image {
    min-height: 50px
}

74
Nếu bạn cũng muốn căn chỉnh theo chiều ngang của hình ảnh, thêm trái: 0; phải: 0; đến img
jameskind

Đây có phải là một rly không hoạt động trong IE10? Tôi sử dụng cái này ở mọi nơi
Max Yari

Cũng hoạt động (đối với tôi) với div div containerposition:fixed;
PJ Brunet

1
Giải pháp dễ nhất và sạch nhất nhờ!
KDT

Cảm ơn! Đã làm cho tôi!!
Alexander Malygin

486

Giải pháp của matejkramny là một khởi đầu tốt, nhưng hình ảnh quá khổ có tỷ lệ sai.

Đây là ngã ba của tôi:

Bản trình diễn: https://jsbin.com/lidebapomi/edit?html,css,output

xem trước


HTML:

<div class="frame">
  <img src="foo"/>
</div>

CSS:

.frame {
    height: 160px; /* Can be anything */
    width: 160px; /* Can be anything */
    position: relative;
}
img {
    max-height: 100%;
    max-width: 100%;
    width: auto;
    height: auto;
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    margin: auto;
}

Bất kỳ cách nào để điều chỉnh điều này sao cho bạn có thể phóng to hình ảnh quá khổ, giả sử là 2x, và nó vẫn sẽ ở giữa theo chiều ngang và chiều dọc?
Justin

Nếu chúng ta muốn làm cho nó hoạt động cho đáy thẳng hàng thay vì giữa, nên sửa đổi mã nào?
bobo

1
@bobo chỉ cần xóa top: 0;. Điều này dẫn đến chỉ bottom: 0;được áp dụng theo chiều dọc.
jomo

Câu trả lời tốt nhất!
user315338

278

Một giải pháp ba dòng:

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

Điều này áp dụng cho bất cứ điều gì.

Từ đây .


Tiền tố: -ms- hoặc -webkit- (trước khi chuyển đổi). w3schools.com/cssref/css3_pr_transform.asp
Jorge Orpinel

3
Tiền tố cho IE9, nhưng hoàn toàn không hoạt động trong IE8 và thấp hơn: caniuse.com/#search=transform Nhưng ý kiến ​​của tôi: Tôi không quan tâm đến IE8
Rjust85

Không ai nhận thấy điều gì xảy ra khi đứa trẻ ở giữa cao hơn màn hình thiết bị và cha mẹ là đứa trẻ đầu tiên trong DOM ...?
tao

3
Đẹp khi bạn không thể sử dụng position: absolute;vì bạn cần chiều rộng chảy.
plong0

2
Giải pháp tốt nhất cho đến nay, thậm chí còn tốt hơn cả flexbox, với sự hỗ trợ cho hầu hết tất cả các trình duyệt hiện đại và cũ. Xin hãy
ủng hộ

141

Một giải pháp CSS thuần túy :

.frame {
  margin: 1em 0;
  height: 35px;
  width: 160px;
  border: 1px solid red;
  position: relative;
}

img {
  max-height: 25px;
  max-width: 160px;
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  margin: auto;
  background: #3A6F9A;
}
<div class=frame>
  <img src="http://jsfiddle.net/img/logo.png" height=250 />
</div>
<div class=frame>
  <img src="http://jsfiddle.net/img/logo.png" height=25 />
</div>
<div class=frame>
  <img src="http://jsfiddle.net/img/logo.png" height=23 />
</div>
<div class=frame>
  <img src="http://jsfiddle.net/img/logo.png" height=21 />
</div>
<div class=frame>
  <img src="http://jsfiddle.net/img/logo.png" height=19 />
</div>
<div class=frame>
  <img src="http://jsfiddle.net/img/logo.png" height=17 />
</div>
<div class=frame>
  <img src="http://jsfiddle.net/img/logo.png" height=15 />
</div>
<div class=frame>
  <img src="http://jsfiddle.net/img/logo.png" height=13 />
</div>
<div class=frame>
  <img src="http://jsfiddle.net/img/logo.png" height=11 />
</div>
<div class=frame>
  <img src="http://jsfiddle.net/img/logo.png" height=9 />
</div>
<div class=frame>
  <img src="http://jsfiddle.net/img/logo.png" height=7 />
</div>
<div class=frame>
  <img src="http://jsfiddle.net/img/logo.png" height=5 />
</div>
<div class=frame>
  <img src="http://jsfiddle.net/img/logo.png" height=3 />
</div>

Công cụ chính

// position: relative; - in .frame holds the absolute element within the frame
// top: 0; bottom: 0; left: 0; right: 0; - this is key for centering a component
// margin: auto; - centers the image horizontally & vertically

Vui lòng để tôi giới thiệu cho bạn một hướng dẫn ở đây thậm chí hoạt động cho IE5 (trừ từ những gì tôi đã đọc cho đến nay trong bài đăng) webmasterworld.com/css/3350566.htmlm
Matej

giải pháp này là một khởi đầu tốt, nhưng hình ảnh quá khổ bị thay đổi kích thước với tỷ lệ sai . Xin vui lòng xem câu trả lời của tôi.
Jomo

@ HansWürstchen yeah, nhưng vấn đề là tập trung vào việc liệu nó có quá khổ hay không là lựa chọn thiết kế. Thêm nhiều css = nhiều lộn xộn hơn :)
Matej

1
@matejkramny nó không được quá khổ. nếu hình ảnh quá khổ, nó có một tỷ lệ sai. điều đó có nghĩa là nó bị kéo dài về chiều cao và trông không ổn.
Jomo

✔ Wow, điều này hoạt động với hình ảnh tràn (lớn hơn trình bao bọc), câu trả lời được chấp nhận không.
Cedric Reichenbach

120

Đối với một giải pháp hiện đại hơn và nếu không cần hỗ trợ các trình duyệt cũ, bạn có thể thực hiện việc này:

.frame {
    display: flex;
    /**
    Uncomment 'justify-content' below to center horizontally.
    ✪ Read below for a better way to center vertically and horizontally.
    **/

    /* justify-content: center; */
    align-items: center;
}

img {
    height: auto;

    /**
    ✪ To center this image both vertically and horizontally,
    in the .frame rule above comment the 'justify-content'
    and 'align-items' declarations,
    then  uncomment 'margin: auto;' below.
    **/

    /* margin: auto; */
}

/* Styling stuff not needed for demo */
.frame {
    max-width: 900px;
    height: 200px;
    margin: auto;
    background: #222;
}
p {
    max-width: 900px;
    margin: 20px auto 0;
}
img {
    width: 150px;
}
<div class="frame">
    <img src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/9988/hand-pointing.png">
</div>

Đây là một cây bút: http://codepen.io/ricardozea/pen/aa0ee8e6021087b6e2460664a0fa3f3e


3
Điều này đặc biệt hữu ích nếu chiều cao của container không được đặt
Dave Barnett

hoặc align-selfcho các vật phẩm riêng lẻ
Michael

Vấn đề với align-selflà các vật phẩm flex sẽ kéo dài chiều cao của thùng chứa mẹ.
Ricardo Zea

101

Bằng cách này bạn có thể căn giữa một hình ảnh theo chiều dọc ( bản demo ):

div{
  height: 150px; // Internet Explorer 7 fix
  line-height: 150px;
}
img{
  vertical-align: middle;
  margin-bottom: 0.25em;
}

4
Kỳ lạ là tôi không thể có được câu trả lời được chấp nhận để làm việc trong tình huống của mình (tôi cũng đã cắt xén hình ảnh với tràn: ẩn). Điều này làm việc hoàn hảo mặc dù.
Luca Spiller

3
Tôi chỉ thử nghiệm điều này trong Chrome, nhưng chiều cao dòng dường như là chìa khóa. Mặc dù vậy, tôi đặt thuộc tính thẳng hàng trên div thay vì img, vì img của tôi nằm trong một neo (<a/>).
Giá của

1
Vâng, đơn giản hơn nhiều là giải pháp được chấp nhận và hoạt động rất đẹp. Tôi cũng tìm thấy giải pháp này trong jsfiddle.
vdboor

1
Nếu bạn biết những gì độ cao để phục vụ cho, điều này hoạt động khá tốt
KrekkieD

Từ expierence tôi giải pháp này chỉ làm việc với font-size: 0cho div. Đối với các thùng chứa khá lớn, bạn có thể bỏ lỡ nó nhưng nếu bạn divlà 100px và img là 80px thì nó sẽ thấp hơn một vài pixel.
alTus

38

Ngoài ra, bạn có thể sử dụng Flexbox để đạt được kết quả chính xác:

.parent {
  align-items: center; /* For vertical align */
  background: red;
  display: flex;
  height: 250px;
  /* justify-content: center; <- for horizontal align */
  width: 250px;
}
<div class="parent">
  <img class="child" src="https://cdn2.iconfinder.com/data/icons/social-icons-circular-black/512/stackoverflow-128.png" />
</div>


28

Có một giải pháp siêu dễ dàng với flexbox!

.frame {
    display: flex;
    align-items: center;
}

5
Có nhưng bạn khó có thể nhìn thấy nó trong tất cả các câu trả lời. Tôi đã cố gắng làm nổi bật nó một cách đơn giản và rõ ràng vì đó là một giải pháp dễ dàng hơn nhiều so với tất cả các câu trả lời khác.
BBlackwo

Đây là câu trả lời tốt nhất cũng làm việc cho tôi. Nhưng trong trường hợp của tôi, khung "inline-flex" hoạt động tốt hơn đối với tôi. và đối với hình ảnh bên trong nó tôi đã thêm: "vertical-align: middle".
Sophie Cooperman

22

Bạn có thể thử thiết lập CSS của PI thành display: table-cell; vertical-align: middle;


Tôi đã thấy nhiều phương pháp khác nhau, nhưng phương pháp này là mới (ngay cả trong năm 2013) đối với tôi.
Mike Ebert

Tốt hơn là đặt hình ảnh bên trong một cái bàn chỉ để tập trung vào nó.
Jonats

3
hiển thị: ô bảng không phải luôn luôn có kích thước chính xác nếu bạn muốn chiều rộng là 100%
Redtopia

1
" PI" Là gì?
Peter Mortensen

18

Bạn có thể thử đoạn mã dưới đây:

.frame{
    display: flex;
    justify-content: center;
    align-items: center;
    width: 100%;
}
<div class="frame" style="height: 25px;">
    <img src="http://jsfiddle.net/img/logo.png" />
</div>


14

Giải pháp hình nền

Tôi đã loại bỏ hoàn toàn yếu tố hình ảnh và đặt nó làm nền của div với một lớp .frame

http://jsfiddle.net/URVKa/2/

Điều này ít nhất hoạt động tốt trên Internet Explorer 8, Firefox 6 và Chrome 13.

Tôi đã kiểm tra và giải pháp này sẽ không hoạt động để thu nhỏ hình ảnh có chiều cao lớn hơn 25 pixel. Có một thuộc tính được gọi là background-sizeđặt kích thước của phần tử, nhưng đó là CSS 3 sẽ xung đột với các yêu cầu của Internet Explorer 7.

Tôi sẽ khuyên bạn nên làm lại các ưu tiên và thiết kế trình duyệt của bạn cho các trình duyệt khả dụng tốt nhất hoặc lấy một số mã phía máy chủ để thay đổi kích thước hình ảnh nếu bạn muốn sử dụng giải pháp này.


Giải pháp rất hay, tuy nhiên tôi hy vọng một số hình ảnh sẽ lớn hơn container và trong trường hợp này tôi dự định sử dụng chiều cao tối đa / chiều rộng tối đa trên chúng. Bất kỳ cách nào để làm điều này với hình ảnh nền?
Arnaud Le Blanc

đây không phải là "phần tử .frame" mà là "div với một lớp .frame"
JGallardo

Nếu chiều cao hình ảnh không vượt quá chiều cao của khung hình, đây là giải pháp tốt nhất và đơn giản nhất ...
efirat

13

Hãy tưởng tượng bạn có

<div class="wrap">
    <img src="#">
</div>

Và css:

.wrap {
    display: flex;
}
.wrap img {
    object-fit: contain;
}

Ơ! Flex thực sự rulzzzz! Cảm ơn bạn!
Pedro Ferreira

sử dụng bìa phù hợp với đối tượng nếu bạn muốn trẻ chiếm toàn bộ chiều rộng của cha mẹ và vẫn được sắp xếp theo chiều dọc ở giữa. Xem css-tricks.com/snippets/css/a-guide-to-flexbox để di chuyển hình ảnh xung quanh cha mẹ bằng cách sử dụng hộp flex
mattdlockyer

11

Bạn có thể làm điều này:

Bản giới thiệu

http://jsfiddle.net/DZ8vW/1

CSS

.frame {
    height: 25px;      /* Equals maximum image height */
    line-height: 25px;
    width: 160px;
    border: 1px solid red;

    text-align: center; 
    margin: 1em 0;
    position: relative; /* Changes here... */
}
img {
    background: #3A6F9A;
    max-height: 25px;
    max-width: 160px;
    top: 50%;           /* Here.. */
    left: 50%;          /* Here... */
    position: absolute; /* And here */
}    


JavaScript

$("img").each(function(){
    this.style.marginTop = $(this).height() / -2 + "px";
})

Đẹp. Bất kỳ cơ hội cho một giải pháp css tinh khiết?
Arnaud Le Blanc

Thật không may, trừ khi bạn muốn sử dụng bảng hoặc bỏ khả năng tương thích với các phiên bản IE cũ hơn. :( Nếu bạn biết kích thước chính xác của hình ảnh trước khi sử dụng thì nó sẽ khác, nhưng không phải không có điều đó chỉ với CSS.
Joseph Marikle

@Joseph Làm thế nào bạn sẽ sửa nó với các bảng?
Benjamin Udink mười Cate

@Benjamin Udink ten Cate Nó lộn xộn nhưng có thể được thực hiện theo cách này: jsfiddle.net/DZ8vW/2 (điều này không được khuyên, nhưng nên hoạt động)
Joseph Marikle

1
Vâng, nó phù hợp với nhu cầu của arnauds một cách hoàn hảo. Không có JS, chỉ có CSS ​​và HTML.
Benjamin Udink mười Cate

11

http://jsfiddle.net/MBs64/

.frame {
    height: 35px;      /* Equals maximum image height */
    width: 160px;
    border: 1px solid red;
    text-align: center;
    margin: 1em 0;
    display: table-cell;
    vertical-align: middle;
}
img {
    background: #3A6F9A;
    display: block;
    max-height: 35px;
    max-width: 160px;
}

Các tài sản quan trọng là display: table-cell;cho .frame. Div.frameđược hiển thị dưới dạng nội tuyến với cái này, vì vậy bạn cần phải bọc nó trong một phần tử khối.

Điều này hoạt động trong Firefox, Opera, Chrome, Safari và Internet Explorer 8 (và sau này).

CẬP NHẬT

Đối với Internet Explorer 7, chúng ta cần thêm một biểu thức CSS:

*:first-child+html img {
    position: relative;
    top: expression((this.parentNode.clientHeight-this.clientHeight)/2+"px");
}

Tuyệt quá. Bất kỳ hack cho IE7 sẽ tránh javascript?
Arnaud Le Blanc

Tôi không chắc chắn, nhưng có lẽ biểu thức css sẽ giúp. Nhưng họ cũng là javascript. Sự khác biệt duy nhất, đó là bạn viết chúng trong các tệp css, không phải trong js.
Webars

Vâng, ý kiến ​​hay. Điều đó sẽ dễ quản lý hơn (tập lệnh được tự động chạy khi cần thiết) và vì nó chỉ là IE7 thôi.
Arnaud Le Blanc

7

Giải pháp của tôi: http://jsfiddle.net/XNAj6/2/

<div class="container">
    <div class="frame">
        <img src="http://jsfiddle.net/img/logo.png" class="img" alt="" />
    </div>
</div>

.container {
    display: table;
    float: left;
    border: solid black 1px;
    margin: 2px;
    padding: 0;
    background-color: black;
    width: 150px;
    height: 150px;
}
.frame {
    display: table-cell;
    text-align: center;
    vertical-align: middle;
    border-width: 0;
}
.img {
    max-width: 150px;
    max-height: 150px;
    vertical-align: middle;
}

7

Điều này hoạt động cho các trình duyệt hiện đại (năm 2016 tại thời điểm chỉnh sửa) như được hiển thị trong bản demo này trên codepen

.frame {
    height: 25px;
    line-height: 25px;
    width: 160px;
    border: 1px solid #83A7D3;          
}
.frame img {
    background: #3A6F9A;
    display:inline-block;
    vertical-align: middle;
}

Điều rất quan trọng là bạn cung cấp cho các hình ảnh một lớp hoặc sử dụng tính kế thừa để nhắm mục tiêu các hình ảnh mà bạn cần làm trung tâm. Trong ví dụ này, chúng tôi đã sử dụng .frame img {}sao cho chỉ những hình ảnh được bao bọc bởi một div có một lớp .framesẽ được nhắm mục tiêu.


chỉ eg7, chỉ cần đặt line-height: 25px;
anglimasS

1
nó dường như không được căn chỉnh chính xác ngay cả trên firefox và chrome ( jsfiddle.net/4RPFa/19 )
Arnaud Le Blanc

7

Hãy thử giải pháp này với CSS thuần http://jsfiddle.net/sandeep/4RPFa/72/

Có lẽ đó là vấn đề chính với HTML của bạn. Bạn không sử dụng dấu ngoặc kép khi bạn xác định c lass& image heighttrong HTML của mình.

CSS:

.frame {
    height: 25px;      /* Equals maximum image height */
    width: 160px;
    border: 1px solid red;
    position: relative;
    margin: 1em 0;
    top: 50%;
    text-align: center;
    line-height: 24px;
    margin-bottom: 20px;
}

img {
    background: #3A6F9A;
    vertical-align: middle;
    line-height: 0;
    margin: 0 auto;
    max-height: 25px;
}

Khi tôi làm việc với imgthẻ, nó sẽ chừa khoảng trống 3 pixel đến 2 pixel top. Bây giờ tôi giảm line-height, và nó hoạt động.

CSS:

    .frame {
        height: 25px;      /* Equals maximum image height */
        width: 160px;
        border: 1px solid red;
        margin: 1em 0;
        text-align: center;
        line-height: 22px;
        *:first-child+html line-height:24px; /* For Internet Explorer 7 */
    }

    img {
        background: #3A6F9A;
        vertical-align: middle;
        line-height: 0;    
        max-height: 25px;
        max-width: 160px;
    }
@media screen and (-webkit-min-device-pixel-ratio:0) {
    .frame {
        line-height:20px; /* WebKit browsers */
    }

Các line-heighttài sản được kết xuất khác nhau trong các trình duyệt khác nhau. Vì vậy, chúng ta phải xác định các line-heighttrình duyệt thuộc tính khác nhau .

Kiểm tra ví dụ này: http://jsfiddle.net/sandeep/4be8t/11/

Kiểm tra ví dụ này về line-heightsự khác nhau trong các trình duyệt khác nhau: sự khác biệt về chiều cao đầu vào trong Firefox và Chrome


2
Không hoạt động (ít nhất là trong Firefox). Đối với các trích dẫn bị thiếu, điều này được cho phép trong HTML5 (không biết loại tài liệu nào được sử dụng trong jsfiddle)
Arnaud Le Blanc

7

Tôi không chắc chắn về Internet Explorer, nhưng trong Firefox và Chrome, nếu bạn có imgtrong một divthùng chứa, nội dung CSS sau sẽ hoạt động. Ít nhất với tôi nó hoạt động tốt:

div.img-container {
    display: table-cell;
    vertical-align: middle;
    height: 450px;
    width: 490px;
}

div.img-container img {
    max-height: 450px;
    max-width: 490px;
}

IE8 +, thật không may. Tốt cho tôi, nhưng có lẽ không phải cho người khác.
TheCarver

cũng lưu ý rằng display:table-cell;không chấp nhận% theo chiều rộng
Mutmatt

7

Giải pháp sử dụng một bảng và các ô của bảng

Đôi khi cần giải quyết bằng cách hiển thị dưới dạng bảng / ô. Ví dụ, một màn hình tiêu đề nhanh. Đó là một cách được đề xuất bởi W3 cũng. Tôi khuyên bạn nên kiểm tra liên kết này có tên là Định tâm một khối hoặc hình ảnh từ W3C.org.

Các mẹo được sử dụng ở đây là:

  • Container định vị tuyệt đối hiển thị dưới dạng bảng
  • Căn dọc với nội dung trung tâm được hiển thị dưới dạng ô bảng

.container {
    position: absolute;
    display: table;
    width: 100%;
    height: 100%;
}
.content {
    display: table-cell;
    vertical-align: middle;
}
<div class="container">
  <div class="content">
    <h1 style="text-align:center">Peace in the world</h1>
 </div>
</div>

Cá nhân tôi thực sự không đồng ý về việc sử dụng người trợ giúp cho mục đích này.


6

Một cách dễ dàng làm việc cho tôi:

img {
    vertical-align: middle;
    display: inline-block;
    position: relative;
}

Nó hoạt động cho Google Chrome rất tốt. Hãy thử cái này trong một trình duyệt khác.


6

Để căn giữa hình ảnh bên trong một thùng chứa (nó có thể là logo) bên cạnh một số văn bản như thế này:

Nhập mô tả hình ảnh ở đây

Về cơ bản bạn bọc hình ảnh

.outer-frame {
  border: 1px solid red;
  min-height: 200px;
  text-align: center; /* Only to align horizontally */
}

.wrapper{
  line-height: 200px;
  border: 2px dashed blue;
  border-radius: 20px;
  margin: 50px
}

img {
  /* height: auto; */
  vertical-align: middle;   /* Only to align vertically */
}
<div class="outer-frame">
  <div class="wrapper">
    some text
    <img src="http://via.placeholder.com/150x150">
  </div>
</div>


4

Nếu bạn có thể sống với lề có kích thước pixel, chỉ cần thêm font-size: 1px;vào .frame. Nhưng hãy nhớ rằng, bây giờ trên .frame1em = 1px, điều đó có nghĩa là bạn cũng cần đặt lề theo pixel.

http://jsfiddle.net/feeela/4RPFa/96/

Bây giờ nó không còn là trung tâm nữa trong Opera Opera


3

Tôi đã từng gặp vấn đề tương tự. Điều này làm việc cho tôi:

<style type="text/css">
    div.parent {
        position: relative;
    }

    img.child {
        bottom: 0;
        left: 0;
        margin: auto;
        position: absolute;
        right: 0;
        top: 0;
    }
</style>

<div class="parent">
    <img class="child">
</div>

Trên thực tế, "vị trí: cố định" trên hình ảnh đã làm việc cho tôi khi tôi đã thất vọng về nhiều câu trả lời sai của những người đề xuất phương pháp ô bảng không hoạt động trong các tác phẩm của tôi. Với phương pháp được đề xuất bởi algreat, bạn cũng không cần thêm một thùng chứa.
Vasilios Paspalas

2

Bạn có thể sử dụng điều này:

 .loaderimage {
    position: absolute;
    top: 50%;
    left: 50%;
    width: 60px;
    height: 60px;
    margin-top: -30px; /* 50% of the height */
    margin-left: -30px;
 }

1

Sử dụng tabletable-cellphương pháp thực hiện công việc, đặc biệt vì bạn cũng nhắm mục tiêu một số trình duyệt cũ, tôi tạo một đoạn mã cho bạn để bạn có thể chạy nó và kiểm tra kết quả:

.wrapper {
  position: relative;
  display: table;
  width: 300px;
  height: 200px;
}

.inside {
  vertical-align: middle;
  display: table-cell;
}
<div class="wrapper">
  <div class="inside">
    <p>Centre me please!!!</p>
  </div>
  <div class="inside">
    <img src="https://cdn2.iconfinder.com/data/icons/social-icons-circular-black/512/stackoverflow-128.png" />
  </div>
</div> 


0

Tôi đã chơi xung quanh với việc sử dụng đệm để căn chỉnh trung tâm. Bạn sẽ cần xác định kích thước thùng chứa bên ngoài cấp cao nhất, nhưng thùng chứa bên trong sẽ thay đổi kích thước và bạn có thể đặt phần đệm ở các giá trị phần trăm khác nhau.

jsfiddle

<div class='container'>
  <img src='image.jpg' />
</div>

.container {
  padding: 20%;
  background-color: blue;
}

img {
  width: 100%;
}

0

Giải pháp tốt nhất là

.block{
    /* Decor */
    padding:0 20px;
    background: #666;
    border: 2px solid #fff;
    text-align: center;
    /* Important */
    min-height: 220px;
    width: 260px;
    white-space: nowrap;
}
.block:after{
    content: '';
    display: inline-block;
    height: 220px; /* The same as min-height */
    width: 1px;
    overflow: hidden;
    margin: 0 0 0 -5px;
    vertical-align: middle;
}
.block span{
    vertical-align: middle;
    display: inline-block;
    white-space: normal;
}

0

Sử dụng cái này:

position: absolute;
top: calc(50% - 0.5em);
left: calc(50% - 0.5em);
line-height: 1em;

Và bạn có thể thay đổi font-size.


0

Bạn muốn căn chỉnh một hình ảnh có sau một văn bản / tiêu đề và cả hai đều nằm trong div?

Xem trên JSfiddle hoặc Chạy đoạn mã.

Chỉ cần chắc chắn có ID hoặc một lớp ở tất cả các yếu tố của bạn (div, img, title, v.v.).

Đối với tôi, giải pháp này trên tất cả các trình duyệt (đối với thiết bị di động, bạn phải điều chỉnh mã của mình bằng: @media).

h2.h2red {
    color: red;
    font-size: 14px;
}
.mydivclass {
    margin-top: 30px;
    display: block;
}
img.mydesiredclass {
    margin-right: 10px;
    display: block;
    float: left; /* If you want to allign the text with an image on the same row */
    width: 100px;
    heght: 100px;
    margin-top: -40px /* Change this value to adapt to your page */;
}
<div class="mydivclass">
    <br />
    <img class="mydesiredclass" src="https://upload.wikimedia.org/wikipedia/commons/thumb/b/b3/Wikipedia-logo-v2-en.svg/2000px-Wikipedia-logo-v2-en.svg.png">
    <h2 class="h2red">Text aligned after image inside a div by negative manipulate the img position</h2>
</div>

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.