实现一个简单的拖拽自定义指令
<template><!-- box 样式 需要给个position的定位,要么移动不起来 --><div v-move class="box"><div class="header"></div><div>内容</div></div>
</template><script setup lang="ts">
import { Directive, DirectiveBinding } from 'vue'const vMove:Directive<any,void> = (el:HTMLElement,binding:DirectiveBinding) => {let moveElement:HTMLDivElement = el.firstElementChild as HTMLDivElementconsole.log('moveElement:',moveElement)const mouseDown = (e:MouseEvent) =>{let x = e.clientX - el.offsetLeftlet y = e.clientY - el.offsetTopconst move = (e:MouseEvent) =>{let curX = e.clientX - x < 0 ? 0 : e.clientX - xlet curY = e.clientY - y < 0 ? 0 : e.clientY - yif(curX > 0){curX = e.clientX - x > window.innerWidth - 300 ? window.innerWidth - 300 : e.clientX - x}if(curY > 0){curY = e.clientY - y > window.innerHeight - 300 ? window.innerHeight - 300 : e.clientY - y}el.style.left = curX + 'px'el.style.top = curY + 'px'}document.addEventListener('mousemove',move)document.addEventListener('mouseup',()=>{document.removeEventListener('mousemove',move)})}moveElement.addEventListener('mousedown',mouseDown)
}</script><style lang="scss" scoped>
.header {background: #000;height: 50px;
}
.box {width:300px;height: 300px;background: yellow;position: absolute;
}
</style>