为什么在Flexbox中没有对象适合工作?

Jac*_*Guy 19 html css flexbox

我有几个列,我使用flex给出相等的宽度.每个都包含img标签,我希望这些图像能够展示object-fit: cover尺寸.

.container {
  display: flex;
  flex-direction: row;
  width: 100%;
}
.test {
  flex: 1;
  margin-right: 1rem;
  overflow: hidden;
  height: 400px;
}
img {
  object-fit: cover;
}
Run Code Online (Sandbox Code Playgroud)
<div class="container">
  <div class="test"><img src="http://placehold.it/1920x1080"></div>
  <div class="test"><img src="http://placehold.it/1920x1080"></div>
  <div class="test"><img src="http://placehold.it/1920x1080"></div>
  <div class="test"><img src="http://placehold.it/1920x1080"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

图像没有调整大小,如本演示中所示.这是为什么?

Mic*_*l_B 28

规格:

object-fit属性指定如何将替换元素的内容拟合到由其使用的高度和宽度建立的框中.

关键术语是:安装在由其使用的高度和宽度确定的盒子上

图像被替换,而不是其容器.由其使用的高度和宽度建立的盒子与图像本身有关,而不是与容器有关.

因此,废弃容器并使图像本身成为弹性项目.

.container {
  display: flex;
  flex-direction: row;
  width: 100%;
}

img {
  object-fit: cover;
  flex: 1;
  margin-right: 1rem;
  overflow: hidden;
  height: 400px;
}
Run Code Online (Sandbox Code Playgroud)
<div class="container">
  <img src="http://placehold.it/1920x1080">
  <img src="http://placehold.it/1920x1080">
  <img src="http://placehold.it/1920x1080">
  <img src="http://placehold.it/1920x1080">
</div>
Run Code Online (Sandbox Code Playgroud)

修改了Codepen


额外细节

5.5.调整对象:object-fit 属性

object-fit属性指定如何将替换元素的内容拟合到由其使用的高度和宽度建立的框中.

以下是三个值:

  • cover

    替换的内容的大小可以在填充元素的整个内容框时保持其宽高比.

  • contain

    替换的内容的大小可以在适合元素的内容框时保持其宽高比.

  • fill

    替换的内容大小适合填充元素的内容框.

cover所述图像保持其宽高比,并覆盖所有可用空间.使用此选项,可以在屏幕外裁剪大部分图像.

随着contain纵横比也保持,但图像进行缩放以适应箱内.这可能会导致左侧和/或右侧(纵向拟合)或顶部和/或底部(横向拟合)出现空白.该object-position属性可用于在其框内移动图像.

随着fill纵横比被放弃,所述图像的尺寸适合的框.


浏览器兼容性

在撰写本文时,object-fitInternet Explorer不支持.有关解决方法,请参阅:

  • 或者,`身高:100%; width:100%`使图像与flex项目具有相同的大小. (3认同)
  • 对我来说,在`img`声明中添加`overflow:hidden'是至关重要的。 (2认同)

Ori*_*iol 14

问题是object-fit指定如何在图像内部绘制图像img,但是您没有指定这些元素的大小,只指定了.test父项的大小.

所以Michael_B的答案的替代方案是使图像与flex项目具有相同的大小:

img {
  height: 100%;
  width: 100%;
  object-fit: cover;
}
Run Code Online (Sandbox Code Playgroud)

.container {
  display: flex;
  flex-direction: row;
  width: 100%;
}
.test {
  flex: 1;
  margin-right: 1rem;
  overflow: hidden;
  height: 400px;
}
img {
  height: 100%;
  width: 100%;
  object-fit: cover;
}
Run Code Online (Sandbox Code Playgroud)
<div class="container">
  <div class="test"><img src="http://placehold.it/1920x1080"></div>
  <div class="test"><img src="http://placehold.it/1920x1080"></div>
  <div class="test"><img src="http://placehold.it/1920x1080"></div>
  <div class="test"><img src="http://placehold.it/1920x1080"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

  • @Michael_B只有一个尺寸它仍然有效,但它通常是无用的.当你在不考虑内在宽高比的情况下调整`img`元素的大小时,`object-fit`基本上是有用的.然后默认情况下图像失真(填充),但您可能希望以不同的方式保持纵横比(包含,覆盖).如果你只设置一个尺寸的`img`,另一个将根据纵横比计算.所以所有`object-fit`值都会产生相同的结果.例外情况是,如果使用了高级布局技术(如flexbox),则在解决后修改自动大小. (2认同)
  • 还有一点可能有用:我不认为“高度:100%”作为嵌套图像的通用解决方案,因为如果容器没有定义的高度,则百分比“高度”将不起作用,除非绝对定位。但在这种情况下它确实有效,因为容器的高度是定义的。 (2认同)