【发布时间】:2015-10-05 19:47:58
【问题描述】:
如果容器内的 am <img>(尺寸未知)设置为display:flexbox,是否可以满足以下条件:
- 如果图像的原生宽度小于容器的宽度,则它在容器内水平居中。
- 如果图像的原生高度小于容器的高度,则它与容器垂直居中。
- 如果图像的原生宽度大于容器的宽度,则图像将缩放到容器的宽度。
- 如果图像的原生高度大于容器的高度,则图像将缩放到容器的高度。
我注意到 Chrome 和 Firefox 处理 flexbox 子图像的方式存在很大差异。 Chrome 到达一半,但垂直挤压图像。 Firefox 到了一半,但水平挤压图像:Codepen
body,
html {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
}
.Container {
height: 100%;
width: 100%;
background: red;
display: flex;
justify-content: center;
align-items: center;
}
img{
max-height: 100%;
max-width: 100%;
}
<div class="Container">
<img src="http://d13rap2ac6f4c9.cloudfront.net/image_assets/quarry_medium.jpg?1410945487">
</div>
这是我能得到的最接近的Codepen,它在 4 上失败了。:
body,
html {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
}
.Container {
height: 100%;
width: 100%;
background: red;
display: flex;
justify-content: center;
align-items: center;
}
.ImageWrapper {
max-height: 100%;
max-width: 100%;
}
img{
max-height: 100%;
max-width: 100%;
width: 100%;
height: auto;
}
<div class="Container">
<div class="ImageWrapper">
<img src="http://d13rap2ac6f4c9.cloudfront.net/image_assets/quarry_medium.jpg?1410945487">
</div>
</div>
我知道这种行为以前如果没有 JavaScript 是不可能的,但我很惊讶使用 flexbox 似乎无法实现。
注意:我不是在寻找 JavaScript 解决方案或在现代浏览器中无法运行的解决方案。
针对 David Mann 的回答,这里是前面使用 object-fit Codepen 的示例。
body,
html {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
}
.Container {
height: 100%;
width: 100%;
background: red;
display: flex;
justify-content: center;
align-items: center;
}
img{
max-height: 100%;
max-width: 100%;
object-fit: contain;
}
<div class="Container">
<img src="http://d13rap2ac6f4c9.cloudfront.net/image_assets/quarry_medium.jpg?1410945487">
</div>
【问题讨论】:
-
我认为您的演示运行良好(在 Chrome 中测试),我认为问题是,图像不会在屏幕调整大小时按比例缩放(宽度在 Chrome 中没有按比例增长)但是当您调整窗口大小然后让页面重新加载,它可以很好地缩放。调整窗口大小时,你真的需要它来缩放吗?
-
@KiiroSora09 不幸的是,Firefox 并非如此,即使在页面重新加载时也会挤压图像。
-
抱歉,我现在没有 Firefox。也许您可以将 flex 与 object-fit 结合起来(来自下面大卫的回答)。因此对象适合将在现代浏览器上运行,并在 IE 11 上回退到 flex。
-
@KiiroSora09 是的。我认为这可能是要走的路。