Vue2:如何使鼠标平滑移动?

时间:2018-12-09 19:15:22

标签: javascript html css vue.js vuejs2

我不熟悉使用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 个答案:

答案 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}