【问题标题】:How to make flexbox with cross axis overflow have the same height?如何使具有交叉轴溢出的flexbox具有相同的高度?
【发布时间】:2020-09-20 12:09:20
【问题描述】:

一个弹性容器包含两列,第一列可以是任意高度,所以我手动设置了容器的高度并设置了overflow: auto。

我所期望的是右侧的空 div 将与左侧的 sss 框具有相同的高度。确实它们具有相同的高度,但是这是由于左侧sss框的高度缩小了。(与容器100px的高度相同)

.c {
  display: flex;
  width: 400px;
  height: 100px;
  overflow: auto;
  flex-wrap: nowrap;
}

.empty {
  background-color: red;
  border: 1px solid;
  flex: 1;
}

.sss {
  border: 1px solid;
}
<div class="c">
  <div class="sss">
    <p>sssss</p>
    <p>sssss</p>
    <p>sssss</p>
    <p>sssss</p>
    <p>sssss</p>
  </div>
  <div class="empty">
  </div>
</div>

我在左边的盒子里设置了margin-top: auto,现在高度恢复正常(正好是所有sss的总高度),而空盒子的高度仍然保持不变。

.c {
  display: flex;
  width: 400px;
  height: 100px;
  overflow: auto;
  flex-wrap: nowrap;
}

.empty {
  background-color: red;
  border: 1px solid;
  flex: 1;
}

.sss {
  margin-bottom: auto;
  border: 1px solid;
}
<div class="c">
  <div class="sss">
    <p>sssss</p>
    <p>sssss</p>
    <p>sssss</p>
    <p>sssss</p>
    <p>sssss</p>
  </div>
  <div class="empty">
  </div>
</div>

然后我设置flex-wrap: wrap 并且它起作用了,但是我不希望它们在宽度不够时被包裹。

另外,我尝试将这两列包装在一个表中,结果与flex-nowrap 相同。

.c {
  display: flex;
  width: 400px;
  height: 100px;
  overflow: auto;
  flex-wrap: wrap;
}

.empty {
  background-color: red;
  border: 1px solid;
  flex: 1;
}

.sss {
  border: 1px solid;
}
<div class="c">
  <div class="sss">
    <p>sssss</p>
    <p>sssss</p>
    <p>sssss</p>
    <p>sssss</p>
    <p>sssss</p>
  </div>
  <div class="empty">
  </div>
</div>

【问题讨论】:

    标签: javascript html css flexbox


    【解决方案1】:

    改用 CSS 网格:

    .c {
      display: grid;
      grid-template-columns:auto 1fr;
      width: 400px;
      height: 100px;
      overflow: auto;
    }
    
    .empty {
      background-color: red;
      border: 1px solid;
    }
    
    .sss {
      border: 1px solid;
    }
    <div class="c">
      <div class="sss">
        <p>sssss</p>
        <p>sssss</p>
        <p>sssss</p>
        <p>sssss</p>
        <p>sssss</p>
      </div>
      <div class="empty">
      </div>
    </div>

    【讨论】:

    • 为什么 flex 方式不起作用,为什么使用 margin-auto 会使其拉伸?
    • @BAKEZQ 边距实际上是相反的,默认情况下,元素被拉伸到等于父高度并添加边距,您可以删除该限制以使其随内容高度一起增长
    • @BAKEZQ 因为它是空的。正如我所说,边距将禁用拉伸效果以使元素跟随其内容高度。空 div 没有内容,因此它将为 0,而 sss 元素的内容大于其父元素并适合它
    • 谢谢我明白了。。还有两个问题。 1. 除了网格的方式,还有其他的方式可以用flex box实现吗? 2. 为什么 flex-nowrap 可以工作?
    • @BAKEZQ 使用 CSS 网格很容易,如您所见,使用 flexbox 会很棘手,我们可能需要根据每种情况找到解决方法。 Flex:wrap 使它工作,因为它创建了多行,其中空 div 位于第一行,并且该行的高度由其他 div 定义,但正如您所说,如果空间不足,元素可能会到达下一行。如果没有 wrap,我们只有一行由容器高度定义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 2020-06-20
    • 2015-02-20
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    相关资源
    最近更新 更多