element-table 悬浮header


/* 
* table-sticky.js 混入函数 
* 组件需要提供parent字段,指定表格的className(字符串) 
* 在页面局部组件使用此组件,如果局部组件有使用display为none,会导致header头显示不全,可使用v-if重新初始化组件
*/const mainContainer = 'el-scrollbar__wrap'; // 监听滚动的class容器
const topBarHeight = 64.1; // 顶部距离设置const rafThrottle = (fn) => {let locked = false;return function (...args) {if (locked) return;locked = true;window.requestAnimationFrame(_ => {fn.apply(this, args);locked = false;});};
}function getTopDistance (element) {var distance = element.offsetTop;while (element.offsetParent) {element = element.offsetParent;distance += element.offsetTop;}return distance;
}export default {mounted () {this.containerDom = document.getElementsByClassName(mainContainer)this.clearListener()let timer = setTimeout(() => {this.initFixedHeader()clearTimeout(timer)}, 300)window.addEventListener('resize', this.resizeChange)},deactivated () {this.clearListener()},beforeDestroy () {this.clearListener()//取消监听窗口大小window.removeEventListener('resize', this.resizeChange)},activated () {this.initFixedHeader()this.updateFixedRight()window.addEventListener('resize', this.resizeChange)let timertimer = setTimeout(() => {let container = this.containerDomif (container[0].scrollTop > 0) {container[0].scrollTop = container[0].scrollTop + 1}clearTimeout(timer)}, 1000)},methods: {activatedReload () {window.addEventListener('resize', this.resizeChange)let timer = setTimeout(() => {this.clearFixedStyle()this.initFixedHeader()}, 300)this.timerList.push(timer)},reset () {this.clearFixedStyle()},// 窗口大小变化时,初始化resizeChange () {this.headerDragend()let timer = setTimeout(() => {this.initFixedHeader()clearTimeout(timer)}, 500)},async initFixedHeader () {if (this.parent) {this.parentDom = document.getElementsByClassName(this.parent)if (this.parentDom && this.parentDom.length !== 0) {this.tableWidth = this.parentDom[0].querySelector('.el-table__header-wrapper').getBoundingClientRect().widththis.setScrollXWidth()this.tableDom = this.parentDom[0].getElementsByClassName('el-table__header-wrapper')this.scrollDom = document.querySelector('.el-scrollbar__wrap')this.scrollDom.addEventListener('scroll', this.scrollEvent)// let classNames = this.parentDom[0].getAttribute('class')// if (classNames.toLowerCase().indexOf('table_box') < 0) {//   this.parentDom[0].classList.add('table_box')// }}}},// 清空监听事件clearListener () {if (this.scrollDom) {this.scrollDom.removeEventListener('scroll', this.scrollEvent)window.removeEventListener('resize', this.resizeChange)this.clearFixedStyle()this.timerList.forEach(key => {clearTimeout(key)});}},// 更新右侧固定栏updateFixedRight () {let { fixedRightHeaderDom, dom } = this.getFixedDom()if (dom.classList.contains('fixed') && this.fixedRightDom[0]) {let timer = setTimeout(() => {this.setFixedStyle({dom: fixedRightHeaderDom,left: this.fixedRightDom[0]?.getBoundingClientRect()?.left + 'px',width: getComputedStyle(this.fixedRightDom[0], null).width,scrollLeft: fixedRightHeaderDom.scrollWidth})clearTimeout(timer)}, 100)}},async headerDragend () {await this.updateWidth()await this.updateFixedRight()this.setScrollXWidth()// await this.updateHeaderHeight()},setScrollXWidth () {let timer = setTimeout(() => {if (!this.parentDom) this.parentDom = document.getElementsByClassName(this.parent)if (this.parentDom.length == 0) returnlet dom = this.parentDom[0].querySelector('.el-table__header')this.tableWidth = this.parentDom[0].querySelector('.el-table__body-wrapper').getBoundingClientRect().widththis.tableDom[0].style.width = this.tableWidth + 'px'this.updateHeaderHeight()this.headerWidth = dom.style.widthclearTimeout(timer)}, 200)},// 更新表格宽度,(拖拽改变宽度时使用)updateWidth () {if (!this.parentDom) this.parentDom = document.getElementsByClassName(this.parent)const bodyWrapperDom = this.parentDom[0].getElementsByClassName('el-table__body-wrapper')[0]const width = getComputedStyle(bodyWrapperDom, null).width//表格宽度// 给表格设置宽度。const tableParent = this.tableDomfor (let i = 0; i < tableParent.length; i++) {tableParent[i].style.width = width}},getFixedDom () {let fixedRightHeaderDom, fixedRightBox, fixedLeftHeaderDom, fixedLeftBox;let dom = this.tableDom[0]if (this.fixedLeftDom && this.fixedLeftDom[0]) {let lefarr = this.fixedLeftDom[0].childrenfixedLeftHeaderDom = lefarr[0]fixedLeftBox = lefarr[1]}if (this.fixedRightDom && this.fixedRightDom[0]) {let rightarr = this.fixedRightDom[0].childrenfixedRightHeaderDom = rightarr[0]fixedRightBox = rightarr[1]}return { fixedRightHeaderDom, fixedRightBox, fixedLeftHeaderDom, fixedLeftBox, dom }},// 更新表头高度,表头高度有可能改变updateHeaderHeight () {this.$nextTick(() => {this.tableDom = this.parentDom[0].getElementsByClassName('el-table__header-wrapper')let obj = this.tableDom[0].getBoundingClientRect()if (obj.height != this.tablexy.height) {this.tablexy.height = obj.height;let { dom } = this.getFixedDom()if (dom.classList.contains('fixed') && this.parentDom[0]) {let timer = setTimeout(() => {this.parentDom[0].getElementsByClassName('el-table__fixed-body-wrapper')[0].style.top = 0let container = this.containerDomif (container && container[0]) {container[0].scrollTop = container[0].scrollTop + 3;}clearTimeout(timer)}, 100)}}})},// 获取表格属性getTableXy () {this.tablexy = this.tableDom[0].getBoundingClientRect()this.tablexy.height = this.tableDom[0].offsetHeight// let offsetTop = getTopDistance(this.tableDom[0])// this.tablexy.height = offsetTopreturn this.tablexy},getDom () {if (!this.parentDom) {this.parentDom = document.getElementsByClassName(this.parent)}},//滚动事件scrollEvent: rafThrottle(async function (e) {this.getDom()this.tableDom = this.parentDom[0].getElementsByClassName('el-table__header-wrapper')if (this.tablexy.top == 0 || !this.tablexy.height || !this.tablexy.top) {await this.getTableXy()}this.fixedRightDom = this.parentDom[0].getElementsByClassName('el-table__fixed-right')this.fixedLeftDom = this.parentDom[0].getElementsByClassName('el-table__fixed')let { height, top, left } = this.tablexylet scrollTop = e.target.scrollToplet { fixedRightHeaderDom, fixedRightBox, fixedLeftHeaderDom, fixedLeftBox, dom } = this.getFixedDom()// table滚动到下面的时候切换列表页面, 再滚回顶部,此时top为负数,悬浮header不会回到原来的位置,故而需要重置toptop = top < 0 ? 0 : top;if (scrollTop >= height / 2 + top) {// 存在右侧固定表头if (fixedRightHeaderDom) {this.setFixedStyle({dom: fixedRightHeaderDom,left: this.fixedRightDom[0].getBoundingClientRect().left + 'px',width: getComputedStyle(this.fixedRightDom[0], null).width,scrollLeft: fixedRightHeaderDom.scrollWidth})fixedRightBox.style.top = 0 + 'px'}// 左侧固定if (fixedLeftHeaderDom) {this.setFixedStyle({dom: fixedLeftHeaderDom,left: left + 'px',width: getComputedStyle(this.fixedLeftDom[0], null).width,scrollLeft: 0})fixedLeftBox.style.top = 0 + 'px'}dom.classList.add('fixed')//加一个固定标识this.updateWidth()dom.style.position = 'fixed'dom.style.zIndex = '2000'dom.style.top = topBarHeight + 'px'dom.style.overflow = 'hidden'} else {this.clearFixedStyle()}}),//设置固定setFixedStyle (data) {let { dom, scrollLeft, width, left } = datadom.style.zIndex = '2000'dom.style.position = 'fixed'dom.style.top = topBarHeight + 'px'dom.scrollLeft = scrollLeftdom.style.width = widthdom.style.overflow = 'hidden'dom.style.left = left},// 清除header固定clearFixedStyle () {if (!this.tableDom) returnlet { height, left } = this.tablexylet { dom, fixedRightHeaderDom, fixedRightBox, fixedLeftHeaderDom, fixedLeftBox } = this.getFixedDom()if (dom.classList.contains('fixed')) {if (fixedRightHeaderDom) {fixedRightBox.style.top = height + 'px'fixedRightHeaderDom.removeAttribute("style");}if (fixedLeftHeaderDom) {fixedLeftHeaderDom.style.zIndex = '0'fixedLeftHeaderDom.style.position = 'static'fixedLeftHeaderDom.style.top = 0 + 'px'fixedLeftHeaderDom.style.left = left + 'px'fixedLeftBox.style.top = getComputedStyle(dom).height}dom.classList.remove('fixed')dom.style.position = 'static'dom.style.top = '0'dom.style.zIndex = '0'}},},computed: {__opened () {return this.$store.state.app.sidebar.opened}},watch: {__opened () {this.$nextTick(() => {this.setScrollXWidth()})}},data () {return {tablexy: {},//表格的左边宽度信息fixedRightDom: null,//右侧fixedLeftDom: null,//左侧栏固定scrollDom: null,//滚动的domparentDom: null,//表格的父元素domtableWidth: 0,timerList: [],tableDom: null,containerDom: null}},
}

参考自—— 一个好用的table底部悬浮滚动条插件 根据自己的需求调整。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/763857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

babel主要内容

定义 babel是一个编译工具 &#xff0c;用于把JSX等编译成浏览器可执行的javascript。 主要内容是几个包babel/parser 这个包主要是用于解析代码到AST树babel/types 这个包中有一堆API&#xff0c;用于手动创建ASTbabel/traverse 这个包主要是为了遍历AST树&#xff0c;结合具体…

Python计算机二级选择易错题(二)

选择题第07&#xff0c;05&#xff0c;01套 题目来源&#xff1a;python计算机二级真题&#xff08;选择题&#xff09; - 知乎 选择题第07套 选择题第05套 选择题第01套 ​​​​ s.index(x)或s.index(x,i,j)返回序列s从i开始到j位置中第一次出现元素x的位置 ​​​​​​

2001-2023年中国各省市级是否属于“开通高铁”城市匹配数据

2001-2023年中国各省市级是否属于“开通高铁”城市匹配数据 1、时间&#xff1a;2001-2023年 2、范围&#xff1a;300个地级市&#xff08;包括直辖市&#xff09; 3、来源&#xff1a;历年中国铁道出版社出版的《全国铁路旅客列车时刻表》 4、用途&#xff1a;高铁开通可作…

Unity---Lua语言

Lua Binaries Download 13.2 逻辑热更新——Lua1-3_哔哩哔哩_bilibili nil表示空 只有false和nil为false&#xff0c;其他值都为true ..连接两个字符串

实景户外亲子公园剧本杀小程序开发搭建

实景户外亲子公园剧本杀小程序开发搭建需要以下步骤&#xff1a; 1. 确定需求和功能&#xff1a;根据客户需求和剧本杀游戏的特点&#xff0c;确定小程序需要实现的功能和界面设计。 2. 选择开发平台&#xff1a;选择适合小程序的开发平台&#xff0c;如微信小程序、支付宝小…

java 泛型(下)

本篇文章主要说明的是类型通配符、可变参数、可变参数的使用等。 在学习之前&#xff0c;希望能对泛型有个大概了解&#xff0c;可参考链接 java 泛型&#xff08;上&#xff09;-CSDN博客 也希望对泛型类、泛型接口、泛型方法有个大概的认识及使用&#xff0c;可参考链接 j…

数据类型转换篇(一)

文章目录 7.1 ascii()7.2 bin()7.3 bool()7.4 bytearray()7.5 bytes()7.6 chr()7.8 complex()7.9 dict()7.10 eval() 7.1 ascii() ascii() 是 Python 的内置函数&#xff0c;用于将一个对象转换为其“ASCII”表示形式。具体来说&#xff0c;它返回一个字符串&#xff0c;该字符…

什么是485数据采集模块?

在工业自动化、智能楼宇、环境监测等众多领域&#xff0c;数据的采集与传输是实现智能化管理的关键。而485数据采集模块&#xff0c;作为一种高效、稳定的数据采集设备&#xff0c;正日益受到广泛关注。HiWoo Box&#xff0c;作为一款卓越的485数据采集模块&#xff0c;以其强大…

Maven 环境一键部署

文章目录 一、场景说明二、脚本职责三、参数说明四、操作示例五、注意事项 一、场景说明 本自动化脚本旨在为提高研发、测试、运维快速部署应用环境而编写。 脚本遵循拿来即用的原则快速完成 CentOS 系统各应用环境部署工作。 统一研发、测试、生产环境的部署模式、部署结构、…

Penpad 生态资产 $PDD 即将LaunchPad ,一文读懂Season 2 规则

Penpad 是 Scroll 上的 LauncPad 平台&#xff0c;该平台继承了 Scroll 底层的技术优势&#xff0c;并基于零知识证明技术&#xff0c;推出了系列功能包括账户抽象化、灵活的挖矿功能&#xff0c;并将在未来实现合规为 RWA 等资产登录 Scroll 生态构建基础。该平台被认为是绝大…

前端快速实现点击图片下载

目录 方法一&#xff1a;同源使用标签下载图片 方法二&#xff1a;跨域使用将canvas上的内容转换为Blob对象并下载 在前端开发中&#xff0c;有时候我们需要实现点击图片后直接下载的功能。本文将介绍两种方法来实现这一功能&#xff1a; 同源使用<a>标签下载图片跨域使…

安卓面试题多线程 121-125

121. 简述当一个线程进入某个对象的一个 synchronized 的实例方 法后,其它线程是否可进入此对象的其它方法 ?如果其他方法没有 synchronized 的话,其他线程是可以进入的。 所以要开放一个线程安全的对象时,得保证每个方法都是线程安全的122. 简述乐观锁和悲观锁的理解及如何…

C++概述

目录 一、C关键字&#xff08;63个&#xff09; 二、C几个关键点&#xff1a; 三、C语言缺陷一&#xff1a;命名冲突 四、C新概念&#xff1a;命名空间&#xff08;namespace&#xff09; 五、命名空间的嵌套&#xff1a; 六、展开命名空间&#xff1a;&#xff08;using …

切面类、注解、自定义切面类、自定义注解、如何通过注解实现切面类

1. 注解和切面类之间的关系 注解和切面类通常是配合使用的&#xff1a; 注解&#xff1a;用来标记代码&#xff0c;声明某个方法或类需要被特定的切面逻辑所增强。切面类&#xff1a;包含增强逻辑&#xff0c;它通过"切点"&#xff08;Pointcut&#xff09;来匹配被…

独家,澳门地区倾斜摄影OSGB数据免费领取

上一篇文章分享了如何将谷歌倾斜摄影原始数据如何转换成3DTiles的几种思路&#xff0c;并说明谷歌倾斜摄影3DTiles转换工具的技术先进性&#xff0c;同时也对谷歌倾斜摄影转换OSGB的几种技术思路做了对比&#xff0c;根据对比可知&#xff0c;谷歌倾斜摄影OSGB转换工具在生产效…

【No.14】蓝桥杯贪心法|最少硬币问题|活动安排问题(4)|翻硬币|快乐司机|防御力|答疑(C++)

算法优点 容易理解&#xff1a;生活常见 操作简单&#xff1a;在每一步都选局部最优 效率高&#xff1a;复杂度常常是O(1)的 算法缺点 局部最优不一定是全局最优 贪心算法&#xff08;Greedy algorithm&#xff09;&#xff0c;又称贪婪算法。是一种在每一步选择中都采取在…

小红书离线数仓提效新思路,提升百倍回刷性能

数据处理效率一直是大数据时代的核心话题&#xff0c;它推动着各类数据执行引擎持续迭代产品。从早期的 MapReduce&#xff0c;到今天的 Spark&#xff0c;各行业正不断演进其离线数仓技术架构。 现有以 Spark 为核心的数仓架构在处理大规模数据回刷方面已取得进展&#xff0c;…

专栏订阅-线上答疑通知

由于近期有很多大一的同学已经快速的做完了学院要求的9个lab&#xff0c;并且开始准备project。对于project存在很多问题。同时大部分的同学对制作小车非常的感兴趣&#xff0c;但又不知从何下手。博主针对于上述问题&#xff0c;将会在四月中旬左右开展一次统一的线上答疑&…

(vue)el-card区分背景图片、点击进入对应页面

(vue)el-card区分背景图片、点击进入对应页面 项目背景&#xff1a;郑州院XX项目首页-工作台模块卡片点击可 快速进入对应页面 html <div class"board-card"><el-cardv-for"(item, index) of cardList":key"index"class"board-ca…

【二】【单片机】有关独立按键的实验

自定义延时函数Delay 分别用Delay.c文件存储Delay函数。用Delay.h声明Delay函数。每次将这两个文件复制到工程中&#xff0c;直接使用。 //Delay.c void Delay(unsigned int xms) //11.0592MHz {while(xms--){unsigned char i, j;i 2;j 199;do{while (--j);}…