<template>
<div v-drag class="box">
<h2>标题</h2>
<section>内容</section>
</div>
</template>
<script setup lang="ts">
import { Directive, DirectiveBinding } from 'vue';
const vDrag: Directive<any, void> = (el: HTMLElement, binding: DirectiveBinding) => {
const mouseDown = (e: MouseEvent) => {
let X = e.clientX - el.offsetLeft
let Y = e.clientY - el.offsetTop
const mouseMove = (e: MouseEvent) => {
el.style.left = e.clientX - X + 'px'
if(el.offsetLeft < 0)
el.style.left = 0 + 'px'
if(el.offsetLeft > document.documentElement.clientWidth - el.offsetWidth)
el.style.left = document.documentElement.clientWidth - el.offsetWidth + 'px'
el.style.top = e.clientY - Y + 'px'
if(el.offsetTop < 0)
el.style.top = 0 + 'px'
if(el.offsetTop > document.documentElement.clientHeight - el.offsetHeight)
el.style.top = document.documentElement.clientHeight - el.offsetHeight + 'px'
}
document.addEventListener('mousemove', mouseMove)
document.addEventListener('mouseup', () => {
document.removeEventListener('mousemove', mouseMove)
})
}
el.addEventListener('mousedown', mouseDown)
}
</script>
<style scoped>
.box {
width: 300px;
height: 250px;
border: 2px solid #ccc;
border-top: 50px solid #333;
text-align: center;
background-color: #eee;
position: fixed;
}
</style>