關(guān)于element-ui表頭吸附問題的解決方案
前幾天我接到一個需求說:數(shù)據(jù)過多滑動表格的時候,看不到表頭不知道對應(yīng)的數(shù)據(jù)是什么,用戶體驗操作不友好,要改成表頭固定住。我當(dāng)時聽到這個需求都要炸裂了,因為我們表格用的是Element Ui,框架不支持?。?! 難道要把所有表格都替換成自己手寫的嗎,這個工作量太大了啦

經(jīng)過幾天幾夜的思考,大聰明的我想到了2個方案,廢話不說,直接上干貨
第一種方案:
el-table 添加height屬性,即可以實現(xiàn)頭部固定,但是這個屬性不太適合我們公司的業(yè)務(wù),因為我們的后臺界面基本都是上部分已經(jīng)占了部分面積,到了小屏幕電腦,表格的視圖區(qū)會很少,所以這個方案我是不考慮的了

第二種方案:
就是來一個掩蓋手法,當(dāng)滑動到一定位置時,顯示另一個表頭,造成像吸頂?shù)母杏X,聽起來是不是已經(jīng)有點撥云見日了
1.因為表頭固定會在多個地方用到,所以弄成了組件。先創(chuàng)建一個表頭的組件pk-table-header
<template>
<div
id="fix-table-header"
class="table-wrapper"
:style="{top: `${navHeightV2}px`}"> // 這里的top是因為我們后臺頂部會有一些固定提示
<el-table
:data="[]"
style="width: 100%"
v-bind="{...$tableClass}"
class="g-table-wrapper table-header">
<template v-for="(item,index) in columns">
<el-table-column
v-if="item.show"
:key="index"
v-bind="{...item}">
<!-- S 自定義表頭 -->
<template v-if="item.type === 'custom'"
slot="header">
{{ item.label }}
</template>
<!-- E 自定義表頭 -->
</el-table-column>
</template>
</el-table>
</div>
</template>
<script>
// vuex
import { mapState } from 'vuex';
export default {
name: 'pk-table-header',
props: {
// 列表
columns: {
type: Array,
default: () => []
}
},
computed: {
...mapState({
navHeightV2: (state) => state.app.navHeightV2 // 導(dǎo)航欄高度V2
})
}
};
</script>
<style lang="scss" scoped>
.table-wrapper {
position: sticky;
left: 0;
right: 0;
z-index: 4;
}
.g-table-wrapper {
position: relative;
margin-top: -48px;
border: 1px solid #ebeef5;
border-bottom: 0;
}
.table-header {
margin-top: 0;
height: 48px;
overflow: hidden;
}
2.在utils文件里添加以下方法,因為如果表格有做左側(cè)或右側(cè)固定,表格滑動時表頭組件也要跟著滑動
export const hanldeTableScroll = (vue) => {
vue.$nextTick(() => {
if (!vue.$refs.table) return;
// 獲取表格實例
const tableEl = vue.$refs.table.$el;
const mainTable = tableEl.querySelectorAll('.el-table__body-wrapper')[0];
// 獲取表頭組件實例
const tableHeaderEl = vue.$refs.tableHeader.$el;
// 處理因為左側(cè)或右側(cè)固定,滑動時,表頭組件跟著滑動
mainTable.onscroll = function() {
let mainTableLeft = this.scrollLeft;
let fixTabel = tableHeaderEl.querySelectorAll('.el-table__body-wrapper')[0];
let mainTableHeadr = tableEl.querySelectorAll('.el-table__header-wrapper')[0];
fixTabel.scrollLeft = mainTableLeft;
mainTableHeadr.scrollLeft = mainTableLeft;
};
// 判斷表頭組件什么時候顯示
const rect = tableEl.getBoundingClientRect();
const top = rect.top || tableEl.offsetTop;
// 這里是我們公司業(yè)務(wù)需要兼容頂部通知、到期等顯示
let stickyTop = vue.$store.state.app.navHeightV2;
let shouldFixHeader = top < stickyTop;
tableEl.style.zIndex = shouldFixHeader ? 0 : 5;
});
};
3.下面就是要開始使用前面兩個步驟的代碼了
引入表頭組件,引入數(shù)據(jù),引入表格方法?



- 在mounted的時候監(jiān)聽滾動事件?

【效果展示 】


以上就是關(guān)于element-ui表頭吸附問題的解決方案的詳細(xì)內(nèi)容,更多關(guān)于element-ui表頭吸附的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Vue 實時監(jiān)聽窗口變化 windowresize的兩種方法
這篇文章主要介紹了Vue 實時監(jiān)聽窗口變化 windowresize的兩種方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-11-11
vue ssr 實現(xiàn)方式(學(xué)習(xí)筆記)
這篇文章主要介紹了vue ssr 實現(xiàn)方式(學(xué)習(xí)筆記),本文不涉及到源碼解析,主要講解如何實現(xiàn) vue 的服務(wù)端渲染,比較適合 vue-ssr 小白閱讀,感興趣的小伙伴們可以參考一下2019-01-01
復(fù)刻畫龍產(chǎn)品vue實現(xiàn)新春氣泡兔
這篇文章主要為大家介紹了復(fù)刻畫龍產(chǎn)品之使用vue實現(xiàn)新春氣泡兔示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Vue利用路由鉤子token過期后跳轉(zhuǎn)到登錄頁的實例
下面小編就為大家?guī)硪黄猇ue利用路由鉤子token過期后跳轉(zhuǎn)到登錄頁的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
學(xué)習(xí)筆記之Vuex的用法總結(jié)(Vue狀態(tài)管理)
這篇文章主要介紹了學(xué)習(xí)筆記之Vuex的用法總結(jié)(Vue狀態(tài)管理),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05

