el-table横向滚动条消失,添加自己的滚动条

有些时候element-ui当中的table满足不了我们的需求,特别是对于window用户来说,当表格超出屏幕范围时,才会出现滚动条 或者我们使用fixed的时候滚动条消失的问题

以下是两种解决方案

使用el-table-bar-base第三方库

  开启横向滚动条自适应功能之后,可能会出现滚轮滚动,表格滚动到底部时,滚动条没有复位的情况。此时,鼠标移动(进出表格)即可解决,或者调低 滚轮响应延迟~~

API

propstypedefaultexplain
fixedBooleanfalse开启滚动条自适应
bottomNumber15滚动条自适应距离窗口底部距离
delayNumber300(ms)滚轮响应延迟
staticBooleanfalse静态表格,有预设值的表格请设置此项
nativeBooleanfalse设置elTableColumn表格fixed属性必须设置此项还原滚动条,否则fixed 不会生效
heightNumber、Stringauto开启纵向滚动功能,数字输入则默认单位px。此功能与 fixed 模式冲突,开启 fixed 模式则会丢弃该参数

如何使用

npm i el-table-bar-base or yarn add el-table-bar-base

引入 

import Vue from 'vue'
import ElTableBar from 'el-table-bar-base'
import 'el-table-bar-base/lib/ElTableBar.css'

import { Scrollbar } from 'element-ui' // 必须引入 Scrollbar 组件才能正常使用

Vue.use(Scrollbar)
Vue.use(ElTableBar)

模板语法使用 

<template>
  <div>
    <el-table-bar>
      <el-table>
        ...
      </el-table>
    </el-table-bar>
  </div>
</template>

在有的项目当中有些element-ui版本过低或者版本过高又不能升级(可能会影响打包),我们可以编写一个滚动条的组件 通过父组件传递  top,width,margin-left 来调整位置

<template>
  <div ref="scrollWrapper" class="custom-scrollbar-wrapper" :style="`top:${-val}px; width: ${width}%; margin-left:${left}px`">
    <div ref="dragBar" class="drag-bar" @mousedown="handleMouseDown"></div>
  </div>
</template>

<script>
export default {
  name: 'CustomScrollbar',
  data() {
    return {
      isDragging: false,
      startX: 0,
      startLeft: 0,
      tableWrapper: null
    };
  },
  props: {
    val: {
      type: Number, // 类型
      default : 0
    },
    width:{
      type: Number, // 类型
      default : 100
    },
    left:{
      type: Number, // 类型
      default : 0
    }
  },
  mounted() {
    this.$nextTick(() => {
      this.initializeScrollbar();
    });
    window.addEventListener('resize', this.handleResize);
  },
  beforeDestroy() {
    window.removeEventListener('resize', this.handleResize);
  },
  methods: {
    initializeScrollbar() {
      const elTable = this.$parent.$el.querySelector('.el-table');
      if (!elTable) return;

      this.tableWrapper = elTable.querySelector('.el-table__body-wrapper');
      if (!this.tableWrapper) return;

      // 监听表格滚动
      this.tableWrapper.addEventListener('scroll', this.syncScrollbar);
    },
    handleResize() {
      this.initializeScrollbar();
    },
    handleMouseDown(event) {
      this.isDragging = true;
      this.startX = event.clientX;
      this.startLeft = parseInt(this.$refs.dragBar.style.left, 10) || 0;
      document.addEventListener('mousemove', this.handleMouseMove);
      document.addEventListener('mouseup', this.handleMouseUp);
    },
    handleMouseMove(event) {
      if (!this.isDragging) return;
      const dx = event.clientX - this.startX;
      const newLeft = this.startLeft + dx;

      // 计算边界
      const maxLeft = this.$refs.scrollWrapper.clientWidth - this.$refs.dragBar.offsetWidth;
      const minLeft = 0;

      // 更新滚动条位置
      if (newLeft > maxLeft) {
        this.$refs.dragBar.style.left = `${maxLeft}px`;
      } else if (newLeft < minLeft) {
        this.$refs.dragBar.style.left = `${minLeft}px`;
      } else {
        this.$refs.dragBar.style.left = `${newLeft}px`;
      }

      // 同步更新表格滚动
      const scrollWidth = this.tableWrapper.scrollWidth - this.tableWrapper.clientWidth;
      const dragBarWidth = this.$refs.scrollWrapper.clientWidth;
      this.tableWrapper.scrollLeft = (newLeft / maxLeft) * scrollWidth;
    },
    handleMouseUp() {
      this.isDragging = false;
      document.removeEventListener('mousemove', this.handleMouseMove);
      document.removeEventListener('mouseup', this.handleMouseUp);
    },
    syncScrollbar() {
      if (this.isDragging) return;
      const scrollWidth = this.tableWrapper.scrollWidth - this.tableWrapper.clientWidth;
      const dragBarWidth = this.$refs.scrollWrapper.clientWidth;
      const left = (this.tableWrapper.scrollLeft / scrollWidth) * dragBarWidth;
      this.$refs.dragBar.style.left = `${left}px`;
    }
  }
};
</script>

<style>
.custom-scrollbar-wrapper {
  
  position: relative;
  height: 10px;
  /* 根据需要调整高度 */
  background: #F2F6FC;
  overflow: scroll;
  /*box-shadow: inset 0 0 5px rgba(0,0,0,0.2);*/
  border-radius: 5px;
  z-index: 100;
}

.drag-bar {
  position: absolute;
  height: 100%;
  background-color: #c1c1c1;
  /* 根据需要调整颜色 */
  cursor: pointer;
  width: 80px;
  /* 初始宽度,需要根据实际情况调整 */
  border-radius: 10px;
}</style>

以上两种解决方案,版本合适直接就可以使用第三方库如果不合适我们使用自己编写的组件就可以解决我们的滚动条消失问题

### 解决 `el-tabs` 包裹 `el-table` 时横向滚动条不生效的问题 当遇到 `el-tabs` 包裹 `el-table` 导致横向滚动条无法正常工作的情况,可以采取以下措施来解决问题。 #### 修改 CSS 样式 为了确保表格能够正确显示横向滚动条,在样式表中添加特定的选择器: ```css /* 显示滚动条 */ ::v-deep .el-table--scrollable-x .el-table__body-wrapper { overflow: auto; } ``` 对于没有横向滚动的情况下,可以通过检测 `.el-table__body-wrapper` 的类名变化来进行相应的CSS调整[^1]。具体来说,当不存在横向滚动时,该元素会带有 `is-scrolling-none` 类;而存在滚动时,则会有 `is-scrolling-right`, `is-scrolling-left` 或者 `is-scrolling-middle` 这样的类名。因此可以根据这些不同的状态自定义样式规则。 另外,针对 `el-tree` 和 `el-scrollbar` 组件组合使用时可能出现的布局问题,建议给 `el-tree` 定义一个 class 并设置其宽度属性为大内容宽度 (`width: max-content`) 及小宽度 (`min-width: 100%`) ,同时设定 `el-scrollbar` 高度以防止组件溢出容器边界[^4]。 #### HTML 结构优化 确保 `el-tabs` 下面嵌套有 `el-tab-pane` 来容纳各个标签页的内容,并且每个面板内部放置好对应的 `el-table` 实例。这样做的好处是可以更好地控制各部分之间的关系以及它们如何响应父级容器的变化。 ```html <template> <div style="height: 300px;"> <!-- 设置固定高度 --> <el-tabs v-model="activeName"> <el-tab-pane label="用户管理" name="first"> <el-table :data="tableData" height="100%"> ... </el-table> </el-tab-pane> <el-tab-pane label="配置管理" name="second">...</el-tab-pane> </el-tabs> </div> </template> <script setup lang="ts"> import { ref } from 'vue'; const activeName = ref('first'); // 表格数据... </script> ``` 通过上述方法应该能有效改善 `el-tabs` 中包含 `el-table` 后出现的横向滚动条失效现象。如果仍然存在问题,请检查是否有其他样式冲突影响到了渲染效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来都来了_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值