我正在寻找一个简单的解决方案来实现以下内容。缩略图不会被裁剪,但它们所在的容器将始终具有相同的高度/宽度。
这个想法是大于容器的图像会响应(即缩小),而小于容器的图像将“按原样”显示。
我遇到的问题有三个:
显然,如果只能用CSS完成它会很棒,但我知道可能需要javascript。如果是这种情况,我正在寻找一种轻量级解决方案,因为缩略图网格可能会非常冗长。
有什么想法吗?
答案 0 :(得分:6)
纯CSS解决方案:
.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;
以防止伪元素向下移动(并且不会以这种方式影响图像的垂直对齐)。
答案 1 :(得分:2)
这实际上是我在Stackoverflow上提出的第一个问题!现在我知道Ana已经提出了一个可行的解决方案,我想我也会发布我的IE8以后的工作方式:
基本加价:
<div class='container'>
<img src='http://www.lorempixel.com/100/200' />
</div>
CSS:
.container {
float: left;
width: 180px;
height: 210px;
text-align: center; /* to center align horizontally */
line-height: 210px; /* Equal to container height */
font-size: 0; /* This is to eliminate a weird ~2px vertical offset on the images. But you can just specify the font-size for any children elements that may contain text. */
}
.container > img {
width: auto; height: auto;
max-width: 100%; max-height: 100%;
vertical-align: middle;
}
答案 2 :(得分:1)
This will work in IE 8 (demo) 来自ana答案的HTML
诀窍是使用after
伪元素将容器line-height
扩展到自己的高度。
通过这种方式,您可以使用常规text-align
和vertical-align
以及max-width
和max-height
。
.container {
display: inline-block;
position: relative;
border: solid .25em deeppink;
width: 8em;
height: 10em;
text-align: center;
vertical-align: middle;
white-space: nowrap;
}
.container img {
display: inline-block;
vertical-align: middle;
width: auto;
height: auto;
max-width: 100%;
max-height: 100%;
}
.container:after {
content: "";
display: inline-block;
vertical-align: middle;
height: 100%;
width: 0px;
}
答案 3 :(得分:0)
看看这个jsfiddle:http://jsfiddle.net/jQN4L/
max-width
和max-height
会导致图片缩小(如果需要),但不会向上扩展。水平居中使用text-align
完成。使用line-height
和vertical-align
进行垂直居中,但此方法确实要求容器具有已知高度。
HTML:
<div id="d1">
<img src="http://i.imgur.com/VAZNIev.jpg" />
</div>
<div id="d2">
<img src="http://i.imgur.com/VAZNIev.jpg" />
</div>
CSS:
img {
max-width: 100%;
max-height: 100%;
vertical-align: middle;
}
div {
text-align: center;
font-size: 0;
}
#d1 {
width: 200px;
height: 100px;
line-height: 100px;
background: red;
}
#d2 {
width: 100px;
height: 200px;
line-height: 200px;
background: green;
}
答案 4 :(得分:-1)
改变我的答案 - 应该更好地阅读这个问题!
html:
<div class="img_wrapper">
<img class ='full_width' src="1.png" />
<img class ='full_width' src="2.png" />
<img class ='full_width' src="3.png" />
</div>
css:
.img_wrapper {
width: 860px;
margin: 30px;
}
.full_width {
width: 200px;
height: 200px;
float: left;
margin: 10px;
vertical-align: middle;
}
.full_width img {
max-width: 100%;
max-height: 100%;
}