// 盒子滚动条拖拽 import { on, off } from '@/utils/dom' import Vue from 'vue' import { debounce } from 'throttle-debounce' let targetDrag = { // 托拽 isDown: false, coord: { x: 0, y: 0 } } let dom = null let ignoreClass = [] // 忽略的类名 const scrollMousedown = event => { dom.style.cursor = 'pointer' targetDrag.isDown = true targetDrag.coord.x = event.pageX targetDrag.coord.y = event.pageY } const scrollMouseup = event => { dom.style.cursor = 'default' targetDrag.isDown = false targetDrag.coord.x = 0 targetDrag.coord.y = 0 } const scrollMousemove = event => { const movX = targetDrag.coord.x - event.pageX targetDrag.coord.x = event.pageX if (checkDomIsIgnore(event)) { dom.style.cursor = 'default' targetDrag.isDown = false } else if (targetDrag.isDown) { dom.scrollLeft = dom.scrollLeft + movX } } const scrollMouseout = event => { dom.style.cursor = 'default' targetDrag.isDown = false } const scrollMousewheel = event => { if (checkIsIgnore(event)) { dom.style.cursor = 'default' targetDrag.isDown = false } else { dom.scrollLeft += event.deltaY } } /** * 检查dom是否忽略 * @param {*} e */ const checkDomIsIgnore = debounce(300, (e) => { let ignore = false ignoreClass.forEach(element => { var items = document.getElementsByClassName(element) if (items && !ignore) { for (let index = 0; index < items.length; index++) { const element = items[index] if (element.contains(e.target)) { ignore = true break } } } }) return ignore }) /** * 忽略滚轮 * @param {*} e */ const checkIsIgnore = (e) => { let ignore = false ignoreClass.forEach(element => { var items = document.getElementsByClassName(element) if (items && !ignore) { for (let index = 0; index < items.length; index++) { const element = items[index] const rect = element.getBoundingClientRect() if ((e.clientY > rect.top && (e.clientY < (rect.top + rect.height))) && (e.clientX > rect.left && (e.clientX < (rect.left + rect.width)))) { ignore = true break } } } }) return ignore } export default Vue.directive('scrollx', { bind: function (el, binding, vnode) { const valueData = binding.value ignoreClass = valueData.ignoreClass }, inserted: function (el) { dom = el // 鼠标按下 on(el, 'mousedown', scrollMousedown) on(el, 'mouseout', scrollMouseout) on(el, 'wheel', scrollMousewheel) // 鼠标释放 on(el, 'mouseup', scrollMouseup) // 鼠标托拽 on(el, 'mousemove', scrollMousemove) }, unbind: function (el) { off(el, 'mousedown', scrollMousedown) off(el, 'mouseup', scrollMouseup) off(el, 'mouseout', scrollMouseout) off(el, 'wheel', scrollMousewheel) off(el, 'mousemove', scrollMousemove) // 清空 targetDrag = { // 托拽 isDown: false, coord: { x: 0, y: 0 } } } })