el-table如何实现自动滚动效果

需求:表格自动向上滚动,要有一个停顿的效果。

效果图如下:

 实现过程:获取当前表格挂载后的真实DOM,并且获取到表格中承载数据的div元素,拿到元素后,对元素进行定时增加距离顶部距离,实现滚动效果。

具体代码如下:

<template>
  <div class="">
    <el-table :data="tableData" ref="table" height="300px" style="width: 100%">
      <el-table-column prop="date" label="日期" width="180" />
      <el-table-column prop="name" label="姓名" width="180" />
      <el-table-column prop="address" label="地址" />
    </el-table>
  </div>
</template>
<script>
export default {
  data() {
    return {
      tableData: [
        {
          date: "2016-05-02",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1518 弄",
        },
        {
          date: "2016-05-04",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1517 弄",
        },
        {
          date: "2016-05-04",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1517 弄",
        },
        {
          date: "2016-05-04",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1517 弄",
        },
        {
          date: "2016-05-04",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1517 弄",
        },
        {
          date: "2016-05-04",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1517 弄",
        },
        {
          date: "2016-05-04",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1517 弄",
        },
        {
          date: "2016-05-01",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1519 弄",
        },
        {
          date: "2016-05-03",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1516 弄",
        },
      ],
    };
  },
  mounted() {
    this.infinitScroll();
  },
  methods: {
    infinitScroll() {
      // 拿到表格挂载后的真实DOM
      const table = this.$refs.table;
      // 拿到表格中承载数据的div元素
      const divData = table.bodyWrapper;
      divData.onmouseover = function () {
        clearInterval(t);
      }; //鼠标移入,停止滚动
      divData.onmouseout = function () {
        start();
      }; //鼠标移出,继续滚动

      // 拿到元素后,对元素进行定时增加距离顶部距离,实现滚动效果(此配置为每1秒移动20像素)
      let t;
      function start() {
        // 数据少于表格高度停止滚动
        if (divData.clientHeight >= divData.scrollHeight) {
          return;
        }
        t = setInterval(() => {
          // 元素自增距离顶部1像素
          divData.scrollTop += 20;
          // 判断元素是否滚动到底部(可视高度+距离顶部=整个高度)
          if (
            divData.clientHeight + divData.scrollTop ==
            divData.scrollHeight
          ) {
            // 重置table距离顶部距离
            divData.scrollTop = 0;
          }
        }, 1000);
      }
      start();
    },
  },
};
</script>

### 使用 Vue 3 和 `el-table` 组件实现自动滚动Vue 3 中使用 `el-table` 实现自动滚动功能可以通过自定义逻辑来完成,因为官方并没有提供直接支持此特性的属性[^1]。为了达到这一目的,可以利用 JavaScript 的定时器函数配合 CSS 或者原生 DOM 操作来进行。 #### 方法一:基于时间间隔的自动滚动 这种方法适用于简单的场景,比如展示公告栏或轮播图等不需要复杂交互的情况。以下是具体实现方式: ```javascript <template> <div ref="tableContainer" style="overflow-y: auto; height: 300px;"> <el-table :data="visibleData"> <!-- 表格列配置 --> </el-table> </div> </template> <script setup> import { ref, onMounted } from 'vue'; const tableContainer = ref(null); let intervalId; onMounted(() => { startAutoScroll(); }); function startAutoScroll() { let scrollTop = 0; const containerHeight = tableContainer.value.clientHeight; intervalId = setInterval(() => { scrollTop += 1; if (scrollTop >= containerHeight) { scrollTop = 0; } tableContainer.value.scrollTop = scrollTop; }, 20); // 调整速度可通过改变毫秒数控制 } </script> ``` 上述代码片段展示了如何创建一个具有固定高度并允许垂直滚动的内容容器,并设置了一个每20ms增加一次顶部偏移量(`scrollTop`)的时间循环,从而实现了平滑向下的自动滚动效果。当滚动条到达底部时会重置回初始位置继续向上移动。 #### 方法二:结合鼠标事件优化用户体验 对于更复杂的业务需求,如希望用户能够暂停/恢复滚动以及进行手动拖拽,则可以在方法一的基础上加入相应的监听处理程序: ```javascript // ... 上述模板部分保持不变 ... <script setup> import { ref, onMounted, watchEffect } from 'vue'; import { useMouse } from '@vueuse/core'; const tableContainer = ref(null); let isPaused = false; let intervalId; onMounted(() => { startAutoScroll(); // 添加鼠标进入离开事件监听 tableContainer.value.addEventListener('mouseenter', pauseScrolling); tableContainer.value.addEventListener('mouseleave', resumeScrolling); // 利用 vue-use 库获取当前鼠标的坐标状态 const mousePosition = useMouse({ type: 'client' }); watchEffect(() => { if (!isPaused && mousePosition.x > 0 && mousePosition.y > 0 && mousePosition.x < window.innerWidth && mousePosition.y < window.innerHeight) { clearInterval(intervalId); setTimeout(resumeScrolling, 5000); // 鼠标静止一段时间后重新启动滚动 } }); }); function startAutoScroll() { let scrollTop = 0; const containerHeight = tableContainer.value.clientHeight; intervalId = setInterval(() => { scrollTop += 1; if (scrollTop >= containerHeight || isPaused) return; tableContainer.value.scrollTop = scrollTop; }, 20); } function pauseScrolling() { isPaused = true; clearInterval(intervalId); } function resumeScrolling() { isPaused = false; startAutoScroll(); } </script> ``` 这段增强版脚本不仅保留了原有的自动滚动特性,还增加了对用户的友好互动体验——当光标位于表格区域内时停止滚动;一旦检测到长时间无操作则自动重启滚动过程。此外,也考虑到了边界条件以防止越界错误的发生。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值