当前位置: 首页 > 知识库问答 >
问题:

如何使flexbox项目在嵌套容器中正确收缩?

段干兴业
2023-03-14

如果我像这样设置嵌套的flexbox容器:

<div class="container1">
  <div class="grow1">
    <div class="container2">
      <div class="grow2"></div>
    </div>
  </div>
</div>

......然后设置生长2的宽度,使其比容器1宽,然后生长2溢出容器1。

我认为这不应该发生,因为当flex元素比flex容器大时,它们应该收缩。

如果我设置了生长2的灵活基础,那么这就像预期的那样工作。

有关演示,请参见以下示例:

https://jsfiddle.net/chris00/ot1gjjtk/20/

请使用Chrome或火狐

此外,我读到flexbox规范说宽度和FlexBasis应该有相同的效果(当使用水平布局时),但它们显然没有。

现在我可以用弹性基础代替宽度,但是。。。Edge对flex basis和width都做相同的事情,但它的方式是“错误的”。IE11也犯了错误(尽管它似乎有多个flexbox bug)。请使用Edge查看演示。

那么这是怎么回事?

所有浏览器都有bug吗?

flex basis是否应该与宽度不同(在简单的水平布局中)?

或者边缘是否正确,宽度和弹性基准是否都会溢出父容器?

最后,是否有一个解决办法可以修复Edge(甚至IE11)的溢出?

.container1 {
  margin-top: 10px;
  display: flex;
  width: 200px;
  height: 50px;
  background-color: red;
}

.grow1 {
  flex-grow: 1;
  height: 40px;
  background-color: green;
}

.container2 {
  display: flex;
  height: 30px;
  background-color: yellow;
}

.grow2a {
  flex-grow: 1;
  flex-basis: 400px;
  height: 20px;
  background-color: turquoise;
}

.grow2b {
  flex-grow: 1;
  width: 400px;
  height: 20px;
  background-color: turquoise;
}
<div class="container1">
  <div class="grow1">
    <div class="container2">
      <div class="grow2a">Working (flex-basis)</div>
    </div>
  </div>
</div>

<div class="container1">
  <div class="grow1">
    <div class="container2">
      <div class="grow2b">Not working (width)</div>
    </div>
  </div>
</div>

共有1个答案

糜宜民
2023-03-14

就规范而言,这不是一个与flex基础宽度flex-增长flex有关的问题。这是完全不同的事情。

4.5. 弹性物品的隐含最小尺寸

为了为弹性物品提供更合理的默认最小尺寸,本规范引入了一个新的auto值作为CSS 2.1中定义的min widthmin height属性的初始值。

换句话说,默认情况下,弹性项不能小于其内容的长度(本质上是最长的单词或固定大小的元素)。

该项不能停留在其容器内(甚至不能呈现滚动条或省略号),因为不允许其内容溢出。内容只是扩展项目。此行为也适用于固定大小(例如代码中的flex-basis:400px)。

同样,初始设置是:

  • 最小宽度:自动,在行方向
  • 最小高度:自动,在列方向

有关更完整的解释,请参阅这篇文章:

  • 为什么flex项不缩小过去的内容大小?

这个问题的标准解决方案很简单:覆盖默认值。

在代码中,将最小宽度:0添加到。增长1

这解决了Chrome、Safari、FF和Edge中的问题。

css prettyprint-override">.container1 {
  margin-top: 10px;
  display: flex;
  width: 200px;
  height: 50px;
  background-color: red;
}

.grow1 {
  flex-grow: 1;
  height: 40px;
  background-color: green;
  min-width: 0; /* NEW */
}

.container2 {
  display: flex;
  height: 30px;
  background-color: yellow;
}

.grow2a {
  flex-grow: 1;
  flex-basis: 400px;
  height: 20px;
  background-color: turquoise;
}

.grow2b {
  flex-grow: 1;
  width: 400px;
  height: 20px;
  background-color: turquoise;
}
html prettyprint-override"><div class="container1">
  <div class="grow1">
    <div class="container2">
      <div class="grow2a">Working (flex-basis)</div>
    </div>
  </div>
</div>

<div class="container1">
  <div class="grow1">
    <div class="container2">
      <div class="grow2b">Not working (width)</div>
    </div>
  </div>
</div>
 类似资料:
  • 问题内容: 我在正确使用flexbox时遇到问题,想澄清一下嵌套父元素和子元素的工作方式。 我知道孩子继承了父母的弹性。但是,如果您需要为孩子的孩子(孩子)抚养孩子,这会被覆盖吗?flexbox的正确用法是什么? 我什么时候都适用于孩子 的 孩子(婴儿)的缘故,或将是覆盖孩子的父母柔性? 问题答案: 一个范围 柔性格式化的内容被限制在一个父/子关系。 这意味着弹性容器始终是父容器,而弹性项目始终是

  • 问题内容: 对于任何CSS专家来说,我都有一个棘手的问题。我的绿色div的高度灵活,可以容纳剩余的高度。现在我想在该div中放置一个div,该div应该是绿色div的一半。但似乎Chrome是否将其视为整个页面的一半而不是flex项目。 HTML CSS 问题答案: 您可以绝对定位。 关于您的声明: 但似乎Chrome是否将其视为整个页面的一半而不是flex项目。 您给了。然后给它的孩子()一个。

  • 问题内容: 我正在尝试了解如何正确观察道具的一些变化。我有一个父组件(.vue文件),它从ajax调用接收数据,将数据放入对象中,并通过v- for指令使用它来呈现某些子组件,以下是我的实现的简化: …然后在标签内: 项目对象是这样的: 现在,在我的孩子“玩家”组件中,我试图观察任何Item的属性变化,并使用: 它有效,但是对我来说似乎有点棘手,我想知道这是否是正确的方法。我的目标是每次更改或获取

  • 问题 阻止类似按钮的内容会导致我的flex项目展开并溢出flexbox容器。 预期行为 在本例中,按钮应与按钮文本并排,并用省略号隐藏。flex项的宽度应基于兄弟项而非内容,并在容器更改宽度和添加或删除flex项时保持在容器内的响应性。另一个警告是,对于我的特定场景,我不能在flex项或buttons父div上使用overflow:hidden。 这是小提琴手。 例Html 示例CSS 编辑:现在

  • 问题内容: 查看实时代码: 角JS 到底如何正确遍历嵌套键值对并正确输出,如下所示? 我要的是一棵像这样的树 当前视图是: JS: HTML: 问题答案: 您非常接近,我更新了小提琴。http://jsfiddle.net/y9wj6/9/

  • 问题内容: 我正在使用multiprocessor.Pool()模块来加速“令人尴尬的并行”循环。其实我有一个嵌套的循环,现在用multiprocessor.Pool加快内循环。例如,在不并行化循环的情况下,我的代码如下: 使用并行化: 我的主要问题是这是否正确,我应该在循环内包含multiprocessing.Pool(),或者是否应该在循环外创建池,即: 另外,我不知道我是否应该包括线“poo