前端实现鼠标拖拽功能

1.实现拖拽

页面:

   <div @mousedown="move" style="position: relative; "> 待拖动div </div>

实现方法:

        move(e){let odiv = e.currentTarget ;        //获取目标元素//算出鼠标相对元素的位置let disX = e.clientX - odiv.offsetLeft;let disY = e.clientY - odiv.offsetTop;document.onmousemove = (e)=>{       //鼠标按下并移动的事件//用鼠标的位置减去鼠标相对元素的位置,得到元素的位置let left = e.clientX - disX;    let top = e.clientY - disY;//改变元素位置属性值,移动当前元素odiv.style.left = left + 'px';odiv.style.top = top + 'px';};document.onmouseup = (e) => { // 鼠标松开后不再移动document.onmousemove = null;document.onmouseup = null;};}

2.$event事件

  • e.target 是你当前点击的元素
  • e.currentTarget 是你绑定事件的元素
  • 获得点击元素的前一个元素
    e.currentTarget.previousElementSibling.innerHTML
  • 获得点击元素的第一个子元素
    e.currentTarget.firstElementChild
  • 获得点击元素的下一个元素
    e.currentTarget.nextElementSibling
  • 获得点击元素中id为string的元素
    e.currentTarget.getElementById(“string”)
  • 获得点击元素的string属性
    e.currentTarget.getAttributeNode(‘string’)
  • 获得点击元素的父级元素
    e.currentTarget.parentElement
  • 获得点击元素的前一个元素的第一个子元素的HTML值
    e.currentTarget.previousElementSibling.firstElementChild.innerHTML

3.clientY、pageY、screenY、layerY、offsetY的区别

         clientY 指的是距离可视页面左上角的距离pageY 指的是距离可视页面左上角的距离(不受页面滚动影响)screenY 指的是距离屏幕左上角的距离layerY 指的是找到它或它父级元素中最近具有定位的左上角距离offsetY 指的是距离它自己左上角的距离

Vue 拖拽组件 vuedraggable 和 vue-dragging

参考原文:http://www.ptbird.cn/vue-draggable-dragging.html

1.vuedraggable

vuedraggable 是标准的组件式封装,并且将可拖动元素放进了 transition-group 上面,过渡动画都比较好。

使用方式:

yarn add vuedraggable
import vuedraggable from 'vuedraggable';

在使用的时候,可以通过 v-model 来双向绑定本地 data,如果需要更新或者是触发父组件监听的事件,可以在 updated() 中去 emit。

引入后直接声明该组件然后使用即可,示例代码:

<template><vuedraggable class="wrapper" v-model="list"><transition-group><div v-for="item in list" :key="item" class="item"><p>{{item}}</p></div></transition-group></vuedraggable>
</template><script>
import vuedraggable from 'vuedraggable';export default {name: 'HelloWorld',components: {vuedraggable},props: {},data() {return {list: [1,2,34,4,54,5]}},updated() {console.log(this.list)},methods: {}
}
</script>
<style scoped>
.wrapper {display: flex;justify-content: center;width: 100%;
}
.item{width: 300px;height: 50px;background-color: #42b983;color: #ffffff;
}
</style>

2.Awe-dnd

vue-dragging 的 npm 包的名字是 awe-dnd,并不是 vue-dragging,这个库的特点是封装了 v-dragging 全局指令,然后通过全局指令去数据绑定等。

相比及 vuedraggable 来说, awe-dnd 是没有双向绑定(这里没有双向绑定并不是很严谨,准确的来说没有暴露双向绑定的方式),因此提供了事件,在拖拽结束的时候用来更新列表(不需要手动更新列表,其实内部是实现了双向绑定的)或者是去触发父组件监听的事件。

安装依赖:

npm install awe-dnd --save
yarn add awe-and

使用:

import VueDND from 'awe-dnd'Vue.use(VueDND)
<!--your.vue-->
<script>
export default {data () {return {colors: [{text: "Aquamarine"}, {text: "Hotpink"}, {text: "Gold"}, {text: "Crimson"}, {text: "Blueviolet"}, {text: "Lightblue"}, {text: "Cornflowerblue"}, {text: "Skyblue"}, {text: "Burlywood"}]}},/* if your need multi dragmounted: function() {this.colors.forEach((item) => {Vue.set(item, 'isComb', false)})} */
}
</script><template><div class="color-list"><divclass="color-item"v-for="color in colors" v-dragging="{ item: color, list: colors, group: 'color' }":key="color.text">{{color.text}}</div></div>
</template>

可以发现绑定的时候 v-dragging="{ item: color, list: colors, group: ‘color’ }" 这种形式进行指令绑定,其中 item 就是单个对象,而 list 则是数据列表,group 则是用来声明一个组,来保证可以在一个页面中进行多个数据源的操作。

而提供的两个事件方法如下:

export default {mounted () {this.$dragging.$on('dragged', ({ value }) => {console.log(value.item)console.log(value.list)console.log(value.otherData)})this.$dragging.$on('dragend', (res) => {console.error(res);})}
}

一般使用的方法就是:

this.$dragging.$on('dragend', (res) => {console.error(res);
})

前端实现鼠标拖拽功能相关推荐

  1. Python+selenium 自动化高级应用篇:借助pyautogui实现web前端带轨迹拖拽功能,解决ActionChains拖拽失效问题

    有一些 web 前端的交互,必须有鼠标轨迹才能成功的实现拖拽功能. 而 selenium 自带的 ActionChains 方法,是一瞬间从 A 点到 B 点的. 解决思路: 利用元素返回的相对浏览器 ...

  2. js实现鼠标拖拽功能基本思路

    如果要设置物体拖拽,那么必须使用三个事件,并且这三个事件的使用顺序不能颠倒. onmousedown:鼠标按下事件 onmousemove:鼠标移动事件 onmouseup:鼠标抬起事件 拖拽的基本原 ...

  3. vue项目实现鼠标拖拽功能

    <divid="back"@mousedown="draggableFun($event)"></div> //e.clientX和e. ...

  4. python鼠标拖拽功能_selenium鼠标移动、拖拽、双击、长按等操作

    selenium鼠标操作靠的是ActionChains(行为链)类,前面的文章我们已经介绍过,详情可以看ActionChains类,selenium的鼠标操作就不一一举例了,本节把鼠标移动.拖拽.双击 ...

  5. Unity 鼠标拖拽功能

    继承3个处理拖拽方法的接口IBeginDragHandler, IDragHandler, IEndDragHandler /// <summary>/// 实现接口的OnBeginDra ...

  6. 【WPF】鼠标拖拽功能DragOver和Drop

    在Winform里面实现拖入功能只要设置控件AllowDrop=true; 然后实现方法 //拖入 private void txtInputPath_DragOver(object sender, ...

  7. js简单实现鼠标拖拽功能:盒子可以跟着鼠标移动位置

    实现的原理: 根据上面的图可以算出移动后的盒子的left和top: 鼠标距离边界的值: ev.pageY - box.top ev.pageX - box.left box2.top = ev2.pa ...

  8. python鼠标拖拽功能_Python wxpython模块响应鼠标拖动事件操作示例

    本文实例讲述了Python wxpython模块响应鼠标拖动事件操作.分享给大家供大家参考,具体如下: wxpython鼠标拖动事件小案例: #coding:UTF-8 import wx app = ...

  9. 用JavaScript原生手写div的鼠标拖拽功能

    一.三个事件onmousedown(鼠标按下),onmousemove(鼠标移动),onmouseup(鼠标松) 鼠标按下时 box.onmousedown = function(e) {consol ...

  10. python模拟拖拽文件_python 基于selenium实现鼠标拖拽功能

    1.准备html文件 首先我们需要准备一个鼠标滑动的html文件,用来演示鼠标滑动的效果,注意需要将我们的html文件放在自己的服务器上, 这样我们才能够通过selenium来进行验证.html文件如 ...

最新文章

  1. ssh_config sshd_config 详解ssh_config sshd_config 详解
  2. windows快捷启动命令
  3. 使用LitePal操作数据库(CRUD增删改查) 项目已上传GitHub
  4. Transformer模型总结
  5. matlab repmat()
  6. java计算数组均值
  7. no typehandler found for property XXXX 解决
  8. 2025年全球5G设备将达到14亿部 但4G仍占主导地位
  9. Oracle MERGE用法
  10. HDU2034 人见人爱A-B【水题】
  11. 深度学习2.0-15.随机梯度下降之梯度下降简介
  12. 孪生网络pytoch实现,以resnet为特征提取网络
  13. 高效工作-使用石墨文档进行信息收集
  14. 智能手环APP软件开发
  15. 【转】模糊测试(fuzzing)是什么
  16. 富文本粘贴word文档内容图片处理
  17. 数据库|第一范式、第二范式、第三范式、BC范式、第四范式简单理解
  18. JavaWeb书城项目(一)
  19. vulnhub -- hacksudo: Thor
  20. office 2019+mathtype安装(word不显示,latex公式转换{EMBED Equation.DSMT4}问题等)

热门文章

  1. 【前端】html页面的字体代码表及字体效果对比
  2. pandas DataFrame 分组求和
  3. a标签下载文件直接打开的问题
  4. java执行bat代码
  5. Vitis下Linux应用程序开发流程
  6. 嵌入式Linux项目开发的几个步骤
  7. java实现cas单点登录_CAS单点登录实现步骤
  8. 斐讯n1刷鸿蒙系统,斐讯N12.28成功刷机 方法分享给大家
  9. 两阶段网络DEA及其计算
  10. 高通QCC蓝牙耳机提示音生成方法