为什么我的el-table宽度无法自适应?

前言

最近在开发一个表格需求,用的是element-ui的el-table组件,开发好了才发现,我的el-table组件宽度无法自适应,一直都是固定的大小。

模拟代码:

html 复制代码
    <div class="table-box">
      <div>我是侧边栏1</div>
      <div>我是侧边栏2</div>
      <div>
        <el-table :data="tableData" border>
        </el-table>
      </div>
    </div>

屏幕拉升前:

屏幕拉升后:

难道el-table的宽度没有自适应? 带着疑问🤔️,我去看了element-ui的demo,它们是可以宽度自适应的。

屏幕拉升前:

屏幕拉升后:

那到底是哪里影响了?

正文

仔细对比两边的样式区别后,最后发现是我设置了flex布局,flex布局影响了。

如果把我的flex布局去掉,el-table是可以自适应的。

那为什么flex布局会影响到el-table的宽度自适应?

我们去看看el-table的源码,看看它是怎么做自适应的。

js 复制代码
 // table.vue 
if (this.fit) {
  addResizeListener(this.$el, this.resizeListener);
}
// resize-event.js
import ResizeObserver from 'resize-observer-polyfill';
export const addResizeListener = function(element, fn) {
  if (isServer) return;
  if (!element.__resizeListeners__) {
    element.__resizeListeners__ = [];
    element.__ro__ = new ResizeObserver(resizeHandler);
    element.__ro__.observe(element);
  }
  element.__resizeListeners__.push(fn);
};

通过源码可以看到,el-table是使用了resize-observer-polyfill这个库来监听el元素(**div.el-table**),当el元素宽度变化时,el-table会重新布局,实现宽度自适应。

resize-observer-polyfill内部是使用了ResizeObserver这个api实现的。

所以核心是监听$el元素的宽度变化。

我们的结构是这样的:

html 复制代码
    <div class="table-box">
      <div>我是侧边栏1</div>
      <div>我是侧边栏2</div>
      <div>
        <el-table :data="tableData" border>
        </el-table>
      </div>
    </div>

在flex布局中,如果祖先元素(.table-box)没有设置宽度,el-table的上一级div元素会被el-table的宽度撑开,如果此时el-table的宽度大于祖先元素,就会造成el-table宽度无法自适应。

所以问题的关键是怎么让div不继承el-table的宽度。

解决方案

设置overflow:auto

给el-table的上一级div元素设置overflow:auto。这样它可以继承祖先元素的宽度,然后el-table就算超出,也会有滚动条,达到自适应。

设置position:absolute和width:100%

el-table元素上级再加一个div,设置position:absolutewidth:100%。它的上级设置position:relativewidth:100%,相对它定位,这样可以继承祖先的宽度。

祖先元素设置固定宽度

如果祖先元素设置了固定宽度,这样子元素都会继承祖先元素的宽度,el-table元素就可以自适应了。

总结

如果大家遇到flex布局下,el-table宽度无法自适应,可以试试这几种解决方案。大家可以根据自己的需求选择。我推荐第一种,它比较灵活,代码也不多,兼容性好。

相关推荐
徐小夕17 分钟前
JitWord Office预览引擎:如何用Vue3+Node.js打造丝滑的PDF/Excel/PPT嵌入方案
前端·vue.js·github
晴殇i26 分钟前
揭秘JavaScript中那些“不冒泡”的DOM事件
前端·javascript·面试
孟陬1 小时前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端
BER_c1 小时前
前端权限校验最佳实践:一个健壮的柯里化工具函数
前端·javascript
兆子龙1 小时前
别再用 useState / data 管 Tabs 的 activeKey 了:和 URL 绑定才香
前端·架构
sudo_jin1 小时前
前端包管理器演进史:为什么 npm 之后,Yarn 和 pnpm 成了新宠?
前端·npm
敲敲敲敲暴你脑袋1 小时前
写个添加注释的vscode插件
javascript·typescript·visual studio code
叁两2 小时前
用opencode打造全自动公众号写作流水线,AI 代笔太香了!
前端·人工智能·agent
golang学习记2 小时前
GitLens 十大神技:彻底改变你在 VS Code 中的 Git 工作流
前端·后端·visual studio code
SuperEugene2 小时前
后台权限与菜单渲染:基于路由和后端返回的几种实现方式
前端·javascript·vue.js