Vue实现鼠标拖拽滚动效果,滚动方向不同控制不同组件滚动-自定义指令
横向拖拽滚动
自定义v-drag指令(横向拖拽滚动)_aら 淼的博客-CSDN博客
vue 有滚动条 点击拖拽滑动自定义指令_高先生的猫的博客-CSDN博客_vue自定义指令滑动
父子组件index与row
index挂载flowDragY,只支持垂直滚动
row挂载flowDragX,鼠标水平移动时支持水平滚动,垂直移动时可以控制index进行垂直滚动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | // 定义el< br >var _el< br >var _eVue.directive('flowDragX', { inserted (el, binding, vnode, oldNode) { if (!binding) { return } el.onmousedown = e => { e.stopPropagation() // e.stopPropagation() if (e.button === 2) { // 右键不管 return } // 鼠标按下,计算当前原始距离可视区的高度 let disX = e.clientX let disY = e.clientY // index的数据 // let _disX = _e.clientX // let _disY = _e.clientY // el.style.cursor = 'move' document.onmousemove = function (e) { // 移动时禁止默认事件 // e.preventDefault() // e.stopPropagation() // row 的数据------------------- // left const left = e.clientX - disX disX = e.clientX // el.scrollLeft += -left // top const top = e.clientY - disY disY = e.clientY // index的数据-------------------------- // eslint-disable-next-line no-unused-vars // const _left = _e.clientX - _disX // _disX = _e.clientX // el.scrollLeft += -left // top // const _top = _e.clientY - _disY // _disY = _e.clientY // 判断 // 上下滚动 if (Math.abs(top) > Math.abs(left)) { // console.log('row top1') disY = e.clientY< br > // 控制index的dom滚动 _el.scrollTop += -top e.preventDefault() } // 左右滚动 if (Math.abs(top) < Math.abs (left)) { disX = e.clientX el.scrollLeft += -left // console.log('row left') e.preventDefault() } } document.onmouseup = function (e) { el.style.cursor = '' document.onmousemove = null document.onmouseup = null e.stopPropagation() direction = false } } } }) Vue.directive('flowDragY', { inserted (el, binding, vnode, oldNode) { _el = el // console.log(binding) if (!binding) { return } if (binding.value.flag) { el.onmousedown = e => { e.stopPropagation() if (e.button === 2) { // 右键不管 return } // 鼠标按下,计算当前原始距离可视区的高度 let disX = e.clientX let disY = e.clientY // el.style.cursor = 'move' document.onmousemove = function (e) { // 移动时禁止默认事件 // e.preventDefault() // e.stopPropagation() _e = e // left const left = e.clientX - disX disX = e.clientX // el.scrollLeft += -left // top const top = e.clientY - disY disY = e.clientY // 判断 if (Math.abs(top) < Math.abs (left)) { direction = true // console.log('left') // e.stopPropagation() } if (Math.abs(top) > Math.abs(left)) { console.log('top') disY = e.clientY el.scrollTop += -top e.preventDefault() direction = false // e.stopPropagation() } } document.onmouseup = function (e) { el.style.cursor = '' document.onmousemove = null document.onmouseup = null // e.stopPropagation() } } } } }) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)