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>
相关推荐
阿伟来咯~3 分钟前
记录学习react的一些内容
javascript·学习·react.js
吕彬-前端8 分钟前
使用vite+react+ts+Ant Design开发后台管理项目(五)
前端·javascript·react.js
学前端的小朱10 分钟前
Redux的简介及其在React中的应用
前端·javascript·react.js·redux·store
guai_guai_guai20 分钟前
uniapp
前端·javascript·vue.js·uni-app
也无晴也无风雨21 分钟前
在JS中, 0 == [0] 吗
开发语言·javascript
王哲晓2 小时前
第三十章 章节练习商品列表组件封装
前端·javascript·vue.js
理想不理想v2 小时前
‌Vue 3相比Vue 2的主要改进‌?
前端·javascript·vue.js·面试
酷酷的阿云2 小时前
不用ECharts!从0到1徒手撸一个Vue3柱状图
前端·javascript·vue.js
aPurpleBerry3 小时前
JS常用数组方法 reduce filter find forEach
javascript
GIS程序媛—椰子3 小时前
【Vue 全家桶】7、Vue UI组件库(更新中)
前端·vue.js