防止弹性物品溢出容器

phi*_*reo 49 css flexbox

如何制作我的弹性项目(article在本例中),它flex-grow: 1; 不会溢出它的flex父/容器(main)?

在这个例子article中只是文本,虽然它可能包含其他元素(tables等).

main, aside, article {
  margin: 10px;
  border: solid 1px #000;
  border-bottom: 0;
  height: 50px;
}
main {
  display: flex;
}
aside {
  flex: 0 0 200px;
}
article {
  flex: 1 0 auto;
}
Run Code Online (Sandbox Code Playgroud)
<main>
  <aside>x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x </aside>
  <article>don't let flex item overflow container.... y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y </article>
</main>
Run Code Online (Sandbox Code Playgroud)

ors*_*zky 63

对我来说,只需添加min-width: 0;到溢出的 div 即可防止溢出:

article {
  min-width: 0;
}
Run Code Online (Sandbox Code Playgroud)

解释:

min-width在 flex 上下文中:虽然默认min-width值是0(零),但对于 flex 项目,它是auto。这会使块元素占用比预期更多的空间,从而导致溢出。

min-width被定义为战胜竞争widthand max-width,这意味着一旦元素的宽度缩小到其隐式自动宽度以下,min-width:auto就会启动并防止元素缩小。

现在修复很明显: min-width: 0

它告诉浏览器这个元素没有权利占用任何最小宽度,现在它会被正确渲染,只占用尽可能多的宽度。

关于flex-shrink:虽然 flex-shrink 听起来在这里可以有所帮助,但事实并非如此。所描述的问题是关于基于元素内容的元素大小调整,而 flex-shrink 定义相对于同一上下文中其他 flex 元素的收缩。来源

  • 换句话说,因为 `display:flex;` 导致 `min-width:auto;`,那么元素就不能缩小到低于其所需的宽度,因此它永远不会在自身内部产生溢出。 (9认同)
  • 耶,谢谢!现在我们需要对这个魔法做出解释。 (7认同)
  • 天哪,我为这个怪癖抓狂了;太感谢了! (7认同)
  • 对上面的答案添加了解释^ (3认同)
  • 注意:如果您使用“flex-direction:column;”,则可以通过“min-height:0;”来防止溢出 (2认同)

Ori*_*iol 52

你的弹性物品有

flex: 0 0 200px;
flex: 1 0 auto;
Run Code Online (Sandbox Code Playgroud)

这意味着:

  • 第一个将从200px广泛开始.

    然后它不会增长也不会缩小.

  • 第二个将从内容给出的宽度开始.

    然后,如果有可用空间,它将增长到覆盖它.

    否则它不会收缩.

为防止水平溢出,您可以:

  • 使用flex-basis: 0,然后让他们积极成长flex-grow.
  • flex-shrink如果空间不足,请使用正值让它们缩小.

为了防止垂直溢出,你可以

  • 如果需要,使用min-height而不是height允许flex项目增长
  • overflow在弹性项目上使用不同于可见的
  • overflow在flex容器上使用与visible不同的值

例如,

main, aside, article {
  margin: 10px;
  border: solid 1px #000;
  border-bottom: 0;
  min-height: 50px; /* min-height instead of height */
}
main {
  display: flex;
}
aside {
  flex: 0 1 200px; /* Positive flex-shrink */
}
article {
  flex: 1 1 auto; /* Positive flex-shrink */
}
Run Code Online (Sandbox Code Playgroud)
<main>
  <aside>x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x </aside>
  <article>don't let flex item overflow container.... y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y </article>
</main>
Run Code Online (Sandbox Code Playgroud)

  • @vee 尝试设置 `flex: 1 1 0; `&lt;article&gt;` 上的 min-width: 0;` – 与 `&lt;table&gt;` 有同样的问题,它有帮助;请参阅 https://dev.to/martyhimmel/quick-tip-to-stop-flexbox-from-overflowing-peb (4认同)
  • 如果我在`&lt;article&gt;`里面有`&lt;table&gt;`甚至用`div`和`overflow:auto;包装表,那似乎行不通。 (2认同)
  • 如果您正在处理许多溢出容器的弹性项目(而不是文本),您应该使用 [flex-wrap](https://developer.mozilla.org/en/docs/Web/CSS/flex-wrap) (2认同)
  • @vee,当你有一个 &lt;table&gt; 来处理时,解决方案是将 min-width: 0 添加到包含该表的 flex 子元素中,如 Washington Guedes 上面所解释的。 (2认同)
  • 它不起作用,从来没有起作用,在多个网站上进行了测试。您的解决方案完全错误,应该删除。 (2认同)

Pan*_*olo 13

一种简单的解决方案是使用除按预期重置文本 flex 基础宽度overflow之外的值visible

  1. 这里的 valueauto文本按预期换行,文章内容不会溢出主容器。

  2. 此外,文章flex价值必须有一个auto基础并且能够缩小,或者,只能增长 AND 显式0基础

main, aside, article {
  margin: 10px;
  border: solid 1px #000;
  border-bottom: 0;
  height: 50px;
  overflow: auto; /* 1. overflow not `visible` */
}
main {
  display: flex;
}
aside {
  flex: 0 0 200px;
}
article {
  flex: 1 1 auto; /* 2. Allow auto width content to shrink */
  /* flex: 1 0 0; /* Or, explicit 0 width basis that grows */
}
Run Code Online (Sandbox Code Playgroud)
<main>
  <aside>x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x </aside>
  <article>don't let flex item overflow container.... y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y </article>
</main>
Run Code Online (Sandbox Code Playgroud)


far*_*kas 8

我知道这真的很晚了,但对我来说,我发现应用flex-basis: 0;到元素可以防止它溢出。


Nen*_*car 6

而不是flex: 1 0 auto仅仅使用flex: 1

main, aside, article {
  margin: 10px;
  border: solid 1px #000;
  border-bottom: 0;
  height: 50px;
}
main {
  display: flex;
}
aside {
  flex: 0 0 200px;
}
article {
  flex: 1;
}
Run Code Online (Sandbox Code Playgroud)
<main>
  <aside>x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x </aside>
  <article>don't let flex item overflow container.... y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y </article>
</main>
Run Code Online (Sandbox Code Playgroud)

  • 为了澄清,“ flex:1”就像“ flex:1 1 0”。 (7认同)

Jea*_*esi 5

如果您希望溢出包装: flex-flow: row wrap