Flex 布局下文字省略不生效?原因其实很简单

概述

在开发中,我们常遇到这种布局:A、B、C 三段文本长度不固定,其中 A、C 占用空间较少,需要完整显示;而 B 是自适应区域,超出部分需省略显示。A 与 B 共享同一容器,右侧的 "Live" 按钮与该容器同级,容器应占据除 "Live" 之外的所有剩余空间。

HTML 结构如下:

html 复制代码
<div class="wrap">
  <div class="infos">
    <div>Soccer</div>
    <div class="self">Campeonato De Reserva De Primera Division C</div>
  </div>
  <div class="live">Live</div>
</div>

如果按照常规思路编写 CSS,比如:

css 复制代码
.wrap {
  display: flex;
  align-items: center;
  width: 350px;
  border: 1px dashed #ccc;
  padding: 4px 16px;
  gap: 16px;
}

.infos {
  flex: 1;
  display: flex;
  gap: 8px;
  align-items: center;
}

.self {
  flex: 1;
  padding: 4px;
  background-color: silver;
  border-radius: 6px;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}

.live {
  padding: 4px 16px;
  background: cornflowerblue;
  border-radius: 6px;
  color: white;
  flex-shrink: 0;
}

渲染效果往往会出现问题,示例如下:

可以看到,.self 会被内容撑开,导致 "Live" 被挤出容器。

异常分析

出现这种情况的根本原因是:

在 Flex 布局中,每个子元素的默认 min-width 是 auto。这意味着子元素的内容(文本)不会被压缩,即使父容器空间不足。

只有显式将 min-width 设为 0,才能让子项在空间受限时被压缩,从而使 overflow: hidden 与 text-overflow: ellipsis 生效。

更关键的是:

如果布局中存在嵌套的 flex 容器,那么 所有中间层的容器 也需要显式设置 min-width: 0,否则内部文本依然不会被压缩。

本例结构如下:

scss 复制代码
.wrap (display: flex)
  ├── .infos (display: flex)
  │     ├── div (Soccer)
  │     └── .self (文字太长)
  └── .live

.infos 是 .wrap 的 flex 子项,默认 min-width: auto,会阻止内部 .self 被压缩。

因此,.infos 和 .self 都必须加上 min-width: 0。

实现

html 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Flex 布局下文字省略不生效?原因其实很简单</title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }
      body {
        width: 100vw;
        height: 100vh;
        display: flex;
        justify-content: center;
        align-items: center;
      }
      .wrap {
        display: flex;
        align-items: center;
        width: 350px;
        border: 1px dashed #ccc;
        padding: 4px 16px;
        gap: 16px;
      }

      .infos {
        flex: 1;
        display: flex;
        gap: 8px;
        align-items: center;
        min-width: 0; /* ✅ 必加,让内部 .self 可以被压缩 */
      }

      .self {
        flex: 1;
        min-width: 0; /* ✅ 必加,否则 ellipsis 不生效 */
        padding: 4px;
        background-color: silver;
        border-radius: 6px;
        overflow: hidden;
        white-space: nowrap;
        text-overflow: ellipsis;
      }

      .live {
        padding: 4px 16px;
        background: cornflowerblue;
        border-radius: 6px;
        color: white;
        flex-shrink: 0;
      }
    </style>
  </head>
  <body>
    <div class="wrap">
      <div class="infos">
        <div>Soccer</div>
        <div class="self">Campeonato De Reserva De Primera Division C</div>
      </div>
      <div class="live">Live</div>
    </div>
  </body>
</html>

总结

层级 是否需要 min-width: 0 原因
.wrap ❌ 最外层容器,不需要压缩
.infos ✅ 它是 .wrap 的 flex 子项,需要允许内部压缩
.self ✅ 它是 .infos 的 flex 子项,真正要被省略的元素

结论:在嵌套的 Flex 布局中,任何包裹文字的中间层都必须显式设置 min-width: 0,否则 text-overflow: ellipsis 永远不会生效。

相关推荐
默_笙28 分钟前
🚥 给 RAG 装一台心电监护仪:LangSmith 全链路观测(上)
前端·javascript
前端snow1 小时前
ai agent --- mem0 外挂记忆系统
前端
特立独行的猫a2 小时前
用仓颉写一个 Tauri:IPC 的每次往返实现原理(web层到仓颉层的触发过程)
前端·ui·harmonyos·tauri·鸿蒙·仓颉
Dovis(誓平步青云)2 小时前
多个链接不等于多份证据,新闻核验看板怎样合并来源
java·服务器·前端·javascript·人工智能·pdf·电脑
骑着蜗牛撵大象3273 小时前
Qt 事件机制详解:从 QEvent 派生类到事件过滤器的全景指南
前端·python
qq_2518364573 小时前
理发管理系统 —— 会员模块
开发语言·前端·python·flask
Frag0ut3 小时前
2027 年浏览器展望:Chrome 与 Edge 的 AI 智能体进化方向
前端·人工智能·chrome·edge·浏览器·新功能
计算机魔术师4 小时前
从AI绘图鼻祖到音乐版权破局者,Stability AI如何被三大唱片巨头「收编」
前端
奕鼎竜瑆4 小时前
Chrome 插件开发实战指南:从入门到发布
前端·chrome
广州华水科技4 小时前
水库北斗GNSS变形监测系统及单北斗形变监测一体机应用解析
前端