vueDraggable插件拖拽过程中节点文本不允许选中方案

如上图,在拖拽“睡眠”节点过程中划过了“下载代码”其他节点,发现其他节点的文本被选中变色,会影响拖拽体验,针对这个问题有以下解决方案:

方案一:

通过onStart在拖拽开始时给body添加一个class类,然后通过这个类设置全局的指针事件,并在onEnd拖拽结束时清除这个class类。

<script setup>
// 在拖拽开始/结束时添加 body 样式控制
const onDragStart = () => {
  document.body.classList.add('drag-active');
}

const onDragEnd = () => {
  document.body.classList.remove('drag-active'); 
}
</script>

<style>
// 增强拖拽时的全局控制
body.drag-active {
  cursor: grabbing !important;
  
  * {
    cursor: grabbing !important;
    pointer-events: none;
    
    &.ghost,
    &.drag {
      pointer-events: auto;
    }
  }
}
</style>

但是这个方式可能会影响页面其他容器的效果。

方案二:

通过物理屏蔽+定时清理,确保拖拽过程中无法选中文本,也不影响拖拽元素操作,可以根据实际效果调整清理间隔时间(50ms)。

// 在拖拽开始时添加终极保护
const onDragStart = () => {
  // 添加事件防护
  const cleanSelection = () => {
    window.getSelection().removeAllRanges()
    document.onselectstart = () => false
  }
  
  // 高频清理选区
  const selectionCleaner = setInterval(cleanSelection, 50)
  
  // 拖拽结束时清理
  const onEnd = () => {
    document.onselectstart = null
    clearInterval(selectionCleaner)
    document.removeEventListener('mouseup', onEnd)
  }
  
  document.addEventListener('mouseup', onEnd, { once: true })
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

妍思码匠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值