【问题标题】:How flex affects the width of an image?flex 如何影响图像的宽度?
【发布时间】:2022-01-22 16:38:37
【问题描述】:

我不明白,在我的例子中 flex 是如何影响图像的比例的。我自己发现,这是因为width: 100% 是为img 标签设置的。但我不明白,为什么会这样?

在我的例子中,每个 flex 元素的大小是如何计算的,为什么它没有在 2 个 flex 元素之间均匀分布完整空间?

代码如下:

#about {
  border: 2px solid blue;
}

.row {
  display: flex;
  border: 2px solid black;
}

img {
  display: block;
  width: 100%;
  height: 100%;
}

.column {
  flex-grow: 1;
  border: 2px dashed red;
}
<section id="about">
  <div class="row">
    <div class="column">
      <img src="https://i.stack.imgur.com/yat2N.jpg" alt="">
    </div>
    <div class="column"> Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur quibusdam dicta dolore suscipit quidem, hic nihil aliquid officia porro illum! Necessitatibus cupiditate, sapiente cum recusandae tenetur dolore veritatis in temporibus perferendis.
      Ex corrupti voluptatibus eaque aliquam quis soluta veniam non dicta repellendus ea iure temporibus assumenda placeat accusantium quae iste, corporis maxime dolorum quisquam neque est sint asperiores doloribus. Quibusdam ducimus saepe distinctio
      illum veniam voluptates amet quod perferendis dolorem, deleniti mollitia. Ab aperiam, ea itaque tempore molestias ullam sint accusamus totam reiciendis laborum. At natus consequatur ex officia. Porro dolor accusamus blanditiis nam commodi provident
      assumenda facere adipisci perferendis. </div>
  </div>
</section>

这里是JS Fiddle

【问题讨论】:

  • 这能回答你的问题吗? Why does width and height of a flex item affect how a flex item is rendered? 更重要的是,Flexbox 模型声明单行中的元素将随着可用空间量的减少而缩小。例如,如果您有一排元素并且减小了浏览器的宽度,则元素的宽度将随着包含元素的宽度减小而缩小。这可以通过在 flex 孩子上设置 min/max-width 来防止
  • @カメロン 感谢您为我提供有关 Flexbox 渲染属性以及 height 如何覆盖 align-items: stretched 的重要信息的链接,但我仍然不知道如何将这些知识应用于我的问题.因为我不明白,img 标签的属性width: 100% 是如何影响弹性项目的,以至于它的呈现方式与其同级项目如此不同(即使我们将 'flex-grow: 1` 设置为它们两者,带有图像的第一个 flex 项目的渲染方式不同并且空间较小,为什么?)
  • 你看过W3C documentation吗?

标签: html css image flexbox


【解决方案1】:

首先,您应该注意flex-grow 默认等于1,因此您不需要设置它。然后,你需要了解“循环依赖”和“百分比大小”。

在您的情况下,您的图像应该是其父宽度的 100%,但其父项是弹性项目,其宽度取决于其内容(图像宽度也是如此)。

我在这里解释了类似的行为:How do browsers calculate width when child depends on parent, and parent's depends on child's。这同样适用于您的情况,width:100% 将禁用图像大小的最小贡献。就像图像最初不存在一样。

这是浏览器将执行的步骤。

首先,每列都根据其内容调整大小。没有发生收缩(就像设置flex-shrink:0

#about {
  border: 2px solid blue;
}

.row {
  display: flex;
  border: 2px solid black;
}

img {
  display: block;
  width: auto;
}

.column {
  flex-shrink: 0;
  border: 2px dashed red;
}
<section id="about">
  <div class="row">
    <div class="column">
      <img src="https://i.stack.imgur.com/yat2N.jpg" alt="">
    </div>
    <div class="column"> Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur quibusdam dicta dolore suscipit quidem, hic nihil aliquid officia porro illum! Necessitatibus cupiditate, sapiente cum recusandae tenetur dolore veritatis in temporibus perferendis.
      Ex corrupti voluptatibus eaque aliquam quis soluta veniam non dicta repellendus ea iure temporibus assumenda placeat accusantium quae iste, corporis maxime dolorum quisquam neque est sint asperiores doloribus. Quibusdam ducimus saepe distinctio
      illum veniam voluptates amet quod perferendis dolorem, deleniti mollitia. Ab aperiam, ea itaque tempore molestias ullam sint accusamus totam reiciendis laborum. At natus consequatur ex officia. Porro dolor accusamus blanditiis nam commodi provident
      assumenda facere adipisci perferendis. </div>
  </div>
</section>

如果您检查每列的宽度,您将获得第一列的1604 和第二列的5097。您可能会得到略有不同的值,但最重要的是注意差异,这是关键。

现在两列都需要缩小以适应容器宽度。假设容器宽度等于Xpx。我们将有一个等于(5097 + 1604) - X = 6701 - X 的溢出(也称为空闲负空间)。

每列的宽度公式为:

1st = 1604 - ((X - 6701) * 1604/6701) = 1604 - ((6701 - X) * 0.24)
2nd = 5097 - ((X - 6701) * 5097/6701) = 5097 - ((6701 - X) * 0.76)

从上面首先要注意的是,总和会给你X,这是合乎逻辑的结果,因为两列都需要缩小直到它们适合容器宽度。

如果你执行一些计算,你可以找到每一列的宽度,你会发现第二个总是更大。

如果X = 1000,您将拥有235.76 / 764.24

如果X = 800,您将拥有187.6 / 612.24

这是 flexbox 算法背后的逻辑。收缩时两列的比例要保持一致(收缩后大的还是大的)

最后,浏览器会将图像放在计算宽度的100% 的第一列中。


没有width:100%,您将面临图像元素的最小约束,这将防止第一列缩小到图像大小。您的图像大小等于1604,因此您的第一列不能变小,因此第二列将尝试缩小到0,但它不能小于给出以下结果的最长单词。

#about {
  border: 2px solid blue;
}

.row {
  display: flex;
  border: 2px solid black;
}

img {
  display: block;
}

.column {
  border: 2px dashed red;
}
<section id="about">
  <div class="row">
    <div class="column">
      <img src="https://i.stack.imgur.com/yat2N.jpg" alt="">
    </div>
    <div class="column"> Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur quibusdam dicta dolore suscipit quidem, hic nihil aliquid officia porro illum! Necessitatibus cupiditate, sapiente cum recusandae tenetur dolore veritatis in temporibus perferendis.
      Ex corrupti voluptatibus eaque aliquam quis soluta veniam non dicta repellendus ea iure temporibus assumenda placeat accusantium quae iste, corporis maxime dolorum quisquam neque est sint asperiores doloribus. Quibusdam ducimus saepe distinctio
      illum veniam voluptates amet quod perferendis dolorem, deleniti mollitia. Ab aperiam, ea itaque tempore molestias ullam sint accusamus totam reiciendis laborum. At natus consequatur ex officia. Porro dolor accusamus blanditiis nam commodi provident
      assumenda facere adipisci perferendis. </div>
  </div>
</section>

两列都溢出了。第一个等于图像宽度,第二个等于最长的单词。

您可以通过在列上使用min-width:0 来禁用此功能:

#about {
  border: 2px solid blue;
}

.row {
  display: flex;
  border: 2px solid black;
}

img {
  display: block;
}

.column {
  border: 2px dashed red;
  min-width:0;
}
<section id="about">
  <div class="row">
    <div class="column">
      <img src="https://i.stack.imgur.com/yat2N.jpg" alt="">
    </div>
    <div class="column"> Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur quibusdam dicta dolore suscipit quidem, hic nihil aliquid officia porro illum! Necessitatibus cupiditate, sapiente cum recusandae tenetur dolore veritatis in temporibus perferendis.
      Ex corrupti voluptatibus eaque aliquam quis soluta veniam non dicta repellendus ea iure temporibus assumenda placeat accusantium quae iste, corporis maxime dolorum quisquam neque est sint asperiores doloribus. Quibusdam ducimus saepe distinctio
      illum veniam voluptates amet quod perferendis dolorem, deleniti mollitia. Ab aperiam, ea itaque tempore molestias ullam sint accusamus totam reiciendis laborum. At natus consequatur ex officia. Porro dolor accusamus blanditiis nam commodi provident
      assumenda facere adipisci perferendis. </div>
  </div>
</section>

您将得到最初计算的相同宽度,但现在列内的图像会溢出。

【讨论】:

    【解决方案2】:

    不要使用flex-grow:1,而是可以为两个兄弟姐妹使用col-6。你会得到你想要的输出

    【讨论】:

    • 如果 OP 希望每个元素占据 50%,那将是一个有效的解决方案。但是,使用 Bootstrap 和 col-6 将涉及 row,然后将涉及 flex。因此,我们又回到了 flex 如何影响图像的问题。
    猜你喜欢
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 2020-01-07
    • 2021-01-03
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    相关资源
    最近更新 更多