【问题标题】:Keep aspect ratio of images in flex container保持 flex 容器中图像的纵横比
【发布时间】:2016-09-09 22:30:36
【问题描述】:

我有一组 3 张图片:

我希望它们根据浏览器宽度保持纵横比。

我尝试过 flex-box,但左图和右图之间的高度总是存在差异。

我找到的实际解决方案是将左侧图像放在带有background-size: cover; 的背景中。

有没有办法使用 flex-box 来管理这样的自动比例?

.container-img {
  display: flex;
  width: 100%;
  flex-basis: 100%;
  justify-content: space-between;
  background: gold;
}
.picture-large {
  flex: 1 0 calc(77.6% - 10px);
}
.picture-large img {
  width: 100%;
}
.block-img {
  text-align: right;
}
.block-img img {
  width: calc(100% - 10px);
}
.block-img img:first-child {
  margin-bottom: 10px;
}
img {
  vertical-align: middle;
}
<div class="container-img">
  <div class="picture-large">
    <img src="http://media-cache-ec0.pinimg.com/originals/8a/70/5e/8a705e6e7d9dc34eb26cb41ac20ac9ca.jpg" alt="">
  </div>
  <div class="block-img">
    <img class="picture" src="http://static1.decosoon.com/70282-large_atch/puppy-kitten-hug-painting.jpg">
    <img class="picture" src="http://us.123rf.com/450wm/azalia/azalia1308/azalia130800062/21936902-fluffy-cat-in-a-pan--striped-not-purebred-kitten-kitten-on-a-white-background-small-predator-small-c.jpg">
  </div>
</div>

【问题讨论】:

    标签: html css flexbox responsive


    【解决方案1】:

    我使用 SaSS 来实现您的要求。

    标记:

    <div class="container-img">
      <div class="picture-large">
        <img src="http://media-cache-ec0.pinimg.com/originals/8a/70/5e/8a705e6e7d9dc34eb26cb41ac20ac9ca.jpg" alt="">
      </div>
      <div class="block-img">
        <img class="picture" src="http://static1.decosoon.com/70282-large_atch/puppy-kitten-hug-painting.jpg">
        <img class="picture" src="http://us.123rf.com/450wm/azalia/azalia1308/azalia130800062/21936902-fluffy-cat-in-a-pan--striped-not-purebred-kitten-kitten-on-a-white-background-small-predator-small-c.jpg">
      </div>
    </div>
    

    以下代码保存在 default.scss 文件中,然后我使用 Scout 将其编译为浏览器可以读取的 default.css 文件。

    @charset 'UTF-8';
    
    // Source: http://engageinteractive.co.uk/blog/top-10-scss-mixins#responsiveratio
    @mixin responsive-ratio($x,$y, $pseudo: false) {
    $padding: unquote( ( $y / $x ) * 100 + '%' );
    @if $pseudo {
        &:before {
            @include pseudo($pos: relative);
            width: 100%;
        }
      }
    }
    
    // Source: http://aricedev.azurewebsites.net/perfectly-centering-images-with-dynamic-sizes/
    @mixin flexbox {
    display: -webkit-box;
    display: -webkit-flex;
    display: -moz-flex;
    display: -ms-flexbox;
    display: flex;
    }
    
    @mixin perfect-center {
    @include flexbox;
    -webkit-justify-content: center;
    justify-content: center;
    -webkit-align-items: center;
    align-items: center;
    }
    
    
    .container-img {
    width:100%;
    display: flex;
    flex-basis: 100%;
    background: gold;
    display: flex;
    justify-content: center;
    align-items: center;
    
      .picture-large {
      float:left;
      width:100%;
      object-fit: contain;
    
      // Ratio based on defined 1150px by 700px dimensions
      // Caluclated at: http://andrew.hedges.name/experiments/aspect_ratio/
      @include responsive-ratio(23,14);
        img {max-width:100%; height:auto;}
      }
      .block-img {
      justify-content: center;
      align-items: center;
      width:30%;
      float:right;
      background:green;
      // Ratio based on equal width and height dimensions defined
      @include responsive-ratio(1,1);
      img {width:100%; max-width:350px; max-height:350px;
        &.picture {}
      }
     }
    }
    

    default.css 输出如下:

    @charset "UTF-8";
    .container-img {
    width: 100%;
    display: flex;
    flex-basis: 100%;
    background: gold;
    display: flex;
    justify-content: center;
    align-items: center;
    }
    .container-img .picture-large {
    float: left;
    width: 100%;
    object-fit: contain;
    }
    .container-img .picture-large img {
    max-width: 100%;
    height: auto;
    }
    .container-img .block-img {
    justify-content: center;
    align-items: center;
    width: 30%;
    float: right;
    background: green;
    }
    .container-img .block-img img {
    width: 100%;
    max-width: 350px;
    max-height: 350px;
    }
    

    【讨论】:

    • 图片顶部和底部仍有空间
    • @romuleald 如果你的意思是围绕整个框架,那就是默认设置为主体的边距,可以通过执行 body:margin:0; 来删除它。至于小狗图像顶部和底部的“空格”,是实际图像的一部分,与代码无关。使用检查元素自己查看或复制猫图像就可以了。
    • 我看到您使用的是 IE 不支持的object-fit。黄色背景表示里面还有margin
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 2016-12-20
    • 2017-04-11
    • 2019-05-30
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多