純CSS溶液:
demo
.container {
display: inline-block;
position: relative;
width: 8em; height: 10em;
}
.container img {
position: absolute;
top: 50%; left: 50%;
width: auto; height: auto;
max-width: 100%; max-height: 100%;
transform: translate(-50%, -50%);
}
圖像保留其自然尺寸(width: auto; height: auto;
),除非它們大於容器(max-width: 100%; max-height: 100%;
),在這種情況下,它們將採用它們超出的容器大小並相應地縮放另一個容器。
將圖像定位在容器中間:給它們position: absolute
並將它們的左上角放在容器中間(top: 50%; left: 50%;
)。然後將它們向左和向上平移一半他們的計算尺寸,無論那些會是(transform: translate(-50%, -50%);
)。
該解決方案適用於browsers supporting 2D transforms。不幸的是,這不包括IE8以及Opera Mini。
更好的兼容性解決方案(即我實際上不能在IE8測試,現在,所以我只是假設它應該在那裏工作過)將是:
.container {
display: inline-block;
width: 8em; height: 10em;
text-align: center;
white-space: nowrap;
}
.container img {
display: inline-block;
width: auto; height: auto;
max-width: 100%; max-height: 100%;
vertical-align: middle;
}
.container:after {
display: inline-block;
height: 100%; width: 0;
vertical-align: middle;
content: "";
}
第一所有,給圖像display: inline-block;
。
在容器上設置text-align: center;
,以便比容器寬度小的圖像水平居中。
現在要確定它們也在垂直方向。給他們vertical-align: middle;
,但這還不夠。 inline-block
元素相對於他們的inline-block
兄弟姐妹垂直對齊,並且在這種情況下我們沒有兄弟姐妹。所以我們還需要另一箇中間垂直對齊的內嵌塊元素,它具有與容器相同的高度。或者容器上的僞元素,它是一樣的。
這個僞元件將不得不height: 100%;
,使得其垂直中央一致於其父和width: 0;
,以便它不會影響圖像的水平對齊(當圖像的自然寬度<容器的寬度) 。它也會像圖片一樣有display: inline-block;
和vertical-align: middle;
。
我們還需要容器上的white-space: nowrap;
以防止僞元素在圖像佔據容器的整個寬度時在下方移動(並且不會影響圖像的垂直對齊)。
來源
2013-12-13 22:46:35
Ana
偉大的解決方案。 –
這很好,除了我應該指定它需要在IE8中正常工作。 – ndimatteo
目前無法真正進行測試,但[**此版本**](http://codepen.io/thebabydino/pen/zCxKo)應該也可以在IE8中使用。 – Ana