关于 flex 布局时,子元素宽度超出父元素问题及解决方案(问题)

1. 第一次遇到这个问题的场景

先看效果图,大家可以看一下下面的样式,很明显左边和右边的盒子我是给的定宽,但是被挤压了
这个是我在项目中遇到的一个bug,使用的 flex 布局,由于我动态的修改绿色盒子的显示与隐藏,导致两边盒子的挤压

<style>
.container {
  width: 1400px;
  display: flex;
  height: 100vh;
}

.box1 {
  background-color: red;
  width: 300px;
}

.box2 {
  background-color: yellow;
  flex: 1;
}

.box3 {
  background-color: green;
  width: 400px;
}
</style>

<div class="container">
  <div class="box1"></div>
  <div class="box2">
    <div>
      ...el-table
    </div>
  </div>
  <div class="box3 none"></div>
</div>

2. 第二种情况

很明显,红色的盒子没有300px

在这里插入图片描述

<style>
  .container {
    display: flex;
    width: 600px;
    height: 600px;
  }

  .box1 {
    background-color: red;
    width: 300px;
  }

  .box2 {
    background-color: yellow;
    flex: 1;
  }
</style>

<div class="container">
  <div class="box1"></div>
  <div class="box2">Loremipsumdolorsitametconsecteturadipisicingelit.Quasi,eveniet?</div>
</div>

3. 问题原因

  • 首先了解一下 flex: n; 的定义,当使用单值语法的时候,可以理解为就是设置了 flex: n 1 0; 对应的 flex-grow: n; flex-shrink: 1; flex-basis: 0;,这里我们只探究 flex-grow: n;
  • flex-grow:规定了项在 flex 容器中分配剩余空间的相对比例,这里的剩余空间指的是除内容之外的空间
  • 而上面两种情况:
    • 情况一:由于 flex-grow 只能使当前元素生效,而子元素的宽度也就是当前元素的内容,在 el-table 中第一次读取宽度后,会给子元素设置固定宽度,进而导致没有剩余空间,也就是当内容空间大于剩余空间时 flex-grow: n; 就已经失效了
    • 情况二:内容的长单词没有空格,可能在解析的时候当做一个字符,所以内容的长度就是整个字符的实际长度,同样也导致了 flex-grow: n; 的失效

注:这里其实不算是 flex-grow: n 失效,之前没有仔细看文档,可以理解为这里中间元素的宽度强行被'子元素'给固定了,只能去压缩侧边内容(因为侧边内容的 flex-shrink 初始值是 1),是允许被压缩的

4. 解决方案

4.1 方案一
  • 内容盒设置 width: 0;,侧边栏正常,但是内容盒的内容会溢出,这种情况看怎么处理内容部分
  • 因为侧边栏的宽度一般都是固定的,这种处理方案虽然会有一定的取舍,但是会比原先好一些
4.2 方案二
  • 给内容盒设置 overflow-y: auto; ,这样侧边栏正常,内容盒会出现横向滚动条
4.3 方案三
  • 给侧边元素设置 flex-shrink: 0(不允许侧边栏收缩),因为元素的初始值是 1,是允许收缩
  • 这种也不是很建议,子元素会超出父元素
  • 26
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值