VueJS+ElementUI el-table嵌套div后无法收缩的响应式问题
问题
想把两个ElementUI的el-table并排展示,最初直接把表格放进flex布局的div里,代码如下:
<div> <el-table /> <el-table /> </div>
容器CSS:
display: flex; flex-direction: row; gap: 30px;
这种方式运行正常,表格能随视口伸缩。
后来要给每个表格加标题,就把每个表格嵌套进垂直flex布局的innerContainer里,模板代码:
<div class="outerContainer"> <div class="innerContainer"> <div>Title Left</div> <el-table /> </div> <div class="innerContainer"> <div>Title Right</div> <el-table /> </div> </div>
对应的CSS:
.outerContainer { width: 100%; display: flex; flex-direction: row; gap: 30px; } .innerContainer{ width: 100%; display: flex; flex-direction: column; gap: 10px; }
现在的问题是:扩大视口宽度时表格能正常展开,但缩小视口宽度时,表格没法跟着收缩,直接溢出视口。为什么嵌套div会破坏el-table的响应性?
原因与解决办法
核心原因
- innerContainer的宽度设置冲突:你给
innerContainer设了width: 100%,在flex行布局的outerContainer里,这个100%会让每个innerContainer尝试占满父容器的可用宽度。当视口缩小,两个innerContainer加gap的总宽度超过outerContainer时,虽然innerContainer会被flex-shrink挤压,但它内部的el-table是垂直flex布局的子项,默认flex-shrink: 0——也就是不会自动收缩,一旦table自身的最小宽度(由列宽总和决定)超过innerContainer被挤压后的宽度,就会溢出。 - 直接放table时的差异:之前直接把table作为flex子项,table本身会继承flex布局的
flex-shrink: 1属性,视口缩小时会跟着收缩;嵌套后这个收缩逻辑被innerContainer打断,table的收缩规则不再生效。
解决办法
有两种常用的修正方式:
- 调整innerContainer的flex属性:把
innerContainer的width: 100%改成flex: 1 1 0%,这样它会自动分配outerContainer的可用空间,并且能随视口收缩:.innerContainer{ flex: 1 1 0%; display: flex; flex-direction: column; gap: 10px; } - 给table添加收缩限制:给
el-table设置width: 100%; min-width: 0;,让table可以突破自身列宽的最小限制,跟着innerContainer收缩;如果不想让表格列被挤压变形,也可以给innerContainer加overflow-x: auto,让表格在宽度不够时出现横向滚动条:.innerContainer{ width: 100%; display: flex; flex-direction: column; gap: 10px; overflow-x: auto; } .innerContainer el-table { width: 100%; min-width: 0; }
内容的提问来源于stack exchange,提问作者McMuellermilch
相关产品推荐
相关产品推荐

