纯css实现element UI Table组件表头吸顶效果

回顾🤔️

去年我在掘金post了一篇文章《elementUI Table组件实现表头吸顶效果》,今年我在空闲的时间想了一下能不能只通过修改CSS来实现吸顶,所以有了这一篇文章。

回顾一下 element 表格吸顶遇到的一些难题,主要是当表格有fixed列的时候,fixed列其实也是一个表格,且是absolute定位的。如图所示,fixed节点和正常的表头的节点在同一个层级。现在要考虑的是如何不改变dom结构不添加js的情况下实现比较好效果的吸顶。

开始编码💪

环境:vue 2.6+

首先,表头还是要做样式的吸顶,也就是el-table_header-wrapper这个节点要做吸顶的样式。这个还是比较简单的。由于吸顶的高度我们想要动态指定,所有我们定义一个v-sticky-table-header的指令,指令的值是吸顶的高度值。另外,因为主要是对样式的调整,不想对表头的节点操作太多,所以吸顶高度的变量主要会用CSS变量实现。具体代码如下:

js 复制代码
export default {
  bind(el, binding) {
    el.setAttribute('is-sticky', true)
    updateStickyTop(el, binding)
  },
  update(el, binding) {
    updateStickyTop(el, binding)
  }
}

const updateStickyTop = (el, binding) => {
  const { value, oldValue } = binding
  if (value === oldValue) return

  const top = Number(value)
  if (!isNaN(top)) {
    el.style.setProperty('--sticky-top', `${top}px`)
  }
}

当使用指令的时候,修改顶层节点,包括增加is-sticky属性以及style增加CSS变量--sticky-top,使用scss样式如下:

scss 复制代码
.el-table[is-sticky] {
  overflow: initial;
  --sticky-top: 0px;
  --stick-zIndex: 5;

  .el-table__header-wrapper{
    position: sticky;
    top: var(--sticky-top);
    z-index: var(--stick-zIndex);
  }
}
  1. 完成了简单表头的样式吸顶之后,开始考虑fixed列表格的吸顶。由于fixed节点其实也是一个比较完整的 headerTable + bodyTable 的组合,考虑一下让headerTable节点进行单独的吸顶。新增样式如下:(为了可以吸顶父节点overflow: visible;,子节点控制宽度overflow:hidden,headerTable节点sticky定位)
scss 复制代码
.el-table__fixed, .el-table__fixed-right{
  overflow: visible;
  .el-table__fixed-header-wrapper {
    position: sticky;
    top: var(--sticky-top);
    width: 100%;
    overflow: hidden;
    z-index: var(--stick-zIndex);
  }
  .el-table__fixed-body-wrapper {
    width: 100%;
    overflow: hidden;
  }
}

效果如下图,右侧fixed列可以看到表头和表体的内容都消失不见了,排查到原因是右侧这里的fixed列由于加了is-hidden样式所以内容看不见。去掉is-hidden里面visibility:hidden;的样式就能看到内容,但是显示的是日期也就是表格第一列的内容。

  1. 显示最后一列"邮编"的表头和内容。使用flex布局,优先显示右边的内容。
scss 复制代码
.el-table__fixed-right {
  .el-table__fixed-header-wrapper {
    display: flex;
    justify-content: flex-end;
  }
  .el-table__fixed-body-wrapper {
    display: flex;
    justify-content: flex-end;
  }
}

4. 调整fixed列box-shadow样式

scss 复制代码
.el-table__fixed {
  --box-shadow: 10px 0 10px -10px rgba(0, 0, 0, 0.12);
}

.el-table__fixed-right {
  --box-shadow: -10px 0 10px -10px rgba(0, 0, 0, 0.12);
}

.el-table__fixed, .el-table__fixed-right {
  box-shadow: var(--box-shadow);
}

最后呈现结果🤩

在线地址 🔗

源码地址:👇

v-sticky-table-header指令
table 样式

在线demo地址:👇

demo地址

相关推荐
ZC跨境爬虫11 小时前
跟着 MDN 学 HTML day_37:(深入掌握 CustomEvent 自定义事件接口)
前端·javascript·ui·html·音视频
码海扬帆:前端探索之旅18 小时前
深度定制 uni-combox:新增功能详解与实战指南
前端·vue.js·uni-app
谷雨不太卷18 小时前
进程的状态码
java·前端·算法
打小就很皮...18 小时前
基于 Python + LangChain + RAG 的知识检索系统实战
前端·langchain·embedding·rag
BJ-Giser18 小时前
Cesium 烟雾粒子特效
前端·可视化·cesium
空中海18 小时前
02 ArkTS 语言与工程规范
java·前端·spring
YJlio18 小时前
7.4.5 Windows 11 企业网络连接与网络重置实战:远程访问、本地策略与故障恢复
前端·chrome·windows·python·edge·机器人·django
Slow菜鸟18 小时前
Codex CLI 教程(五)| Skills 安装指南:面向 Java 全栈工程师打造个人 ECC(V1版)
大数据·前端·人工智能
Lee川18 小时前
打字机是怎么炼成的:Chat 流式输出深度解析
前端·后端·面试
前端若水19 小时前
过渡(transition)高级:贝塞尔曲线、硬件加速
前端·css·css3