我不熟悉使用vue进行交互元素,但是我在d3中有经验。 拖动时,我很难获得DOM元素的预期行为。
我想单击并移动(“拖动”)并保持元素在鼠标下的位置(而不是跳到左上角)并且没有闪烁。
我已经阅读了其他几篇文章,找不到我所寻找的示例或答案。
我尝试了pageX/Y
offsetX/Y
clientX/Y
的组合,但无济于事。
注意:在我的实际应用中,我正在尝试通过@<event>.native
尝试使用某个组件,但是即使没有这些,我也无法使其正常工作
new Vue({
el: '#app',
data: {
x: 100,
y: 100,
dragging: false
},
methods: {
startDrag() {
this.dragging = true;
},
stopDrag() {
this.dragging = false;
},
doDrag(event) {
if (this.dragging) {
// let style = this.$refs.obj.$el.style
this.x = event.clientX
this.y = event.clientY
}
}
},
computed: {
style() {
return {
left: `${this.x}px`,
top: `${this.y}px`,
position: 'absolute'
}
}
}
});
#obj {
width: 50px;
height: 50px;
background-color: coral;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id='app'>
{{dragging}}: {{x}}, {{y}}
<div ref="obj" id='obj' :style="style" @mousedown="startDrag" @mousemove="doDrag" @mouseup="stopDrag">
</div>
{{style}}
</div>
答案 0 :(得分:1)
第一件事-我强烈建议您不要看元素的运动,而要看指针在所有页面上:
mounted () {
document.addEventListener('pointermove', this.doDrag.bind(this))
},
destroyed () {
document.removeEventListener('pointermove', this.doDrag.bind(this))
}
另外,请将坐标更改为{left: this.x - ${HALF_OF_ELEMENTS_SIZE}px}