我们学习了 HTML 提供的原生拖放(drag & drop)后,是时候想一想这个东西可以用来作什么,可以在什么时候使用,使用的场景等等
场景分析
当我们在注册成功一个账户时,一般网站会让我们上传我们的用户头像,或者在实名认证的时候会涉及到身份证图片上传到等,这时候我们可以使用input提供的file属性进行选择本地文件进行上传。
我们再想一下,当在电脑端的情况下,当用户打开文件选择框时再寻找图片对应的文件夹,再进行选取文件的时候是不是会有点麻烦呢?我们可不可以让用户找到图片文件,直接引入实现上传呢?答案是可以的。
怎么做
经过这些分析后,我们可以尝试使用 HTML5 提供的拖拽,使得目标元素增加读取文件功能,然后使用 ajax 实现图片上传。
谈一谈我们需要使用到的技术:
HTML5 拖拽事件
关于 Drag & Drop 拖拽事件,之前我写过一篇专门介绍的文章,HTML5-拖拽,大家有兴趣的话可以点击链接查看,我在这里就不在多啰嗦了~下面直接出拖拽上传的简要代码示例
var oDragWrap = document.body; //拖进 oDragWrap.addEventListener( "dragenter", function(e) { e.preventDefault(); }, false ); //拖离 oDragWrap.addEventListener( "dragleave", function(e) { dragleaveHandler(e); }, false ); //拖来拖去 , 一定要注意dragover事件一定要清除默认事件 //不然会无法触发后面的drop事件 oDragWrap.addEventListener( "dragover", function(e) { e.preventDefault(); }, false ); //扔 oDragWrap.addEventListener( "drop", function(e) { dropHandler(e); }, false ); var dropHandler = function(e) { //将本地图片拖拽到页面中后要进行的处理都在这 };
获取文件数据 HTML5 File API
File API 中的 FileReader 接口,作为 File API 的一部分,FileReader 专门用来读取文件。我们在这里主要介绍一些 File API 中的 FileList 接口,它主要通过两个途径获取本地文件列表,一是<input type="file"/>的表单形式,另一种则是e.dataTransfer.files拖拽事件传递的文件信息。
var fileList = e.dataTransfer.files;
使用 files 方法将会获取到拖拽文件的数组形式的数据,每个文件占用一个数组的索引,如果索引不存在文件数据,将返回 Null。可以通过length属性获取文件的数量。
var fileNum = fileList.length;
拖拽上传需要注意的是需要判断两个条件
// 检测是否是拖拽文件到页面的操作 if (fileList.length === 0) { return; } // 检测文件是不是图片 if (fileList[0].type.indexOf("image") === -1) { return; }
下面我们看看结合之前的拖拽事件,来实现拖拽图片并在页面中预览
var dropHandler = function(e) { e.preventDefault(); //获取文件列表 var fileList = e.dataTransfer.files; //检测是否是拖拽文件到页面的操作 if (fileList.length == 0) { return; } //检测文件是不是图片 if (fileList[0].type.indexOf("image") === -1) { return; } //实例化file reader对象 var reader = new FileReader(); var img = document.createElement("img"); reader.onload = function(e) { img.src = this.result; oDragWrap.appendChild(img); }; reader.readAsDataURL(fileList[0]); };
当完成以上操作后,相信你可以成功的完成了拖拽图片预览的操作。当你查看 img 标签时会发现,img的src属性是一个超长的文件二进制数据,当你需要很多这种的img元素时,建议将展示区域脱离文档流,让其绝对定位减少页面的 reflow
AJAX 上传图片
既然已经获取到拖拽到web页面中的图片数据了,下一步就是将其发送到服务器端。
总结
要为大家详细介绍了HTML5拖放效果的实现代码,拖放即抓取对象以后拖到另一个位置。感兴趣的小伙伴们可以参考一下:
在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放。
Internet Explorer 9+, Firefox, Opera, Chrome, 和 Safari 支持拖动。但 Safari 5.1.2不支持拖动。
下面看看实现效果:
拖拽前
拖拽后
代码实现:
把draggable属性设置为true ,才能使元素可拖动。
然后,规定当元素被拖动时,会发生什么。
在上面的例子中,ondragstart 属性调用了一个函数,drag(event),它规定了被拖动的数据。
dataTransfer.setData() 方法设置被拖数据的数据类型和值:
在这个例子中,数据类型是 "Text",值是可拖动元素的 id ("drag1")。
ondragover 事件规定在何处放置被拖动的数据。
默认地,无法将数据/元素放置到其他元素中。如果需要设置允许放置,我们必须阻止对元素的默认处理方式。
这要通过调用 ondragover 事件的 event.preventDefault() 方法:event.preventDefault()
当放置被拖数据时,会发生 drop 事件。
在上面的例子中,ondrop 属性调用了一个函数,drop(event):
调用 preventDefault() 来避免浏览器对数据的默认处理(drop 事件的默认行为是以链接形式打开)
通过 dataTransfer.getData("Text") 方法获得被拖的数据。该方法将返回在 setData() 方法中设置为相同类型的任何数据。
被拖数据是被拖元素的 id ("drag1")
把被拖元素追加到放置元素(目标元素)中
若要实现来回拖动:
若要在两个地方来回拖动,只需将上面代码稍作修改就行了.将body中的代码改成:
然后在style样式中加上#div2就可以了:
TML5
拖放(Drag 和 drop)是 HTML5 标准的组成部分。
拖放的事件效果在我们的生活中经常用到,比如我们打开电脑给别人发送一个文件或图片,我们一般都是把文件图片点击按住然后直接拖放到我们的留言区,然后直接就给发送过去了。还有就是我们在拷贝文件或图片的时候也是,直接把文件拖进来的,很少有用右键复制来拷贝的,所以,这样的操作是不是很方便呢?那么,这样的效果我们又怎么实现呢?
其实,这样的效果很简单,今天我们就来实现一个简单的图片拖放功能,我们来看一下代码就知道了!
新建一个index.html文件
index.html
第一,拖动什么?用ondragstart和setData()
ondragstart 属性调用了一个函数,drag(event),它规定了被拖动的数据。
第二,拖放到何处?用ondragover,ondragover 事件规定在何处放置被拖动的数据。
这要通过调用 ondragover 事件的 event.preventDefault() 方法。
第三,放置到哪里?用ondrop,当放置被拖数据时,会发生 drop 事件。
另外新建一个demo.js文件
demo.js
demo.js
拖放效果图
看完是不是觉得很简单呢?
虽然,这些看似简单的东西,但常常是在我们不经意的时候就成了一个强大的酷炫的东西了。所以说,我们常看的高大上的动画效果,其实都是这些简单的知识堆积而成的,只要我们把基础打扎实了,这些效果就慢慢地显露出来了。
如果觉得本期内容不错,记得在下方给我留言!下期小编会有更好的干货分享哦!
*请认真填写需求信息,我们会在24小时内与您取得联系。