我是使用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>
1 回答
第一件事 - 我强烈建议你不要观察元素的移动,而是在所有页面上观察指针:
另外,请将坐标更改为
{left: this.x - ${HALF_OF_ELEMENTS_SIZE}px}