解密Flex布局:为什么flex:1仍会导致内容溢出

前言

今天在解决别的bug时发现了个很奇怪的东西,我的容器明明设置了flex:1为什么还会导致内容溢出,导致比我设想的flex:1尺寸来得大。

后来才知道

浏览器默认为flex容器的子元素设置了 min-width: auto;min-height: auto,这意味着子元素的最小宽度和高度不能小于其内容的宽度和高度。

这就是为什么明明是flex:1,但是为什么比预想的要大了。

正文

单单文字说明还是难以理解,来看图和代码吧

有问题的代码,父元素设置100vw,子元素设置flex:1;

tsx 复制代码
function App() {
  return (
    <div
      style={{
        display: "flex",
        height: "100vh",
        width: "100vw",
        gap: "10px",
      }}
    >
      <div
        style={{
          width: "200px",
          textAlign: "left",
          backgroundColor: "red",
        }}
      >
        Left
      </div>
      <div
        style={{
          flex: 1,
          textAlign: "left",
          backgroundColor: "blue",
        }}
      >
        <section
          style={{
            height: "100%",
            width: "100%",
            overflow: "auto",
            backgroundColor: "lightcyan",
          }}
        >
          <div>
            <div>asdasd</div>
            <div>
              asdasdasdasdasdsadsadasdsadasdiuoasdgiasgdfasghdiopasdyiuskafdgiuashdasgvdsadpjnasildgsaodiasoudgasiugdasyfdgasudiyfasdhoiashdgiouasgdiu
            </div>
            <div>asdasd</div>
          </div>
        </section>
      </div>
    </div>
  );
}

预计是滚动条只在右边区域,总页面没有滚动条。但是实际的总页面有滚动条,右边区域没有滚动条。这就是 浏览器默认为flex容器的子元素设置了 min-width: auto;min-height: auto,这意味着子元素的最小宽度和高度不能小于其内容的宽度和高度,把右侧的内容撑大了,导致内容溢出了。

如何解决呢

  1. 设置 overflow,利用BFC
  2. 设置 min-width: 0

任意使用一种都可以,是我们预计的情况了。

修改后代码

tsx 复制代码
function App() {
  return (
    <div
      style={{
        display: "flex",
        height: "100vh",
        width: "100vw",
        gap: "10px",
      }}
    >
      <div
        style={{
          width: "200px",
          textAlign: "left",
          backgroundColor: "red",
        }}
      >
        Left
      </div>
      <div
        style={{
          flex: 1,
          textAlign: "left",
          backgroundColor: "blue",
          minWidth: 0, //关键
        }}
      >
        <section
          style={{
            height: "100%",
            width: "100%",
            overflow: "auto",
            backgroundColor: "lightcyan",
          }}
        >
          <div>
            <div>asdasd</div>
            <div>
              asdasdasdasdasdsadsadasdsadasdiuoasdgiasgdfasghdiopasdyiuskafdgiuashdasgvdsadpjnasildgsaodiasoudgasiugdasyfdgasudiyfasdhoiashdgiouasgdiu
            </div>
            <div>asdasd</div>
          </div>
        </section>
      </div>
    </div>
  );
}

结语

有兴趣的可以去试试

相关推荐
kyriewen5 小时前
一个看不见的撇号,让Claude Code追踪了中国开发者三个月
前端·ai编程·claude
莫生灬灬5 小时前
DY联系人聊天Web面板支持获取联系人/聊天记录/发送消息
前端·chrome·websocket·c#
郑州光合科技余经理5 小时前
海外外卖平台源码改造实战——多语言核心代码实现
java·开发语言·前端·后端·mysql·架构·php
一tiao咸鱼6 小时前
前端转 agent # 02 - FastAPI 框架入门与原理
前端·python
wanghowie6 小时前
LangGraph4j 落地(二)— ReAct 多步工具与 trace 扩展
前端·react.js·前端框架
大家的林语冰6 小时前
Rust 再次打败 Go,Astro 7 首发,什么叫“万物皆可锈化“!
前端·javascript·性能优化
lichenyang4536 小时前
H5 如何调用 ArkTS:JavaScriptProxy、requestId 和 Promise 回调
前端
lichenyang4536 小时前
我在 HarmonyOS 上写了一个轻量级小程序运行时:从 Web 容器到 JSBridge
前端
雪隐6 小时前
用Flutter做背单词APP-02我画了设计稿,然后让AI帮我设计了数据库(顺便聊了会天)
前端·人工智能·后端
lichenyang4536 小时前
不要把 JSBridge 写成 if else:Dispatcher、Registry 和 Biz/Imp 分层
前端