Element Plus中el-table暂无数据的显示效果(大部分顶部居中,少部分垂直居中)

1、暂无数据顶部居中显示(项目中大部分都是这样)

表格属性没有设置 height

        <el-main class="main-main">
          <el-table
            :data="rkDetail"
            v-loading="isLoading"
            :border="false"
            highlight-current-row
            stripe
            style="width: 100%; height: 100%"
            @row-click="onTableRowClick">

2、暂无数据垂直居中显示(项目中少部分是这样) 

表格属性设置了 height

<template>
  <div class="table-container">
    <el-table
      ref="tableRef"
      :data="store.substancePageList"
      v-loading="store.isLoading"
      :border="isBorder"
      highlight-current-row
      :row-class-name="setRowClassName"
      height="100%"
      @header-dragend="setTableColumnWidth?.saveColumnWidth">

太棒了!您找到了问题的核心原因。在 Element Plus 的 el-table 中设置 height="100%" 确实会导致"暂无数据"提示垂直居中显示,这是组件设计的预期行为。让我详细解释这个现象并提供解决方案:

原因解析

当设置 height="100%" 时:

  1. 表格会创建一个固定高度的容器

  2. 空状态容器 .el-table__empty-block 会继承这个高度

  3. 由于容器有确定高度,Flex 布局的 align-items: center 会生效

  4. 结果就是提示内容垂直居中显示

解决方案

方案 1:移除 height 属性(推荐)

vue

复制

下载

<!-- 移除 height="100%" 属性 -->
<el-table :data="tableData">
  <!-- 列定义 -->
</el-table>
方案 2:使用 CSS 覆盖(保持 100% 高度)

vue

复制

下载

<template>
  <el-table :data="tableData" height="100%" class="custom-empty-align">
    <!-- 列定义 -->
  </el-table>
</template>

<style scoped>
.custom-empty-align :deep(.el-table__empty-block) {
  align-items: flex-start !important; /* 顶部对齐 */
  padding-top: 16px; /* 添加顶部内边距 */
}
</style>
方案 3:动态高度控制

vue

复制

下载

<script setup>
import { ref, computed } from 'vue'

const tableData = ref([])
const hasData = computed(() => tableData.value.length > 0)

// 只有有数据时才设置高度
const tableHeight = computed(() => hasData.value ? '100%' : 'auto')
</script>

<template>
  <el-table :data="tableData" :height="tableHeight">
    <!-- 列定义 -->
  </el-table>
</template>

设计原理

Element Plus 这样设计是因为:

  1. 有高度限制的表格:需要视觉平衡 → 居中显示

  2. 无高度限制的表格:更紧凑 → 顶部显示

实际应用建议

  1. 大多数情况:不需要设置 height="100%"

    vue

    复制

    下载

    <!-- 默认行为即可 -->
    <el-table :data="tableData">
      <!-- 列定义 -->
    </el-table>
  2. 需要固定高度时:添加自定义样式

    vue

    复制

    下载

    <el-table 
      :data="tableData" 
      height="400px" 
      class="empty-top"
    >
    </el-table>
    
    <style scoped>
    .empty-top :deep(.el-table__empty-block) {
      align-items: flex-start;
      padding-top: 20px;
    }
    </style>
  3. 响应式设计

    vue

    复制

    下载

    <el-table :data="tableData" style="height: 100vh">
      <template #empty>
        <div class="custom-empty-content">
          没有数据
        </div>
      </template>
    </el-table>
    
    <style>
    .custom-empty-content {
      padding-top: 10%; /* 相对顶部位置 */
    }
    </style>

最佳实践总结

场景推荐方案效果
普通表格不设置高度顶部显示
需要固定高度的表格自定义空状态样式顶部显示
全屏表格使用插槽自定义位置可控显示
动态高度表格条件设置高度智能适应

您发现的高度设置导致居中问题确实是 Element Plus 表格组件的关键设计特点。根据实际需求选择上述解决方案,可以完美控制空状态的显示位置。

在 Vue3 + Element Plus 的 el-table 组件中,"暂无数据"提示默认垂直居中的原因是由组件的内部样式设计决定的。以下是详细解释和自定义方法:

原因分析

  1. 布局结构

    • 空状态容器使用 Flex 布局:display: flex

    • 设置了垂直居中属性:align-items: center

    • 设置了水平居中属性:justify-content: center

  2. 关键样式(Element Plus 源码节选):

    css

    复制

    下载

    .el-table__empty-block {
      min-height: 60px;
      width: 100%;
      display: flex;          /* Flex 布局 */
      justify-content: center; /* 水平居中 */
      align-items: center;     /* 垂直居中 */
    }

自定义位置方案

方法 1:覆盖默认样式(推荐)

vue

复制

下载

<template>
  <el-table :data="[]" class="custom-empty-table">
    <!-- 列定义 -->
  </el-table>
</template>

<style scoped>
/* 使用深度选择器覆盖样式 */
:deep(.custom-empty-table .el-table__empty-block) {
  align-items: flex-start !important; /* 顶部对齐 */
  padding-top: 20px; /* 增加顶部间距 */
}
</style>
方法 2:使用 empty 插槽完全自定义

vue

复制

下载

<template>
  <el-table :data="[]">
    <!-- 列定义 -->
    
    <template #empty>
      <div class="custom-empty">
        <img src="empty-state.png" />
        <p>没有找到数据哦~</p>
      </div>
    </template>
  </el-table>
</template>

<style>
.custom-empty {
  padding: 40px 0; /* 自定义间距 */
  text-align: left; /* 左对齐 */
}
</style>

为什么这样设计?

Element Plus 默认采用居中设计主要基于:

  1. 视觉平衡:在空白区域中居中显示提示更符合视觉美学

  2. 一致性:与多数数据表格的设计规范保持一致

  3. 响应式:在不同屏幕尺寸下保持提示位置稳定

其他注意事项

  1. 使用 !important 覆盖时需要确保选择器优先级足够

  2. 使用插槽方案时,自定义内容完全由开发者控制样式

  3. 可通过修改 min-height 调整空状态容器高度:

    css

    复制

    下载

    :deep(.el-table__empty-block) {
      min-height: 120px !important;
    }

建议优先使用 empty 插槽方案,既能完全自定义样式,又避免样式覆盖冲突问题。

在 Vue3 + Element Plus 项目中,大部分 el-table 的"暂无数据"提示在顶部显示而不是垂直居中,这通常是由以下原因造成的:

可能的原因分析

  1. 表格高度限制

    • 当表格容器没有固定高度高度不足时,空状态提示会显示在顶部

    • 示例代码:

      vue

      复制

      下载

      <el-table :data="[]" style="height: 200px"> <!-- 固定高度会居中 -->
      <el-table :data="[]"> <!-- 无固定高度会顶部对齐 -->
  2. 父容器布局影响

    • 如果表格放在 Flex/Grid 布局容器中,且设置了 align-items: flex-start,会覆盖默认居中

    • 示例:

      css

      复制

      下载

      .parent-container {
        display: flex;
        align-items: flex-start; /* 导致表格内容顶部对齐 */
      }
  3. 全局样式覆盖

    • 项目中可能有全局样式影响了 Element Plus 默认样式:

      css

      复制

      下载

      /* 可能存在的全局覆盖 */
      .el-table__empty-block {
        align-items: flex-start !important;
      }
  4. CSS 继承链影响

    • 某些父容器的 line-height 或 vertical-align 属性可能意外影响了表格布局

诊断步骤

  1. 检查表格高度

    javascript

    复制

    下载

    // 在控制台检查空表格
    document.querySelector('.el-table__empty-block').parentElement.clientHeight
    • 如果高度 ≤ 60px(Element 默认最小高度),内容会顶部对齐

  2. 检查父容器样式

    javascript

    复制

    下载

    // 检查所有父元素的 display 和 align-items
    const parents = [];
    let el = document.querySelector('.el-table');
    while(el) {
      parents.push(window.getComputedStyle(el));
      el = el.parentElement;
    }
    console.table(parents.map(s => ({display: s.display, alignItems: s.alignItems})));
  3. 特异性权重检查

    • 使用浏览器开发者工具检查 .el-table__empty-block 的样式

    • 查看哪些样式被覆盖(带删除线)和生效的样式

解决方案建议

如果希望保持当前行为(大部分顶部显示):

css

复制

下载

/* 全局保持顶部对齐 */
.el-table__empty-block {
  align-items: flex-start !important;
  padding-top: 12px; /* 添加顶部间距 */
}

如果希望特定表格垂直居中:

vue

复制

下载

<template>
  <el-table :data="[]" class="center-empty">
    <!-- 列定义 -->
  </el-table>
</template>

<style scoped>
.center-empty :deep(.el-table__empty-block) {
  align-items: center !important;
  min-height: 200px; /* 确保有足够空间 */
}
</style>

为什么会出现这种不一致?

Element Plus 的设计中:

  • 小高度表格:空状态顶部对齐(避免大留白)

  • 大高度表格:垂直居中(视觉平衡)

这种自适应行为可能导致:

  1. 数据表格高度不同造成视觉差异

  2. 项目布局系统意外影响了默认行为

  3. 全局样式部分覆盖了 Element 默认样式

建议保持当前行为,除非有特殊设计需求。这种顶部对齐在实际项目中通常更符合用户预期,因为:

  1. 减少不必要的垂直滚动

  2. 更快定位到提示信息

  3. 与表格标题形成更好的视觉连贯性

el-table__empty-block 的样式确实设置了 align-items: center 和 justify-content: center,但实际显示却在顶部。这种看似矛盾的情况通常有以下几种解释:

可能的原因及解决方案

1. 父容器高度不足(最常见原因)
  • 现象:当表格容器高度小于空状态最小高度(60px)时,内容会"视觉上"在顶部

  • 诊断

    javascript

    复制

    下载

    // 在浏览器控制台检查
    const emptyBlock = document.querySelector('.el-table__empty-block')
    console.log('容器高度:', emptyBlock.parentElement.clientHeight)
    console.log('最小高度:', emptyBlock.style.minHeight || '60px(default)')
  • 解决方案

    css

    复制

    下载

    /* 确保容器有足够高度 */
    .el-table {
      min-height: 100px; /* 大于60px */
    }
2. CSS 变换(transform)干扰
  • 现象:父元素上的 transform 属性可能创建新的层叠上下文

  • 检查

    javascript

    复制

    下载

    // 检查所有父元素
    let el = emptyBlock;
    while(el.parentElement) {
      el = el.parentElement
      if(getComputedStyle(el).transform !== 'none') {
        console.warn('Transform found on:', el)
      }
    }
  • 修复

    css

    复制

    下载

    .parent-element {
      transform: none !important; /* 临时测试 */
    }
3. 表格滚动区域异常
  • 现象.el-table__body-wrapper 可能有隐藏的滚动条占据空间

  • 诊断

    css

    复制

    下载

    /* 检查滚动容器 */
    .el-table__body-wrapper {
      overflow: hidden; /* 临时添加测试 */
    }
  • 永久修复

    css

    复制

    下载

    .el-table__body-wrapper {
      overflow-y: auto !important;
    }
4. Flex 容器嵌套问题
  • 现象:多层嵌套的 flex 容器可能导致对齐异常

  • 诊断步骤

    1. 检查.el-table__empty-block的所有父元素

    2. 查找是否有多个display: flex容器嵌套

    3. 特别检查align-itemsalign-content属性

  • 解决方案

    css

    复制

    下载

    /* 添加隔离层 */
    .el-table__empty-block {
      display: flex !important;
      isolation: isolate; /* 防止继承 */
    }
5. 表格加载状态残留
  • 现象:加载动画可能仍在 DOM 中占用空间

  • 检查

    javascript

    复制

    下载

    document.querySelector('.el-table__loading')?.clientHeight
  • 修复

    vue

    复制

    下载

    <el-table
      :data="tableData"
      :loading="isLoading"
      v-loading="isLoading" <!-- 确保同步 -->
    >

针对性调试方案

步骤 1:强制重排布局

javascript

复制

下载

// 在浏览器控制台执行
const table = document.querySelector('.el-table')
table.style.display = 'none'
table.offsetHeight // 触发重排
table.style.display = ''
步骤 2:最小化复现

html

复制

下载

运行

<!-- 创建最简测试环境 -->
<div style="height: 300px; border: 1px solid red">
  <div style="display: flex; height: 100%">
    <div style="flex: 1">
      <el-table :data="[]"></el-table>
    </div>
  </div>
</div>
步骤 3:布局分析工具
  1. 打开 Chrome DevTools

  2. 选择Layout面板

  3. 勾选FlexboxGrid叠加层

  4. 检查弹性容器的实际尺寸和对齐线

实际案例经验

在类似情况下,我遇到过两种特殊场景:

案例 1:隐藏的伪元素

css

复制

下载

/* 意外覆盖 */
.el-table::before {
  content: '';
  display: block;
  height: 0;
  /* 某些浏览器会解析为1px */
}

修复

css

复制

下载

.el-table::before {
  display: none !important;
}

案例 2:CSS 变量污染

css

复制

下载

/* 全局样式污染 */
:root {
  --el-table-row-height: 0px; /* 意外设置为0 */
}

修复

css

复制

下载

.el-table {
  --el-table-row-height: 46px !important;
}

建议您通过以下命令检查计算样式:

javascript

复制

下载

// 获取所有CSS变量
console.log(
  JSON.stringify(
    getComputedStyle(document.documentElement)
      .getPropertyValue('--el-table-row-height'),
    null, 2
  )
)

如果以上方案仍未解决,请提供更多上下文信息,我可以针对性给出诊断方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值