我创建了这个代码片段

.wrapper {
  position: fixed;
  inset: 0;
  display: flex;
  justify-content: center;
  padding-top: 15px;
  padding-bottom: 15px
}

.modal {
  width: 300px;
  display: flex;
  flex-direction: column;
}

.container {
  flex: 1;
  display: flex;
  flex-direction: column;
}

.footer {
  height: 50px;
  background-color: red;
}

.content {
  flex: 1 1 0px;
  overflow-y: scroll;
}

.box {
  height: 300px;
}

.box-yellow {
  background-color: yellow;
}

.box-blue {
  background-color: blue;
}
<div class="wrapper">
  <div class="modal">
    <span>heading</span>
    <div class="container">
      <div class="content">
        <div class="box box-yellow"></div>
        <div class="box box-blue"></div>
      </div>
      <div class="footer"></div>
    </div>
  </div>
</div>

我们的目标是创建一个具有页眉、可滚动内容和页脚的模式.

标记的顺序是必需的.

我的问题是,为什么一定要这样:

.content {
  flex: 1 1 0px;
  overflow-y: scroll;
}

为什么就不能这样呢:

.content {
  flex: 1;
  overflow-y: scroll;
}

最终目标实现了,但作为Flexbox的初学者,我想知道为什么需要flex: 1 1 0px.

我读过一些关于flex-base的文档,但看起来flex-base有几种行为.在这个特定的 case 中发生了什么?

推荐答案

这实际上有点棘手;它是buried in the spec位,但默认的弹性基数(在flex声明中省略时)是0%.

对于您的情况,0%没有任何意义,因为父级没有指定的高度(同样,height: 0%也没有任何意义).这导致它被忽略,并回落到auto,这最终扩大了整个事情.

另一方面,将其设置为0px是可行的,因为它可以正确地解决,因此实际上是有效的.

编辑

我想我应该在这里更详细地阐述一下.Flexbox的工作方式是,它获取弹性项,在将它们放置在您的Flexbox中后,它根据定义的flex-growflex-shrink属性分配或删除任何正负空间.

现在,考虑到这一点,这里实际上有两个相关的Flexbox:.container.content.请注意,.container不是滚动容器,而.content是.

另一个相关事实是min-height;它的默认值是auto.在Flex项的上下文中,这意味着如果容器不是滚动容器,则计算到min-content,否则计算到0(see this bit in the spec).

现在,让我们把这些放在一起..content元素,如果它的flex-basis0%,则最终回落到auto.它想要成为滚动容器,但其父元素.container并非如此,也没有指定高度;这意味着父元素将溢出,.content元素最终不会伸缩,因为它没有所需的高度.它根本不会成为卷轴容器.

解决这一问题的一种方法是在.container上设置height: 0;min-height: 0;,而不是在.content上设置flex: 1 1 0px.这样,溢出就必须在.content元素中完成,从而产生想要的行为.

如果改为使用flex: 1 1 0px,则在调整之前,.content将被布局为高度为0px;这不会在父级上触发溢出.在此之后,将应用伸缩,元素将增长以适合其父容器(不会溢出).在这种情况下,.content成为滚动容器.

Html相关问答推荐

restrict. form—text width to input s width'

Xpath:提取标签之间的文本,但一旦出现嵌入标签就停止

自动字间距以适应行CSS

附加点的列表样式

在WooCommerce单一产品页面上使产品图片库粘滞(固定)

轨道上的居中范围滑块拇指(Webkit)

单独处理Button:Focus的多行按钮

如何 Select 表格';TMS Web Core中的body html元素?

使用单个粗体字符串向段落添加页边空白

悬停表格单元格文本时,使元素的字体大小更大,同时保持表格单元格的高度不变

下划线在 Bootstrap 5 导航链接下无法正常工作

为什么溢出时overflow: auto框的底部有一个小间隙?

子元素放在文本样式之后,样式会 destruct

如何将一个边框向下移动

如何通过像图像一样的 元素来调整 SVG 图标的大小

如何让一个 div 始终贴在容器的边缘?

使用图像自定义 CSS 网格边框

如何清除html输入中的文本

提交前的验证表单未显示任何验证消息?

CSS Padding 将右对齐的对象推离页面