情况:您在 flex 子元素中有一行文本。 您不希望该文本换行,而是希望将其截断并显示省略号(或回退到仅隐藏溢出)。 但最糟糕的事情发生了。 难以置信! 布局中断并迫使整个 flex 父元素也变得过宽。 Flexbox 应该帮助使布局变得更容易!
幸运的是,有一个(标准化的)解决方案。 您只需要使用非 flexbox 属性/值即可。
我们想要什么

潜在问题

这不仅可能阻止容器变窄,还可能使容器变得非常宽。
子元素(flex 子元素的)是问题所在
稍微有点混乱……如果手头的文本直接位于 flex 子元素内,则一切正常
<div class="flex-parent">
<div class="flex-child">
Text to truncate here.
</div>
<div class="flex-child">
Other stuff.
</div>
</div>
/* Text is directly within flex child,
so doing the wrapping here */
.flex-child {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
当存在子元素时,就会出现问题,例如
<div class="flex-parent">
<div class="flex-child">
<h2>Text to truncate here.</h2>
</div>
<div class="flex-child">
Other stuff.
</div>
</div>
/* Text is a header now,
so need to truncate there for it to work */
.flex-child > h2 {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
min-width: 0;
解决方案是在 flex 子元素上使用或min-width
设置为某个实际值。 没有这个,包含其他文本元素的 flex 子元素将不会缩小到这些文本元素的“隐含宽度”以下。
当我第一次遇到这个问题时,我通过AJ Foster 的一个 Pen找到了解决方案。 他写道
根据草案规范,当 flex 容器大小调整变小时,上述文本不应完全折叠。 因为 .subtitle 的宽度为 100%,所以 flexbox 进行的 min-width: auto 计算表示其容器应该比我们想要的更大。
我发现这种行为在 Chrome、Opera 和 Firefox 中是一致的。 Safari 即使没有 min-width 也会缩小/截断(我认为违反了规范)。
演示
查看 Pen 关于 flexbox 你必须知道的事情,作者 Chris Coyier (@chriscoyier) 在 CodePen 上发布。
- 有效:文本直接位于 flex 子元素内部
- 失效:文本位于 flex 子元素内的
<h2>
中 - 有效:文本位于
<h2>
中,但在 flex 子元素上设置了min-width
overflow: hidden;
似乎也可以工作,我认为这比min-width
更有意义(min-width
可能触发了flex-shrink
)。很高兴看到浏览器之间的行为现在(稍微)一致了。 这在当时确实令人沮丧。 感谢分享!
实际上,这比这要简单得多。 您不需要使用
min-width
技巧来使它工作。 您只需要对 flex 子元素及其直接子元素应用以下内容即可。您可以查看 Larry Gordon 发布的 Pen Flexbox 和截断文本(无 min-width 技巧) (@psyrendust) 在 CodePen 上发布。
我认为在一个元素上应用一个属性非常简单。 我认为您上面的示例之所以有效,是因为 overflow hidden 被应用于 flex 子元素,这也有效(如 zzzzBov 上面提到的)。
Chris,您能否提供您尝试解决的初始问题的 CodePen 示例?
一个很酷的小技巧。 我同意,设置一个规则比开始深入到子元素并添加选择器要好得多。 谢谢,Chris!
隐藏文本的工具提示在哪里?
+1 挑战要解决。
谢谢,但是什么时候有用? 是否有办法截断单词而不是文本? 例如,省略号是否出现在单词边界之后? 谢谢。
即使不使用 flex 也可以工作,我想没有必要使用 flex
min-width: 0
不是技巧,它是根据规范。 Flex 元素具有内容宽度作为隐式min-width
,以防止溢出(更多信息请访问https://bugzilla.mozilla.org/show_bug.cgi?id=1108514#c5)旧版本的 Chrome 没有遵循规范,并将 0 设置为
min-width
本文链接到并引用了规范的相关部分。 我没有说或暗示这里有任何技巧。 有趣的是,它在 Chrome 领域随着时间的推移发生了变化。
抱歉@Chris,当我说“技巧”时,我指的是@LarryGordon 的话。
文本溢出和 flexbox 的真正问题是,
display:flex
元素不支持省略号,您必须将文本包装在另一个 div 中我认为您可能错了。 演示中的 #1 本身就在 flex 子元素上使用了省略号。
@chris 我指的是这个 http://codepen.io/FezVrasta/pen/BKedgY
我经常遇到这个问题! 但我仍在努力解决。
如果 flex 子元素中有两个文本节点怎么办? 我需要这样做,但只截断第一个文本节点。 查看此 Pen 以了解我想要实现的目标:http://codepen.io/tgallimore/pen/aNqQzR
如果有人能帮助我使用 Pen 中的第二个 DOM 结构做到这一点,我将永远感激你!
我需要使用第二个 DOM 结构的原因是,我们还需要使它适用于非 flexbox 浏览器(有一些可以接受的差异)。 使用第二个 DOM 结构通过绝对定位元素并设置宽度等来做到这一点很容易。
说真的……没人能帮忙吗?
您只需在
.container2 .left-wrap
中添加display: flex;
即可。如果我理解正确,这就是您要找的。
http://codepen.io/long-lazuli/pen/YqbvaE?editors=0100
这正是我需要的,非常感谢。
我确定我之前已经尝试过类似的方法了。不过一定错过了什么。
无论如何,谢谢。
Chris,
我正在努力解决一个Flexbox的小问题。
两个子元素被拉伸,并且都用作Flexbox容器本身。第一个子元素的样式如下所示…
这是我无法理解的地方
由于容器在垂直方向上被拉伸并保持与其相邻元素相同的高度,那么当我在子元素子Flexbox中的最后一个元素上设置 `{ align-self: flex-end; }` 时,为什么它会将该元素踢到右侧(水平方向),而不是踢到拉伸的Flexbox的末端(垂直方向),当元素在列中堆叠时?
这违反逻辑。
例如:在 http://epsilonlocal.com/retro/ 上的“在Retro展位B24-25处查看我们”。
现在我正在使用填充来将该短语推到Flexbox的末端,但我认为我应该能够在Flexbox中设置它。
干杯
@Ansel:从左列中删除 align-self,然后只需在要向下推的元素上使用 margin-top:auto。
例如
margin-top:auto
将元素完全推到底部。这是一个类似的例子
http://codepen.io/paulobrien/pen/rxMPVB
谢谢奥布莱恩先生!
这解决了我的问题……但是为什么 `margin-top: auto;` 以这种方式工作?我有点困惑为什么这是解决方案。无论如何,谢谢谢谢谢谢!
干杯,
Ansel
@Ansel:是的,Flex项目上的自动边距有点秘密,它们将分配该方向上的任何可用空间。
例如,一个固定宽度和高度的Flex项目只需在所有四个边上使用自动边距即可垂直和水平居中。
https://www.w3.org/TR/css-flexbox-1/#auto-margins
Marcin Mendlik 提供了一个潜在的 IE 11 修复方案。
我在我自己的演示中使用了“0”。