【重构前端知识体系之HTML】HTML5的新特性——拖放
内容速递
引言
在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放。
拖放的操作,多用在拖拽排序列表、游戏拼图等。
下文中出现拖放
与拖拽
表达同一个意思。
官方介绍
HTML 拖放(Drag and Drop)接口使应用程序能够在浏览器中使用拖放功能。例如,用户可使用鼠标选择可拖拽(draggable)元素,将元素拖拽到可放置(droppable)元素,并释放鼠标按钮以放置这些元素。
拖拽操作期间,会有一个可拖拽元素的半透明快照跟随着鼠标指针。
文档
可以查看拖放的一些API,包含了相关接口的说明、在应用程序中加入拖放支持的基本步骤,以及相关接口的使用简介。
文档地址:官方文档
拖拽事件
主要有八个主要的事件,完成拖拽着歌过程一系列的事件响应。
事件 | 事件函数 | 触发时刻 |
---|---|---|
drag |
ondrag |
当拖拽元素或选中的文本时触发。 |
dragend |
ondragend |
当拖拽操作结束时触发 (比如松开鼠标按键或敲“Esc”键).。 |
dragenter |
ondragenter |
当拖拽元素或选中的文本到一个可释放目标时触发。 |
dragexit |
ondragexit |
当元素变得不再是拖拽操作的选中目标时触发。 |
dragleave |
ondragleave |
当拖拽元素或选中的文本离开一个可释放目标时触发。 |
dragover |
ondragover |
当元素或选中的文本被拖到一个可释放目标上时触发(每100毫秒触发一次)。 |
dragstart |
ondragstart |
当用户开始拖拽一个元素或选中的文本时触发。 |
drop |
ondrop |
当元素或选中的文本在可释放目标上被释放时触发。 |
拖拽核心
什么是可拖拽的?
有同学问了,上面不是说任何元素都能够拖放吗?为啥我平时拖不动?
那平时拖动了,就不叫功能了,叫BUG!
为了使元素可拖动,需要把 draggable 属性设置为 true
拖起
通过ondragstart 事件,调用dataTransfer.setData() 方法设置被拖数据的数据类型和值。
This element is draggable.
拖拽数据
应用程序可以在拖拽操作中包含任意数量的数据项。每个数据项都是一个 string
类型,典型的 MIME 类型,如:text/html
。
function dragstart_handler(ev) {
// 添加拖拽数据
ev.dataTransfer.setData("text/plain", ev.target.innerText);
ev.dataTransfer.setData("text/html", ev.target.outerHTML);
ev.dataTransfer.setData("text/uri-list", ev.target.ownerDocument.location.href);
}
想了解更多的xdm,可以查看 推荐拖拽类型 (en-US) 了解可拖拽的常见数据类型(如文本、HTML、链接和文件)。
拖拽图像
拖拽过程中,浏览器会在鼠标旁显示一张默认图片。
通过 setDragImage()
方法自定义一张图片。
function dragstart_handler(ev) {
var img = new Image();
img.src = 'example.gif';
ev.dataTransfer.setDragImage(img, 10, 10);
}
当然如果需要图片的样式,可以使用基本的拖拽数据类型。
拖拽效果
在拖拽的过程中,或者鼠标停留在元素上时的反馈有 3 个效果可以定义:
-
copy
表明被拖拽的数据将从它原本的位置拷贝到目标的位置。 -
move
表明被拖拽的数据将被移动。 -
link
表明在拖拽源位置和目标位置之间将会创建一些关系表格或是连接。
通过dropEffect来设置
function dragstart_handler(ev) {
ev.dataTransfer.dropEffect = "copy";
}
放置
当拖拽一个项目到 HTML 元素中时,浏览器默认不会有任何响应。
有拖起那么必有放置,除非你犟!不松下鼠标!
这里需要借助ondrop和ondragover两个事件来完成!dataTransfer.getData()
来设置新的数据。
Drop Zone
一个拖拽案例
一个互相拖放的案例,可以从A->B,B->A。
思路:之前实现单方面的拖拽,是一个拖,一个放。那么这两者彼此都这样设置一番呢,岂不是可以实现互相的拖放?
drag
效果
一个好用的拖拽插件
既然是学习拖拽的,那么推荐一个比较好用的Vue的拖拽组件,vue.draggable
,它的官网地址:Github地址。
里面也有其作者写的一个js公用版的。
也把中文文档地址贴一下吧,希望对你学习拖拽有帮助。中文文档地址。
总结
写那么多,总感觉意犹未尽!
差一个拖拽的小游戏案例?(等待安排,时间紧急,需要排期!!!)
重构前端知识体系,你要一起吗?
博客说明与致谢
文章所涉及的部分资料来自互联网整理,其中包含自己个人的总结和看法,分享的目的在于共建社区和巩固自己。
引用的资料如有侵权,请联系本人删除!
感谢万能的网络,W3C,菜鸟教程等!
如果你感觉对你有帮助的话,不妨给我点赞鼓励一下,好文记得收藏哟!
关注我一起成长!
幸好我在,感谢你来!