2012-05-08 36 views
12

Tôi có một hình vuông có kích thước cố định và muốn đặt một hình ảnh có kích thước tùy ý bên trong sao cho nó được căn giữa theo chiều ngang và chiều dọc, sử dụng CSS. Theo chiều ngang là dễ dàng:* Liên kết hình ảnh dọc * hoàn hảo

.container { text-align: center } 

Đối với phương thẳng đứng, giải pháp phổ biến là:

.container { 
    height: 50px; 
    line-height: 50px; 
} 
img { 
    vertical-align: middle; 
} 

Nhưng điều này là không hoàn hảo , tùy thuộc vào kích thước font chữ, hình ảnh sẽ đạt khoảng 2-4px quá xuống thấp. Để hiểu biết của tôi, điều này là bởi vì "trung" được sử dụng cho căn chỉnh dọc không thực sự là giữa, nhưng một vị trí cụ thể trên phông chữ gần với giữa. Giải pháp (hơi hacky) sẽ là:

container { 
    font-size: 0; 
} 

và tính năng này hoạt động trong Chrome và IE7, chứ không phải IE8. Chúng tôi hy vọng sẽ làm cho tất cả các dòng phông chữ cùng một điểm, ở giữa, nhưng nó có vẻ là hit-and-miss tùy thuộc vào trình duyệt và, có lẽ, phông chữ được sử dụng.

Giải pháp duy nhất tôi có thể nghĩ là để hack chiều cao dòng, làm cho nó ngắn hơn một chút, để làm cho hình ảnh xuất hiện ở đúng vị trí, nhưng nó có vẻ cực kỳ mong manh. Có giải pháp nào tốt hơn không?

Xem một bản demo của cả ba giải pháp ở đây: http://jsfiddle.net/usvrj/3/

Những người không có IE8 có thể tìm thấy ảnh chụp màn hình này hữu ích:

IE8 screenshot when font-size is set to 0

+2

+1 chỉ để hỏi một câu hỏi tốt bằng văn bản với một bản demo rất gọn gàng! – bPratik

+0

Tôi đã đạt được một cái gì đó tương tự bằng cách sử dụng jQuery và tính toán các lề trên tải trang. Không đẹp, nhưng nó hoạt động trong IE6 + & Co. – alxbrd

+0

Bạn đã thử thêm 'display: table-cell;' vào vùng chứa chưa? Đó là sự hiểu biết của tôi rằng thuộc tính dọc thẳng đứng có thể có hai ý nghĩa khác nhau, một cho nội dung ô nội dung và một cho các phần tử nội tuyến. – Quantastical

Trả lời

2

Cách sử dụng hình ảnh làm nền? Bằng cách này bạn có thể tập trung nó ở mọi nơi. Một cái gì đó dọc theo những dòng:

margin:5px; 
padding:0; 
background:url(http://dummyimage.com/50) no-repeat center center red; 
height:60px; 
width:60px; 
+0

Đây không phải là một giải pháp chính xác cho vấn đề, nhưng nó có vẻ là cách duy nhất để có được một vị trí hoàn hảo, vì vậy tôi sẽ chấp nhận nó. Đó là một trong hai điều này, hoặc chấp nhận một hack dòng chiều cao nhỏ trong CSS. – Steve

0

Bạn đã thử như sau:

img { 
    display: block; 
    line-height: 0; 
} 

Tôi thường sử dụng hack này, nhưng tôi đã không thực sự kiểm tra nó triệt để trong IE8.

+0

Bạn có thể đưa ra ví dụ về nó hoạt động trong bất kỳ trình duyệt nào không? Căn chỉnh dọc không hoạt động với 'display: block', vì vậy tôi không thấy cách thức này hoạt động. – Steve

+0

Bạn nói đúng, bạn cũng sẽ cần hiển thị: ô bảng trên vùng chứa chính. Có thể thử chỉ là chiều cao dòng: 0? –

1

Đây thực sự là hacky, nhưng đó là những gì chúng tôi đã sử dụng để thực hiện trong ví dụ6 ngày.

.container { 
    position: relative; 
} 
img { 
    position: absolute; 
    top: 50%; 
    left: 50%; 
    margin-top: -12px; // half of whatever the image's height is, assuming 24px 
    margin-left: -12px; // half of whatever the image's width is, assuming 24px 
} 

Tôi có thể thiếu điều gì đó trong ví dụ này, nhưng bạn có ý tưởng.

+0

Đây là cách tuyệt vời để tập trung vào mọi thứ chứ không phải hack IE6. Nhưng giải pháp này không hiệu quả với anh ta vì kích thước ảnh là tùy ý, vì vậy không có cách nào để tính toán lợi nhuận. –

0

Đây là một JS Fiddle nhỏ tôi đã thực hiện: http://jsfiddle.net/rachit5/Ge4YH/

Tôi tin rằng nó phù hợp với yêu cầu của bạn.

HTML:

<div> 
    <img src=""/> 
</div> 

CSS:

div{height:400px;width:400px;position:relative;border:1px solid #000;} 
img{position:absolute;top:0;left:0;right:0;bottom:0;margin:auto;} 
2

Nếu css3 là một lựa chọn, sau đó flexbox làm một công việc tốt ở dọc và ngang xếp thẳng:

UPDATED FIDDLE

.container { 
    display:flex; 
    align-items: center; /* align vertical */ 
    justify-content: center; /* align horizontal */ 
} 
Các vấn đề liên quan