【问题标题】:Prevent flex items from overflowing a container防止弹性项目溢出容器
【发布时间】:2016-07-13 20:37:02
【问题描述】:

如何制作我的弹性项目(本例中为article),它有flex-grow: 1; 溢出它的弹性父/容器(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;
}
<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>

【问题讨论】:

  • 我有一个与子表响应溢出弹性项目非常相似的问题,解决方案是将min-width: 0;添加到弹性项目。
  • 我可以吻你@WashingtonGuedes 你提到的 min-width 让我看到了这篇 CSS Tricks 文章,它描述了 min-width 如何/为什么解决了这个问题 css-tricks.com/flexbox-truncated-text
  • @WashingtonGuedes 你把这个添加到哪个项目我似乎无法得到这个权利

标签: css flexbox


【解决方案1】:

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

article {
  min-width: 0;
}

说明:

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

min-width 的定义是为了战胜竞争的widthmax-width,这意味着一旦元素的宽度缩小到其隐含的自动宽度以下,min-width:auto 就会启动并阻止元素缩小。

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

它告诉浏览器此元素无权占用任何最小宽度,现在它将正确呈现,仅占用可用宽度。

关于flex-shrink 的注释:虽然 flex-shrink 听起来在这里可以提供帮助,但实际上并没有。所描述的问题是关于基于元素内容的元素大小,而 flex-shrink 定义相对于同一上下文中其他 flex 元素的收缩。 Source

【讨论】:

  • 好的,谢谢!现在我们需要解释一下这个魔法。
  • 这真是太神奇了。其他解决方案对我不起作用。这甚至是如何工作的。
  • 有效! @orszaczky 这背后有什么魔力?
  • 在上面的答案中添加了解释^
  • 换句话说,因为display:flex;导致min-width:auto;,那么元素不能缩小到它要求的宽度以下,因此它永远不会在自身内部产生溢出。
【解决方案2】:

你的弹性项目有

flex: 0 0 200px; /* <aside> */
flex: 1 0 auto;  /* <article> */ 

这意味着:

  • &lt;aside&gt; 将从 200px 开始。

    那么它就不会增长也不会缩小。

  • &lt;article&gt; 将从内容给定的宽度开始。

    然后,如果有可用空间,它会增长以覆盖它。

    否则它不会收缩。

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

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

为了防止垂直溢出,可以

  • 使用 min-height 而不是 height 以允许弹性项目在必要时增长更多
  • 使用overflow 与弹性项目上的可见不同
  • 使用overflow 与弹性容器上的可见性不同

例如,

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 */
}
<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>

【讨论】:

  • 如果我在&lt;article&gt; 内有&lt;table&gt; 甚至用divoverflow: auto; 包裹表格,这似乎行不通
  • 如果你正在处理许多 flex 项目溢出容器(而不是文本),你应该使用flex-wrap
  • @vee 当你有一个 来处理解决方案是添加 min-width: 0 到包含表格的 flex 子项,如 Washington Guedes 上面所解释的。
  • 它不起作用,它永远不会起作用,在多个网站上进行了测试。您的解决方案完全错误,应该删除。
  • @vee 尝试在&lt;article&gt; 上设置flex: 1 1 0; min-width: 0; - 与&lt;table&gt; 有同样的问题,它有所帮助;见dev.to/martyhimmel/…
【解决方案3】:

max-width 为我工作。

aside {
  flex: 0 1 200px;
  max-width: 200px;
}

CSS 预处理器的变量可以避免硬编码。

aside {
  $WIDTH: 200px;
  flex: 0 1 $WIDTH;
  max-width: $WIDTH;
}

overflow: hidden 也可以,但我最近尝试不使用它,因为它会将元素隐藏为弹出窗口和下拉菜单。

【讨论】:

    【解决方案4】:

    它并不适用于所有情况,因为并非所有项目都可以有一个不成比例的最大值,但是在有问题的元素/容器上拍一个好的 ol'max-width 可以让它重新排列。

    【讨论】:

      【解决方案5】:

      如果你想要溢出来换行:flex-flow: row wrap

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          一个简单的解决方案是使用overflow 以外的visible 值使文本的弹性基础宽度按预期重置。

          1. 这里的值为auto,文本按预期换行,并且文章内容不会溢出主容器。

          2. 此外,文章flex 的值必须具有auto 基础并且能够缩小,或者,只能增长并且显式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 */
          }
          <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>

          【讨论】:

          • 投反对票:麻烦解释一下?运行 snipper 会显示 OP 预期的 UI?
          • 这是正确的解决方案,以防您的内容溢出,例如带有white-space: nowrap 的图像或文本。谢谢
          【解决方案8】:

          不要使用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;
          }
          <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>

          【讨论】:

          • 澄清一下,flex: 1 就像flex: 1 1 0
          • @philfreo 不,是flex: 1 1 0。来源:w3.org/TR/css-flexbox-1/#flex-property
          • 嗯,为什么developer.mozilla.org/en-US/docs/Web/CSS/flexauto 显示为第三个参数的初始值?
          • Chrome 68 在使用 flex: 1 时显示 0% 作为默认的 flex-basis 值
          • @philfreo autoflex-basis 的初始值。如果您说flex: 1,您实际上是将该初始值覆盖为0,即使0 是隐含的。
          猜你喜欢
          • 2021-02-24
          • 1970-01-01
          • 2021-01-23
          • 2017-05-08
          • 2018-10-08
          • 2016-05-02
          • 2017-06-21
          • 2012-08-14
          相关资源
          最近更新 更多