el-table表格实现鼠标拖动而左右滑动

场景描述:

表格样式较为复杂,10条数据超出整个屏幕的高度,因而导致无法快速拖动滚动条,所以提出需要在表格内容区拖动鼠标,从而实现无需滚动到底部就可以左右拖动表格内容的效果。

具体实现:

实现的方式通过注册一个自定义指令,方便随时调用这个鼠标拖动的能力。

main.js

复制代码
Vue.directive('tabelMove', {
  // 指令的定义
  bind: function (el, binding, vnode) {
    var odiv = el // 获取当前表格元素
    // el.style.cursor = 'pointer'

    el.querySelector('.el-table .el-table__body-wrapper').style.cursor = 'pointer'

    var mouseDownAndUpTimer = null
    var mouseOffset = 0
    var mouseFlag = false
    odiv.onmousedown = (e) => {
      const ePath = composedPath(e)
      // 拖拽表头不滑动
      if (ePath.some(res => { return res && res.className && res.className.indexOf('el-table__header') > -1 })) return

      if (e.which !== 1) return

      mouseOffset = e.clientX
      mouseDownAndUpTimer = setTimeout(function () {
        mouseFlag = true
      }, 80)
    }
    odiv.onmouseup = (e) => {
      setTimeout(() => {
        // vnode.context:当前的vm实例 -- 渲染表格
        vnode.context.$refs.orderTable && vnode.context.$refs.orderTable.doLayout()
      }, 200)
      if (mouseFlag) {
        mouseFlag = false
      } else {
        clearTimeout(mouseDownAndUpTimer) // 清除延迟时间
      }
    }
    odiv.onmouseleave = (e) => {
      setTimeout(() => {
        // vnode.context:当前的vm实例 --  渲染表格
        vnode.context.$refs.orderTable && vnode.context.$refs.orderTable.doLayout()
      }, 200)
      mouseFlag = false
    }
    odiv.onmousemove = (e) => {
      if (e.which !== 1) return

      const divData = odiv.querySelector('.el-table .el-table__body-wrapper')
      if (mouseFlag && divData) {
        // 设置水平方向的元素的位置
        divData.scrollLeft -= (-mouseOffset + (mouseOffset = e.clientX))
      }
    }
    // 解决有些时候,在鼠标松开的时候,元素仍然可以拖动;
    odiv.ondragstart = (e) => {
      e.preventDefault()
    }
    odiv.ondragend = (e) => {
      e.preventDefault()
    }
    // 点击复制
    odiv.onclick = (e) => {

    }
    // 是否选中文字
    odiv.onselectstart = () => {
      return false
    }
    function composedPath(e) {
      // 存在则直接return
      if (e.path) { return e.path }
      // 不存在则遍历target节点
      let target = e.target
      e.path = []
      while (target.parentNode !== null) {
        e.path.push(target)
        target = target.parentNode
      }
      // 最后补上document和window
      e.path.push(document, window)
      return e.path
    }
  }
})

使用:

复制代码
 <el-table v-tabelMove :data="tableData" >
 	<el-table-column>......</<el-table-column>
 </el-table>
相关推荐
Asize8 分钟前
多模态生图:从 Vite 工程化到前端调用 Qwen Image
javascript·人工智能·后端
陳陈陳14 分钟前
从Token到Embedding:一篇文章搞懂大模型的「文字数学变形记」
前端·javascript·ai编程
用户9385156350723 分钟前
从 O(n²) 到 O(nlogn):一文读懂快速排序的“快”与“妙”
javascript·算法
橘子星29 分钟前
LLM 无状态架构实践:从原理到代码落地
前端·javascript·人工智能
用户83134859306981 小时前
Cesium实现雾气效果:按钮一键控制打开/关闭雾气效果,滑块拖动实时控制雾气浓度
vue.js·cesium
To_OC1 小时前
手写快排次次翻车?别死背快排模板了,这才是面试官想听的底层逻辑
javascript·算法·排序算法
风止何安啊2 小时前
网课倍速痛点解决:一套前端代码实现自由控速播放器
前端·javascript·node.js
锋行天下3 小时前
如何用Vite实现Vue组件的按需打包和远程加载
前端·vue.js·前端框架
光影少年4 小时前
原生DOM操作在React 中的注意事项
前端·javascript·react.js
用户900463370404 小时前
用Gemini搞定Vue报错和语法异常的问题
vue.js