【Vue3】鼠标快速拖拽时,mouseleave\mouseMove事件失效,菜单等拖拽改变大小不灵活

拖拽改变左侧侧边栏的宽度,按照下面的写法,必须得缓慢的一点点拖拽才能改变大小,很难用而且左右拖拽不灵活。

原写法

<div class="rank" @mousedown="mousedownEvent" @mouseleave="mouseleave" @mousemove="mouseMove">

mouseMove(e) {
  if (!this.isMoving) {
    return;
  }
  const offsetx = e.clientX
  if ((this.move.initOffsetx > offsetx && this.asideWidth >= 500) || this.move.initOffsetx < offsetx && this.asideWidth <= 750) {
    this.asideWidth = this.asideWidth + (offsetx - this.move.initOffsetx)
    this.move.initOffsetx = offsetx
    return;
  }
},
mousedownEvent(e) {
  this.isMoving = true;
  this.move.initOffsetx = e.clientX
},
mouseleave(e) {
  this.isMoving = false;
},

找了资料发现,当鼠标离开绑定了mouse系列事件的组件之后,会终止拖拽事件。所以需要将mousemove绑定在一个足够大的父容器上才能继续生效,哪里还有比window更大的呢。
中间我还尝试了用document.mousemove,效果没啥差别,不好用。
最终好用方案

controlAsideWidth(e) {
  const offsetx = e.clientX
  if ((this.move.initOffsetx > offsetx && this.asideWidth >= 500) || this.move.initOffsetx < offsetx && this.asideWidth <= 750) {
    this.asideWidth = this.asideWidth + (offsetx - this.move.initOffsetx)
    this.move.initOffsetx = offsetx
    return;
  }
},
mousedownMove(e) {
  this.move.initOffsetx = e.clientX
  // 添加mousemove到window这个大容器上
  window.addEventListener("mousemove", this.controlAsideWidth)
},

// 离开页面时再销毁即可
beforeDestroy() {
  window.removeEventListener('mousemove', this.controlAsideWidth)
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值