import _ from '../utils' export default { bind: function (el, binding, vnode) { el.addEventListener('mousedown', handleMouseDown) let collision function handleMouseDown (e) { e && e.stopPropagation() let container = _.getOffset(el.parentNode) let preX = _.getPageX(e) let preY = _.getPageY(e) let topPer let leftPer let flag window.addEventListener('mousemove', handleChange,{ passive: false }) window.addEventListener('mouseup', handleMouseUp,{ passive: false }) function handleChange (e) { e && e.preventDefault() flag = true collision = false // Hide the info displayed by hover vnode.context.handlehideZone(true) let setting = vnode.context.setting let currentIndex = vnode.context.index let moveX = _.getPageX(e) - preX let moveY = _.getPageY(e) - preY setting.topPer = setting.topPer || 0 setting.leftPer = setting.leftPer || 0 topPer = _.decimalPoint(moveY / container.height + setting.topPer) leftPer = _.decimalPoint(moveX / container.width + setting.leftPer) // Hotzone moving boundary processing if (topPer < 0) { topPer = 0 moveY = -container.height * setting.topPer } if (leftPer < 0) { leftPer = 0 moveX = -container.width * setting.leftPer } if (topPer + setting.heightPer > 1) { topPer = 1 - setting.heightPer moveY = container.height * (topPer - setting.topPer) } if (leftPer + setting.widthPer > 1) { leftPer = 1 - setting.widthPer moveX = container.width * (leftPer - setting.leftPer) } // 拖拽碰撞检测 if (vnode.context.$parent.zones.length > 1) { let currentzones = JSON.parse(JSON.stringify(vnode.context.$parent.zones)).map((zone) => { return { left: (zone.leftPer || 0) * container.width, top: (zone.topPer || 0) * container.height, width: (zone.widthPer || 0) * container.width, height: (zone.heightPer || 0) * container.height } }) // 矫正 let changeSetting = {} changeSetting.left = setting.leftPer * container.width + moveX changeSetting.top = setting.topPer * container.height + moveY changeSetting.width = setting.widthPer * container.width changeSetting.height = setting.heightPer * container.height // 碰撞检测 for (let i = 0, len = currentzones.length; i < len; i++) { if (currentIndex !== i && _.handleEgdeCollisions(currentzones[i], changeSetting)) { collision = true break } } } el.style.transform = `translate(${moveX}px, ${moveY}px)` } function handleMouseUp () { if (flag) { flag = false el.style.transform = 'translate(0, 0)' if (!collision) { vnode.context.changeInfo({ topPer, leftPer }) } } // Show the info vnode.context.handlehideZone(false) window.removeEventListener('mousemove', handleChange) window.removeEventListener('mouseup', handleMouseUp) } } el.$destroy = () => el.removeEventListener('mousedown', handleMouseDown) }, unbind: function (el) { el.$destroy() } }