页面滚动固定表头

思路

因为间接去管制antd table的头部置顶会导致头部款式失落,每列去获取宽度设置感觉太麻烦,最初决定应用两个table,一个只做表头固定应用,不赋予数据。
具体做法时,将传入的属于都付给两个table,暗藏表头table的内容局部,当滚动页面超过内容table时,显示表头table。

template

  • :data-source="[]" 表头table的数据为空
  • v-loading="false" 避免出现两个loading
<template>  <div style="overflow: hidden">    <div class="w1-table-fixed">      <a-table        v-show="isShowHead"        v-bind="$attrs"        :data-source="[]"        v-loading="false"      >        <template #[item]="data" v-for="item in Object.keys($slots)">          <slot :name="item" v-bind="data" />        </template>      </a-table>    </div>    <a-table      class="w1-table"      ref="tableRef"      v-bind="$attrs"    >      <template #[item]="data" v-for="item in Object.keys($slots)">        <slot :name="item" v-bind="data" />      </template>    </a-table>  </div></template>

js代码

  import {    defineComponent,    nextTick,    onMounted,    onUnmounted,    PropType,    reactive,    ref,    unref,  } from 'vue';  export default defineComponent({    setup() {      const tableRef = ref();      const isShowHead = ref(false);      function scrollLeft() {        const el = unref(tableRef);        const tableBody = document.getElementsByClassName('ant-table-body')[1];        const fixedTableBody = document.getElementsByClassName('ant-table-body')[0];        // 实现内容table和头部table的滚动联动        tableBody.addEventListener('scroll', () => {          fixedTableBody.scrollLeft = tableBody.scrollLeft;        });        fixedTableBody.addEventListener('scroll', () => {          tableBody.scrollLeft = fixedTableBody.scrollLeft;        });      }      function srollListener() {        const el = unref(tableRef);        const scrollTop =          window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;                  // 滚动大于table到页面顶部高度时,显示固定table头部        if (scrollTop > el.$el.offsetTop) {          isShowHead.value = true;        } else {          isShowHead.value = false;        }      }      onMounted(async () => {        const el = unref(tableRef);        // 确保table曾经创立胜利        if (el) {          await nextTick();          window.addEventListener('scroll', scrollListener, true)          scrollLeft();        }      });      onUnmounted(() => {        window.removeEventListener('scroll', scrollListener, true)      });            return {        tableRef,        isShowHead,      };    },  });

css款式

.w1-table-fixed {    position: fixed;    top: 0;    z-index: 999;    overflow: hidden;    .ant-table-body { // 暗藏滚动条      &::-webkit-scrollbar {        display: none;      }    }    .ant-table-placeholder { // 暗藏头部table的内容      display: none !important;    }  }

问题

不过这个形式就是在显示表头table的时候会有卡顿感,如果有好的优化形式能够评论通知我