使用Vue3和TypeScript编写一个鼠标可以拖动的div和一个不动的点,它们之间有一根线相连,并且在鼠标拖动div的时候,它们之间的线也要随之改变,使得它们一直处于连接状态
时间: 2024-05-15 14:19:43 浏览: 127
首先,需要准备好Vue3和TypeScript环境,并导入相关依赖。
在Vue组件中,定义data属性,用于存储div和点的位置信息。在mounted生命周期中,绑定鼠标事件,实现拖动div的效果。拖动过程中,更新data属性中div的位置信息,并计算出连接线的起点和终点位置,存储在data属性中。在组件模板中,使用绑定的data属性来动态设置div和点的位置以及连接线的终点位置,实现页面效果。
以下是示例代码:
```html
<template>
<div class="container">
<div
class="box"
:style="{ left: boxLeft + 'px', top: boxTop + 'px' }"
@mousedown="handleMouseDown"
@mousemove="handleMouseMove"
@mouseup="handleMouseUp"
>
Drag me
</div>
<div class="dot" :style="{ left: dotLeft + 'px', top: dotTop + 'px' }"></div>
<svg class="line">
<line :x1="lineX1" :y1="lineY1" :x2="lineX2" :y2="lineY2" />
</svg>
</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
export default defineComponent({
name: 'DraggableBox',
data() {
return {
isDragging: false,
boxLeft: 100,
boxTop: 100,
dotLeft: 200,
dotTop: 100,
lineX1: 0,
lineY1: 0,
lineX2: 0,
lineY2: 0,
};
},
mounted() {
document.addEventListener('mousemove', this.handleMouseMove);
document.addEventListener('mouseup', this.handleMouseUp);
},
beforeUnmount() {
document.removeEventListener('mousemove', this.handleMouseMove);
document.removeEventListener('mouseup', this.handleMouseUp);
},
methods: {
handleMouseDown(event: MouseEvent) {
this.isDragging = true;
},
handleMouseMove(event: MouseEvent) {
if (!this.isDragging) return;
const { clientX, clientY } = event;
this.boxLeft = clientX - 50;
this.boxTop = clientY - 50;
this.lineX2 = clientX - 100;
this.lineY2 = clientY - 50;
},
handleMouseUp(event: MouseEvent) {
this.isDragging = false;
},
},
});
</script>
<style scoped>
.container {
position: relative;
width: 100%;
height: 100%;
}
.box {
position: absolute;
width: 100px;
height: 100px;
background-color: #f00;
color: #fff;
text-align: center;
line-height: 100px;
cursor: move;
}
.dot {
position: absolute;
width: 20px;
height: 20px;
border-radius: 50%;
background-color: #00f;
}
.line {
position: absolute;
width: 100%;
height: 100%;
pointer-events: none;
}
</style>
```
在这个示例中,使用了SVG的线条元素来实现连接线的效果。在组件模板中,使用了line标签,并绑定了起点和终点的坐标。在拖动过程中,计算出连接线的终点坐标,并将其存储在data属性中,实现了连接线动态变化的效果。
阅读全文