最近遇到 flex 子元素超出父元素的宽度,本想着复制粘贴就算了,但蛮多次遇到在 flex 元素内定义 width 的场景了,这回就不躺平了吧~

场景一:文本超出省略

很常见的业务场景,比如一段图文描述中,标题做超长处理

超长时,可能会出现

<style>
.flex-box {
margin: 100px auto;
width: 200px;
display: flex;
border: 1px solid red;
column-gap: 10px;
background: #7c4dff;
}

.flex-container {
display: flex;
column-gap: 10px;
background: #0a9caf;
color: #fff;
}

.flex-ellipsis {
width: 100%;
white-space: nowrap;
text-overflow: ellipsis;
word-wrap: break-word;
word-break: break-all;
overflow: hidden;
}
</style>

<div class="flex-box">
<div style="white-space: nowrap;">avatar</div>

<div class="flex-container">
<div style="flex-shrink: 0">描述 </div>
<div class="flex-ellipsis">这是一段长描述 这是一段长描述 </div>
</div>
</div>

这里看出 flex-container 宽度超过了 flex-box,如何解决也很简单,看看网上给的方案:

  .flex-container {
+ flex: 1;
+ width: 0;
// 或者
+ min-width: 0;
+ overflow: hidden;
}

flex: 1; 时 width 的作用?

flex: 1; => flex:1 1 auto => flex-grow: 1; flex-shrink: 1; flex-basis: auto;
看下 MDNflex-grow 的对剩余空间的解释

再看 flex-basis: auto

结论

如果 flex 元素没有设置尺寸(width、min-width …)时,flex 元素的内容尺寸超过平均分配的剩余空间时,则此时的宽度即为内容尺寸(当前元素大小 = max-content)。如果设置了尺寸并且尺寸小于可用的平均分配的剩余空间时,则元素尺寸为该空间大小。
当 flex: 1; 时,相当于 剩余空间大小 = 父元素(容器)的宽度
则 剩余空间的大小 = 父元素的宽度 / 元素的个数
即 直接设置 width: 0 可以保证元素宽度平方父元素的宽度

https://segmentfault.com/q/1010000014919583
https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex