flex布局下文本截断省略失效问题

1,148 阅读3分钟

场景

在使用flex布局,左右布局下,希望右侧宽度自适应,并且右边的文本不换行,需要使用省略号进行截断。

1. 正常情况

代码如下:

html布局:

<div class="flex">
    <div class="left">左边</div>
    <div class="right ellipsis">
        右边 这是一段非常长的文字,我看看这个到底时怎么显示这是一段非常长的文字,我看看这个到底时怎么显示
    </div>
</div>

css样式:

.flex {
    width: 100%;
    display: flex;
    align-items: center;
    justify-content: space-between;
}

.left {
    width: 100px;
    flex-shrink: 0;
    border-right: 1px solid red;
}

.right {
    flex-grow: 1;
}

.ellipsis {
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
}

这个时候是正常情况。

ezgif-3-90cb4c7e04.gif

2. 失效情况

如果右侧中元素中添加了子元素,

代码如下所示:

html:

<div class="flex">
    <div class="left">左边</div>
    <div class="right">
        <div class="ellipsis">
            右边 这是一段非常长的文字,我看看这个到底时怎么显示这是一段非常长的文字,我看看这个到底时怎么显示
        </div>
    </div>
</div>

会出现文本省略不生效情况。

失效.gif

原因是:

在flex布局中,容器(.flex)的子元素(.left 和 .right)会根据容器的display: flex;属性来分配空间。flex-growflex-shrink 和 flex-basis属性决定子元素如何增长、缩小以及它们的基础大小。

  • .left 元素不会缩小,始终是100px的宽度。
  • .right 元素设置了 flex-grow: 1;,将占据除了 .left 元素之外的所有可用空间。

然而,对于 .right 元素内部的 .ellipsis 元素,虽然设置文本省略,但这些样式只有在 .ellipsis 元素有一个明确且受限的宽度时才会生效。

在flex布局中,.ellipsis 元素默认会尝试占据其父元素(.right)的全部宽度,因为它没有设置 width 或 max-width 属性来限制自己。

.ellipsis 元素实际上没有受到任何宽度限制,因此,.ellipsis 元素中的文本会尝试在一行内完全显示,而不会触发省略号效果。

3. 解决方案

那么如何解决这个问题,不需要为 .ellipsis 元素显式设置宽度,因为 .right 元素已经通过Flex布局的动态空间分配机制获得了宽度。

需要确保 .right 元素(作为 .ellipsis 元素的直接父元素)不会溢出其外部容器的宽度,并且 .ellipsis 元素内部的文本在超出 .right 元素的宽度时能够被正确截断并显示省略号。

下面介绍两种方式: 都是作用于.right元素

3.1 设置min-width:0

设置min-width: 0;允许flex项目在必要时缩小其宽度,从而避免因为内容宽度过大而撑破父容器。

css设置:

.right {
    flex-grow: 1;
    min-width: 0;
}

3.2 overflow:hidden

overflow: hidden;应用于其父元素(如.right),以确保整个flex项目的宽度被正确限制,并且文本省略效果能够生效。

css设置:

.right {
    flex-grow: 1;
    overflow: hidden; 
}

在项目中我们也可以这样写,将父子元素都设置为文本省略:

.right {
    flex-grow: 1;
    overflow: hidden; 
    &, & > * {
        overflow: hidden;
        white-space: nowrap;
        text-overflow: ellipsis;
    }
}

总结

最后总结一波,当我们在使用flex布局时,遇到文本省略失效的问题。

解决方式如下:

  1. flex子元素设置min-width:0
  2. flex子元素设置overflow:hidden

希望对大家有一点用处,如有错误,请指正O^O!