拖拽改变鼠标样式

12 篇文章 0 订阅

在使用ant-design-vue的tree组件的时候,需要拖拽树的子节点到地图组件上,但是一旦超出tree的盒子范围鼠标样式会不对,是一个圆圈加/的鼠标样式,这个鼠标样式给用户传达的信息是不可拖拽,因此要改变鼠标样式

  • 解决办法:
    在装地图组件的父盒子上使用注册一个@dragover="dragover"事件,并且阻止默认行为。
  • 相关知识点:

在drag&drop API中提供了一个DataTransfer对象,来配置拖拽行为的鼠标效果
DataTransfer对象具有effectAllowed 和 dropEffect两个属性。 effectAllowed 和 dropEffect 最主要的作用是,用于配置拖拽操作过程中鼠标指针的类型以便提示用户后续可执行怎样的操作;其次的作用是,控制 drop 事件的触发与否。下面我们来看看effectAllowed 和 dropEffect两个属性的介绍,看看他们是如何控制鼠标指针样式的

effectAllowed:
  1. 属性作用:用于设置被拖拽元素可执行的操作。
  2. 取值范围:
    copy ,限定dropEffect的属性值为copy,否则会鼠标指针为禁止样式
    link ,限定dropEffect的属性值为link,否则会鼠标指针为禁止样式
    move ,限定dropEffect的属性值为move,否则会鼠标指针为禁止样式
    copyLink ,限定dropEffect的属性值为copy和link,否则会鼠标指针为禁止样式
    copyMove ,限定dropEffect的属性值为copy和move,否则会鼠标指针为禁止样式
    linkMove ,限定dropEffect的属性值为link和move,否则会鼠标指针为禁止样式
    all ,允许dropEffect的属性值为任意值
    none ,鼠标指针一直为禁止样式,不管dropEffect的属性值是什么
    uninitialized ,没有限定dropEffect属性的值,效果和 all 一样。
  3. 注意:仅能在 dragstart 事件中设置该属性,其他事件中设置均无效。
dropEffect属性
  1. 属性作用:
    用于设置目标元素将执行的操作,若属性值属于 effectAllowed 范围内,则鼠标指针将显示对应的指针样式,否则则显示禁止的指针样式。
  2. 取值范围:
    copy :被拖拽元素将被复制到目标元素内,若属于 effectAllowed 范围内时,则鼠标指针显示复制的样式,否则则显示禁止的指针样式。
    link :被拖拽元素将以超链接的形式打开资源,若属于 effectAllowed 范围内时,则鼠标指针显示超链接的样式,否则则显示禁止的指针样式。
    move :被拖拽元素将被移动到目标元素内,若属于 effectAllowed 范围内时,则鼠标指针显示移动的样式,否则则显示禁止的指针样式。
    none :被拖拽元素不能在目标元素上作任何操作,一直显示禁止的指针样式。除了文本框外其他元素的默认值均为none
  3. 注意:
    1)仅能在 dragover 事件中设置该属性值,其他事件中设置均无效
    2)当显示禁止的指针样式时,将无法触发目标元素的 drop 事件。
<a-tree
 :disabled="isLockScreen"
 showIcon
 @expand="onDeviceExpand"
 :draggable="true"
 @dragstart="dragstart"
 @dragend="dragend"
 :treeData="allData"
 @select="onDeviceSelect"
>
    <template slot="title" slot-scope="{ name, isDrag, isLeaf, type }">
      <span v-if="type > 100" :class="isDrag ? '' : 'gray'">{{ name }}</span>
      <span v-if="!(type > 100)">{{ name }}</span>
    </template>
    <a-icon slot="global" type="global" />
    <a-icon slot="home" type="home" />
    <a-icon slot="camera" type="video-camera" />
    <a-icon slot="border-camera" type="camera" />
</a-tree>
<div class="view" @dragover="dragover">
   <Map
     @addRule="addRule"
     @editRule="editShow"
     @ca-add="add"
     @ca-update="update"
     @del-defence="delDefence"
     @del-camera="delCamera"
     @del-defence-regio="delDefenceRegioCallback"
     @show-ai-arithmetic="showAiArithmetic"
     @hide-ai-arithmetic="hideAiArithmetic"
     @ca-add-defence-show="addDefenceShow"
     @edit-camera-defence="editCameraDefence"
     @notice-error="noticeError"
     ref="map"
     :isLock="isLockScreen"
     :mapId="mapId"
     :picUrl="mapUrl"
     :paramsInfos="paramsInfos"
     :perimeterConfig="perimeterConfig"
     :dragNode="dragNode"
    />
</div>
// 拖拽触发时调用
dragover(event: any) {
   event.preventDefault()
   event.dataTransfer.dropEffect = 'move'
}

这样当鼠标拖拽到某个盒子上鼠标样式就是我们想要的了。。。。

  • 13
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要实现鼠标拖动改变div列宽和行高,你可以使用JavaScript和CSS来完成。下面是一种实现方式: 1. 首先,在HTML中创建一个包含多个div的容器,每个div代表一个列或行。例如,创建一个id为"container"的div容器,并在其中添加一些子div。 ```html <div id="container"> <div class="column"></div> <div class="column"></div> <div class="column"></div> </div> ``` 2. 在CSS中设置容器和列的样式。设置列的宽度和高度,以及鼠标光标样式。 ```css #container { display: flex; } .column { flex: 1; min-width: 100px; min-height: 100px; border: 1px solid black; cursor: col-resize; } ``` 3. 在JavaScript中添加事件监听器,以便在鼠标拖动改变列的宽度和行的高度。 ```javascript var columns = document.querySelectorAll('.column'); var isResizing = false; var lastDownX = 0; var newWidth = 0; columns.forEach(function(column) { column.addEventListener('mousedown', function(e) { isResizing = true; lastDownX = e.clientX; newWidth = column.offsetWidth; }); column.addEventListener('mousemove', function(e) { if (!isResizing) return; var widthChange = e.clientX - lastDownX; newWidth = newWidth + widthChange; column.style.width = newWidth + 'px'; }); column.addEventListener('mouseup', function() { isResizing = false; }); }); ``` 通过以上代码,你可以在鼠标拖动改变每个div列的宽度。同样的原理也适用于改变行的高度,只需适当调整CSS和JavaScript即可。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值