首页 文章

Vue2:如何让鼠标移动顺畅?

提问于
浏览
0

我是使用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 回答

  • 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}

相关问题