代码之家  ›  专栏  ›  技术社区  ›  SumNeuron

如何让鼠标移动顺畅?

  •  0
  • SumNeuron  · 技术社区  · 7 年前

    在拖动时,我很难获得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 回复  |  直到 7 年前
        1
  •  1
  •   Theodor Losev    7 年前

    第一件事-我强烈建议您不要关注元素的移动,而要关注所有页面上的指针:

    mounted () {
      document.addEventListener('pointermove', this.doDrag.bind(this))
    },
    destroyed () {
      document.removeEventListener('pointermove', this.doDrag.bind(this))
    }
    

    {left: this.x - ${HALF_OF_ELEMENTS_SIZE}px}