玉婧媛 發表於 2026-5-3 22:16:38

flex布局子元素宽度超出父元素问题及解决方案

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">1. 第一次遇到这个问题的场景</a></li><li><a href="#_label1">2. 第二种情况</a></li><li><a href="#_label2">3. 问题原因</a></li><li><a href="#_label3">4. 解决方案</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_0">4.1 方案一</a></li><li><a href="#_lab2_3_1">4.2 方案二</a></li></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>1. 第一次遇到这个问题的场景</h2>
<p>先看效果图,大家可以看一下下面的样式,很明显左边和右边的盒子我是给的定宽,但是被挤压了<br />这个是我在项目中遇到的一个bug,使用的 flex 布局,由于我动态的修改绿色盒子的显示与隐藏,导致两边盒子的挤压</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202402/2024022015560220.png" /></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202402/2024022015560221.png" /></p>
<div class="jb51code"><pre class="brush:css;">&lt;style&gt;
.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;
}
&lt;/style&gt;
&lt;div class="container"&gt;
&lt;div class="box1"&gt;&lt;/div&gt;
&lt;div class="box2"&gt;
    &lt;div&gt;
      ...el-table
    &lt;/div&gt;
&lt;/div&gt;
&lt;div class="box3 none"&gt;&lt;/div&gt;
&lt;/div&gt;</pre></div>
<p class="maodian"><a name="_label1"></a></p><h2>2. 第二种情况</h2>
<blockquote><p>很明显,红色的盒子没有300px</p></blockquote>
<p style="text-align:center"><img alt="在这里插入图片描述" src="https://img.jbzj.com/file_images/article/202402/2024022015560222.png" /></p>
<div class="jb51code"><pre class="brush:css;">&lt;style&gt;
.container {
    display: flex;
    width: 600px;
    height: 600px;
}
.box1 {
    background-color: red;
    width: 300px;
}
.box2 {
    background-color: yellow;
    flex: 1;
}
&lt;/style&gt;
&lt;div class="container"&gt;
&lt;div class="box1"&gt;&lt;/div&gt;
&lt;div class="box2"&gt;Loremipsumdolorsitametconsecteturadipisicingelit.Quasi,eveniet?&lt;/div&gt;
&lt;/div&gt;</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>3. 问题原因</h2>
<ul><li>首先了解一下&nbsp;<code>flex: n;</code>&nbsp;的定义,当使用单值语法的时候,可以理解为就是设置了&nbsp;<code>flex: n 1 0;</code>&nbsp;对应的&nbsp;<code>flex-grow: n; flex-shrink: 1; flex-basis: 0;</code>,这里我们只探究&nbsp;<code>flex-grow: n;</code></li><li>flex-grow:规定了项在 flex 容器中分配剩余空间的相对比例,这里的剩余空间指的是除内容之外的空间</li><li>而上面两种情况:<ul><li>情况一:由于&nbsp;<code>flex-grow</code>&nbsp;只能使当前元素生效,而子元素的宽度也就是当前元素的内容,在 el-table 中第一次读取宽度后,会给子元素设置固定宽度,进而导致没有剩余空间,也就是当内容空间大于剩余空间时&nbsp;<code>flex-grow: n;</code>&nbsp;就已经失效了</li><li>情况二:内容的长单词没有空格,可能在解析的时候当做一个字符,所以内容的长度就是整个字符的实际长度,同样也导致了&nbsp;<code>flex-grow: n;</code>&nbsp;的失效</li></ul></li></ul>
<p class="maodian"><a name="_label3"></a></p><h2>4. 解决方案</h2>
<p class="maodian"><a name="_lab2_3_0"></a></p><h3>4.1 方案一</h3>
<ul><li>内容盒设置&nbsp;<code>width: 0;</code>,侧边栏正常,但是内容盒的内容会溢出,这种情况看怎么处理内容部分</li><li>因为侧边栏的宽度一般都是固定的,这种处理方案虽然会有一定的取舍,但是会比原先好一些</li></ul>
<p class="maodian"><a name="_lab2_3_1"></a></p><h3>4.2 方案二</h3>
<ul><li>给内容盒设置&nbsp;<code>overflow-y: auto;</code>&nbsp;,这样侧边栏正常,内容盒会出现横向滚动条</li></ul>
頁: [1]
查看完整版本: flex布局子元素宽度超出父元素问题及解决方案