在CSS FlexBox布局中自动调整图像大小并保持宽高比?


98

我使用了如下所示的CSS flex box布局:

在此处输入图片说明

如果屏幕变小,它将变为:

在此处输入图片说明

问题在于,无法调整图像的大小,从而保持原始图像的宽高比。

如果屏幕变小,是否可以使用纯CSS和弹性框布局来调整图像大小?

这是我的html:

<div class="content">
  <div class="row"> 
    <div class="cell">
      <img src="http://i.imgur.com/OUla6mK.jpg"/>
    </div>
    <div class="cell">
      <img src="http://i.imgur.com/M16WzMd.jpg"/>
    </div>
  </div>
</div>

我的CSS:

.content {
    background-color: yellow;    
}

.row {
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;

    -webkit-box-orient: horizontal; 
    -moz-box-orient: horizontal;
    box-orient: horizontal;
    flex-direction: row;

    -webkit-box-pack: center;
    -moz-box-pack: center;
    box-pack: center;
    justify-content: center;

    -webkit-box-align: center;
    -moz-box-align: center;
    box-align: center;  
    align-items: center;

    background-color: red;

}

.cell {
    -webkit-box-flex: 1;
    -moz-box-flex: 1;
    box-flex: 1;
    -webkit-flex: 1 1 auto;
    flex: 1 1 auto; 

    padding: 10px;
    margin: 10px;

    background-color: green;
    border: 1px solid red;
    text-align: center;

}

Answers:


83

img {max-width:100%;}是这样做的一种方式。只需将其添加到您的CSS代码即可。

http://jsfiddle.net/89dtxt6s/


3
如果屏幕变小,是否还可以针对高度尺寸执行此操作?
2014年

@confile很大程度上取决于您的代码布局,但是您可以尝试将其添加height:100%;imgCSS中。
欧米茄

height: 100vh会做到的,不是height: 100%。身高造型总是很棘手。
gdbj

1
为什么将此标记为正确答案?Omega不会将其转变为浏览器的默认行为吗?jsfiddle.net/89dtxt6s/221
VeeK

69

我来这里是寻找失真图像的答案。不完全确定op在上面寻找什么,但是我发现添加in align-items: center可以为我解决。阅读文档时,如果您直接弯曲图像,则有必要覆盖此设置,因为这align-items: stretch是默认设置。另一种解决方案是先用div包装图像。

.myFlexedImage {
  display: flex;
  flex-flow: row nowrap;
  align-items: center;
}

11
“我来这里寻找扭曲图像的答案”出于同样的原因,我来到这里,而您的解决方案对我有所帮助(标记为实际解决方案根本对我没有帮助)
Wagner da Silva,2016年

这也对我有帮助,有人可以解释为什么会这样吗?
Jerry B. 1号实习生,

这对我来说是正确的答案。最大宽度:100%;无法校正高度(高度仍略微拉长)。就我而言,我使用了align-items:flex-start; 因为我不希望图像在容器中垂直居中,但仍然可以工作,因为它会覆盖默认的align-items:以下是可用于覆盖的align-item的所有属性值的列表:w3schools.com/cssref/css3_pr_align-items.asp
Kyle Vassella

尝试了很多东西,但是您的align-items:center位于父对象上是唯一完成此操作的对象。
Micros

这应该是公认的答案。align-content在拉伸方面对我不起作用,但是align-items却有,它们都有不同的功能。这SE清除了两者的区别:stackoverflow.com/questions/27539262/...
约翰·欧内斯特

41

您可能想尝试非常新的CSS3功能:

img { 
  object-fit: contain;
}

它保留了图片比例(就像您使用背景图片技巧时一样),在我的案例中,它可以很好地解决同一问题。

但是请小心,IE不支持它(请参阅此处的支持详细信息)。


4
请记住,父对象必须是flex
Lokinou

我试过了,它在flex div中工作得很好。
雷米Kaloustian

5

我建议研究background-size调整图像尺寸的选项。

可以将图像设置为背景图像,而不是在页面中显示图像:

background-size: contain

要么

background-size: cover

这些选项在缩放图像时会同时考虑高度和宽度。这将在IE9和所有其他最近的浏览器中运行。


3

在第二张图像中,看起来好像您希望该图像填充该框,但是您创建的示例确实保持了宽高比(宠物看起来正常,而不是苗条或肥胖)。

我不知道您是否将这些图像作为示例进行了照相购物,或者第二个也是“应该如何”(您说的是IS,而第一个例子是“应该”)

无论如何,我必须假设:

如果“未调整图像的尺寸并保持宽高比”,而您给我看的图像确实保持了像素的宽高比,则我必须假设您正在尝试实现“裁剪”区域的高宽比(内部绿色),保持像素的长宽比。也就是说,您想通过放大和裁剪图像来用图像填充单元格。

如果是您的问题,那么您提供的代码不会反映“您的问题”,而是您的初始示例。

在前两个假设的前提下,如果盒子的高度是动态的,则无法用实际的图像来完成,而要用背景图像来完成。通过使用“背景尺寸:包含”或这些技术(以百分比为单位的智能填充,可限制所需的裁剪或最大尺寸):http : //fofwebdesign.co.uk/template/_testing/scale-img/scale- img.htm

对于图像,这唯一可行的方法是,如果我们忘记了您的第二个iimage,并且单元格具有固定的高度,那么幸运的是,根据您的样本图像判断,高度保持不变!

因此,如果容器的高度没有变化,并且您想使图像保持正方形,则只需将图像的最大高度设置为该已知值(减去填充或边框,具体取决于容器的框大小属性)。细胞)

像这样:

<div class="content">
  <div class="row">    
      <div class="cell">    
          <img src="http://lorempixel.com/output/people-q-c-320-320-2.jpg"/>
      </div>
      <div class="cell">    
          <img src="http://lorempixel.com/output/people-q-c-320-320-7.jpg"/>
      </div>
    </div>
</div>

和CSS:

.content {
    background-color: green;
}

.row {
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;

    -webkit-box-orient: horizontal; 
    -moz-box-orient: horizontal;
    box-orient: horizontal;
    flex-direction: row;

    -webkit-box-pack: center;
    -moz-box-pack: center;
    box-pack: center;
    justify-content: center;

    -webkit-box-align: center;
    -moz-box-align: center;
    box-align: center;  
    align-items: center;

}

.cell {
    -webkit-box-flex: 1;
    -moz-box-flex: 1;
    box-flex: 1;
    -webkit-flex: 1 1 auto;
    flex: 1 1 auto;
    padding: 10px;
    border: solid 10px red;
    text-align: center;
    height: 300px;
    display: flex;
    align-items: center;
    box-sizing: content-box;
}
img {
    margin: auto;
    width: 100%;
    max-width: 300px;
    max-height:100%
}

http://jsfiddle.net/z25heocL/

您的代码无效(开头标签不是关闭标签,因此它们输出NESTED单元格,而不是兄弟姐妹,他在错误代码内使用了SCREENSHOT图片的图像,而flex框未保存这些单元格,但两个示例都放在一列中(您设置了“行”,但损坏的代码将一个单元格嵌套在另一个单元格中,导致在flex单元中产生了一个flex,最后以COLUMNS的身份工作。我不知道您想完成什么,以及如何提出该代码,但是我我猜你想要什么

我添加了display:flex到单元格,所以图像居中(我想display: table所有这些标记都可以在这里使用)


您似乎对我如何回答问题一无所知。jsfiddle中的所有html和css都是发问者(@confile)提供的。只需阅读问题,您就会看到。我的解决方案是简单的css img {max-width:100%;}行,并且提问者一年多以前就接受了我的回答,因为它提供了所需的解决方案。祝您一切顺利,请尝试正确阅读问题,以后再作相应回答,谢谢。
欧米茄

0

HTML:

<div class="container">
    <div class="box">
        <img src="http://lorempixel.com/1600/1200/" alt="">
    </div>
</div>

CSS:

.container {
  display: flex;
  flex-direction: row;
  justify-content: center;
  align-items: stretch;

  width: 100%;
  height: 100%;

  border-radius: 4px;
  background-color: hsl(0, 0%, 96%);
}

.box {
  border-radius: 4px;
  display: flex;
}

.box img {
  width: 100%;
  object-fit: contain;
  border-radius: 4px;
}

0

这就是我在灵活的网格中处理不同图像(大小和比例)的方式。

.images {
  display: flex;
  flex-wrap: wrap;
  margin: -20px;
}

.imagewrapper {
  display: flex;
  justify-content: center;
  align-items: center;
  width: calc(50% - 20px);
  height: 300px;
  margin: 10px;
}

.image {
  display: block;
  object-fit: cover;
  width: 100%;
  height: 100%; /* set to 'auto' in IE11 to avoid distortions */
}
<div class="images">
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/800x600" />
  </div>
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/1024x768" />
  </div>
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/1000x800" />
  </div>
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/500x800" />
  </div>
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/800x600" />
  </div>
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/1024x768" />
  </div>
</div>


-5

我正在使用jquery或vw来保持比率

jQuery的

function setSize() {
    var $h = $('.cell').width();
    $('.your-img-class').height($h);
}
$(setSize);
$( window ).resize(setSize); 

大众

 .cell{
    width:30vw;
    height:30vw;
}
.cell img{
    width:100%;
    height:100%;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.