【问题标题】:Auto Resize Image in CSS FlexBox Layout and keeping Aspect Ratio?在 CSS FlexBox 布局中自动调整图像大小并保持纵横比?
【发布时间】:2014-02-01 22:14:40
【问题描述】:

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

如果屏幕变小,它会变成这样:

问题在于图像未调整大小以保持原始图像的纵横比。

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

这是我的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;

}

【问题讨论】:

    标签: html css flexbox


    【解决方案1】:

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

    http://jsfiddle.net/89dtxt6s/

    【讨论】:

    • 如果屏幕变小了,高度维度是否也可以这样做?
    • @confile 很大程度上取决于您的代码布局,但您可以尝试将height:100%; 添加到img css。
    • height: 100vh 会这样做,而不是 height: 100%。高度的造型总是很棘手。
    • 为什么这被标记为正确答案? Omega不是把它变成了浏览器默认行为吗? jsfiddle.net/89dtxt6s/221
    【解决方案2】:

    我建议查看background-size 选项来调整图像大小。

    如果您将图像设置为背景图像,您可以设置:

    background-size: contain

    或

    background-size: cover

    这些选项在缩放图像时会考虑高度和宽度。这将适用于 IE9 和所有其他最新的浏览器。

    【讨论】:

      【解决方案3】:

      我正在使用 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%;
      }
      

      【讨论】:

        【解决方案4】:

        在第二张图片中,您似乎希望图片填充框,但您创建的示例确实保持了纵横比(宠物看起来正常,不瘦也不胖)。

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

        无论如何,我必须假设:

        如果“图像未调整大小以保持纵横比”并且您向我展示了确实保持像素纵横比的图像,我必须假设您正在尝试完成“裁剪”区域的纵横比(绿色的内部)WILE保持像素的纵横比。 IE。您想通过放大和裁剪图像来用图像填充单元格。

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

        鉴于前两个假设,如果框的高度是动态的,但使用背景图像,则无法使用实际图像来完成所需的操作。通过使用“背景大小:包含”或这些技术(以百分比限制裁剪的智能填充或您想要的最大尺寸): 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,最终作为 COLUMNS 工作。 我不知道你想要完成什么,以及你是如何想出这段代码的,但我猜你想要的是这个。

        我也向单元格添加了 display: flex,因此图像居中(我认为 display: table 也可以在这里使用所有这些标记)

        【讨论】:

        • 您似乎根本不知道我是如何回答这个问题的。该jsfiddle中的所有html和css都是提问者(@confile)提供的。只需阅读问题,您就会看到。我的解决方案是一行简单的 css img {max-width:100%;} 并且提问者在一年前接受了我的回答,因为它提供了所要求的解决方案。在这里祝您一切顺利,请尝试正确阅读问题,然后在以后做出相应的回答,谢谢。
        【解决方案5】:

        我来这里是为了寻找我扭曲图像的答案。不完全确定 op 在上面寻找什么,但我发现添加 align-items: center 会为我解决这个问题。阅读文档,如果您直接弯曲图像,覆盖它是有意义的,因为align-items: stretch 是默认值。另一种解决方案是先用 div 包装图像。

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

        【讨论】:

        • “我来这里是为了寻找我扭曲图像的答案”我出于同样的原因来到这里,您的解决方案帮助了我(标记为实际解决方案的内容根本没有帮助我)
        • 这对我也有帮助,有人能解释一下为什么会这样吗?
        • 这对我来说是正确的答案。最大宽度:100%;没有纠正高度(高度仍然略微拉伸)。就我而言,我使用了 align-items: flex-start;因为我不希望图像在容器中垂直居中,但它仍然有效,因为它覆盖了默认的 align-items:stretch;这是您可以用来覆盖的对齐项的所有属性值的列表:w3schools.com/cssref/css3_pr_align-items.asp
        • 尝试了很多东西,但是你在父节点上的 align-items:center 是唯一成功的。
        • 这应该是公认的答案。 Align-content 在拉伸方面对我不起作用,但 align-items 确实如此,两者都有不同的功能。这个 SE 清除了两者之间的区别:stackoverflow.com/questions/27539262/…
        【解决方案6】:

        您可能想尝试一下非常新且简单的 CSS3 功能:

        img { 
          object-fit: contain;
        }
        

        它保留了图片比例(就像您使用背景图片技巧时一样),并且在我的情况下很好地解决了同样的问题。

        但请注意,IE 不支持它(请参阅支持详细信息here)。

        【讨论】:

        • 请记住,父对象必须是 flex
        • 我试过了,它在 flex div 中完美运行。
        • 谢谢!我一直在寻找这个,我不敢相信它不是更受欢迎,我一直在解决这个问题并使用解决方法
        【解决方案7】:

        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;
        }
        

        【讨论】:

          【解决方案8】:

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

          .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>

          【讨论】:

            【解决方案9】:

            为单元格 div 设置 50% 的宽度或特定数字。 对于 img 标签,将宽度设置为 100%。 这样一来,宽度必须始终为 100%,并且高度会相应变化,同时保持纵横比不变。

            【讨论】:

              猜你喜欢
              • 2012-11-15
              • 2012-10-11
              • 2013-06-26
              • 2012-04-15
              • 2019-08-10
              相关资源
              最近更新 更多