elementui el-table 表头固定功能

1. 功能目标

当用户向下滚动页面并进入明细数据表格区域时,表头固定在浏览器可视窗口顶部;当滚动位置离开表格区域或超过表格底部时,表头自动恢复到原位置。

  • 解决 Element UI 表格原生结构下 CSS sticky 不稳定的问题。
  • 只在视口顶部位于 el-table 范围内时固定表头。
  • 固定表头时保持宽度、左侧位置与表格一致,避免列错位。
  • 数据刷新、窗口尺寸变化时重新计算固定状态。

2. 实现总览

实现采用滚动事件 + DOM 边界判断 + fixed 样式切换。核心流程如下:

  • mounted 中注册 resize 和 scroll 监听。
  • getBiTableElements 获取表格、表头和表体 DOM。
  • updateBiTableHeaderFixed 判断是否需要固定表头。
  • resetBiTableHeaderFixed 在离开表格区域时清除固定状态。
  • beforeDestroy 中解绑事件并清理固定样式。

3. 关键代码片段

滚动监听与生命周期清理

javascript 复制代码
mounted() {
  window.addEventListener('resize', this.resizeCharts);
  window.addEventListener('scroll', this.updateBiTableHeaderFixed, true);
  this.$nextTick(() => {
    this.updateBiTableHeaderFixed();
  });
},
beforeDestroy() {
  window.removeEventListener('resize', this.resizeCharts);
  window.removeEventListener('scroll', this.updateBiTableHeaderFixed, true);
  this.resetBiTableHeaderFixed();
}

表格元素获取

javascript 复制代码
getBiTableElements() {
  const table = this.$el && this.$el.querySelector('.bi-table.el-table');
  if (!table) {
    return {};
  }
  return {
    table,
    header: table.querySelector('.el-table__header-wrapper'),
    body: table.querySelector('.el-table__body-wrapper')
  };
}

固定和释放判断

javascript 复制代码
updateBiTableHeaderFixed() {
  const { table, header, body } = this.getBiTableElements();
  if (!table || !header || !body) {
    return;
  }

  const tableRect = table.getBoundingClientRect();
  const headerHeight = header.offsetHeight || 0;
  const shouldFix = tableRect.top <= 0 && tableRect.bottom > headerHeight;

  if (!shouldFix) {
    this.resetBiTableHeaderFixed();
    return;
  }

  header.classList.add('bi-table-header-fixed');
  header.style.left = tableRect.left + 'px';
  header.style.top = '0px';
  header.style.width = tableRect.width + 'px';
  body.style.paddingTop = headerHeight + 'px';
}

固定表头样式

css 复制代码
.bi-page .bi-table .el-table__header-wrapper.bi-table-header-fixed {
  position: fixed;
  z-index: 2000;
  overflow: hidden;
}
相关推荐
Highcharts.js11 分钟前
Highcharts 集成到 React 或 Vue 项目中时,如何高效地使用 TypeScript技巧?
vue.js·人工智能·react.js·typescript·前端框架·highcharts
Java后端的Ai之路9 小时前
CAS并发控制-从CPU指令到企业级乐观锁
vue.js·人工智能·python·cas·乐观锁
程序员大阳12 小时前
副队长JavaScript教程(50)-DOM:网页开发的起点
javascript·dom·es·节点·概念·document·关系
香芋芋圆16 小时前
iD-editor 详解|OSM官方在线编辑器,基于D3.js的轻量地图编辑器
开发语言·javascript·编辑器
晗夜未央18 小时前
任务队列反复失败,先分清重试、阻塞和结果待核对
开发语言·javascript
jktantan19 小时前
每个节点 41 字节:把一棵百万节点树拆进 14 个 typed array
前端·javascript·vue.js·算法·typescript
我命由我1234520 小时前
访客系统形式(有用户概念、无用户概念)
java·开发语言·前端·javascript·python·产品运营·产品经理
程序员大阳20 小时前
副队长JavaScript教程(65)-详解JSON:轻量级数据交换格式
javascript·json·序列化·反序列化·stringify·parse
小大宇21 小时前
Vue知识点-ElementPlus-06 单选+多选+下拉+日期选择
前端·vue.js·elementui
paopaokaka_luck1 天前
基于springboot+vue的益暖微光公益服务平台(DeepSeek公益助手、善款信息追溯、志愿服务积分闭环、ECharts运营分析、活动状态自动流转)
java·前端·javascript·spring boot·mysql·架构·echarts