| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> JavaScript知识库 -> HTML5实战与剖析之原生拖拽---React中拖拽组件实现 -> 正文阅读 |
|
[JavaScript知识库]HTML5实战与剖析之原生拖拽---React中拖拽组件实现 |
前言:?拖拽组件是在前端开发中十分常见的一个功能,现在无论你是使用React还是Vue,都有很多现成的拖拽组件可以使用。不过,有些时候你可能还是需要自己去实现,那么就必须需要理解其实现原理。 背景: 这周接了个任务, 将antD的穿梭框做成可拖拽的(左右都可拖拽, 且支持多选拖拽)。看了下antD的api, 发现没有配置, 就决定自己写个原生实现了, 借鉴了大佬的demo, 看了一下拖拽是如何实现的, 再应用在项目中了。 了解HTML的拖拽现如今,大部分的前端拖拽组件都依托于HTML5原生提供的拖放接口。那么在开始用具体框架来封装组件的之前,就需要搞清楚这些原生的接口功能。 HTML 5的DOM鼠标事件中添加了drag这个事件。对于一个设置了draggable属性的页面元素来说,只要将其拖动到一个同样带有droppable属性的元素上,就算完成了一次完整的拖放功能。在这一过程中,会分别触发一些如下事件类型:? 提示: 链接和图片默认是可拖动的,不需要 draggable 属性。 被拖拽元素触发的事件 (源元素): * ondragstart - 当一个元素开始被拖拽的时候触发 (按下鼠标键并开始移动鼠标的时候触发dragstart事件) 说明: 默认情况下,浏览器不会再拖动期间改变被拖动元素的外观。但是可以自行修改。不过,大多数浏览器会为正被拖动的元素创建一个半透明的副本,这个副本始终跟随光标移动。当某个元素被拖动到一个有效的放置目标的时候, 会触发下列事件: 释放拖拽元素时触发的事件(目标元素): * ondragenter - 当被鼠标拖动的对象进入其容器范围内时触发此事件 (类似于mouseover事件) 需要注意:dragenter,dragover(dragend)事件下我们需要阻止浏览器的默认行为,让我们拖拽的元素成为可释放的元素。 熟悉这些基本事件类型后,实现上就是在源对象和目标对象上分别绑定对应的事件处理函数,并监听处理即可。 除了这些拖放的事件接口外,我们通常还需要处理数据的传递。HTML5中同样提供了简便的接口,在对应的监听函数内,我们可以拿到event对象,在这个对象内部有个DataTransfer接口,可专门用来保存事件的数据内容。DataTransfer对应的方法有: 拖拽携带的数据处理* event.dataTransfer.setData(参数一, 参数二)? ? ? 添加拖拽数据,这个方法接收两个参数,第一个参数是数据类型(可自定义, 只能填入类似“text/plain”或“textml”的表示 MIME类型的文字),第二个参数是要携带的数据; * event.dataTransfer.getData(参数一)? ? ? 反向操作,获取数据,只接收一个参数,即数据类型; * event.dataTransfer.clearData()? ? ?清除数据; * event.dataTransfer.setDragImage()? ? ?可自定义拖放过程中鼠标旁边的图像; 下面就是一个简单的demo了~
额外的样式处理 (如需要自定义样式处理时再看)添加拖放效果 要实现拖放的视觉效果,需要effectAllowed和dropEffect两个属性结合起来使用。
关于自定义放置目标以及浏览器兼容性的一点说明在拖动元素经过某些无效放置目标的时候,可以看到一种特殊鼠标手势(圆环中一条反斜线),表示不能放置。虽然所有元素都支持放置目标事件,但是这些元素默认是不允许放置的。如果拖动元素经过不允许放置的元素,无论用户如何操作,都不会发生drop事件。不过,你可以把任何元素变成有效的放置目标,方法是重写dragenter和dragover事件的默认行为(event.preventDefault)。 重写了默认行为之后,就会发现当拖动着元素移动到放置目标上的时候,光标变成允许放置的符号。在Firefox 3.5+中,放置事件的默认行为是打开被放到放置目标上的url。如果是把图像拖到放置目标上,页面就会转向图像文件。如果是把文本拖放到放置目标上,则会导致无效url错误。所以为了让Firefox支持政正常的拖放,还要取消drop事件的默认行为,阻止打开拖拽元素的URL。 收获: 1.原生H5拖拽事件的学习, 还有其他原生事件的熟悉 2. react Hooks+ TS的熟悉 3. 拖拽与数据的禁用处理逻辑 不足: 1. 多选拖拽的样式还是没有实现 2.对原生事件还是不够熟悉 参考: https://blog.csdn.net/weixin_45750771/article/details/125546827 https://blog.csdn.net/weixin_35521120/article/details/113522235 |
|
JavaScript知识库 最新文章 |
ES6的相关知识点 |
react 函数式组件 & react其他一些总结 |
Vue基础超详细 |
前端JS也可以连点成线(Vue中运用 AntVG6) |
Vue事件处理的基本使用 |
Vue后台项目的记录 (一) |
前后端分离vue跨域,devServer配置proxy代理 |
TypeScript |
初识vuex |
vue项目安装包指令收集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 10:18:30- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |