本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

Vue2:如何实现流畅的鼠标移动?

发布于2024-11-04 23:24     阅读(541)     评论(0)     点赞(1)     收藏(5)


我是第一次使用 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>


解决方案


首先——我强烈建议你不要关注元素的移动,而是关注所有页面上的指针:

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

另外,请将坐标更改为如下形式{left: this.x - ${HALF_OF_ELEMENTS_SIZE}px}




所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.qianduanheidong.com/blog/article/535604/a1a4f14c6c47986ba7eb/

来源:前端黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

1 0
收藏该文
已收藏

评论内容:(最多支持255个字符)