html5 - drag 拖拽

参考资料:

   张鑫旭             : http://www.zhangxinxu.com/wordpress/2011/02/html5-drag-drop-%E6%8B%96%E6%8B%BD%E4%B8%8E%E6%8B%96%E6%94%BE%E7%AE%80%E4%BB%8B/

     ^_^肥仔John  :  http://www.cnblogs.com/fsjohnhuang/p/3961066.html

     File API          : http://www.ibm.com/developerworks/cn/web/1101_hanbf_fileupload/

浏览器内拖拽

Demo : Demo

浏览器内拖拽Demo截图:

代码:

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>Document</title>
  6     <style>
  7     *{ margin:0;padding:0; }
  8     li{ list-style: none; }
  9     .cr:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0;}
 10     .cr{*zoom:1;}
 11
 12     .conter{ width:900px; margin:0 auto; }
 13     .left{ float: left;width:420px;}
 14     .right{ float:right;width:420px; }
 15     .left h2{margin-top:50px}
 16     .ul{ margin:50px 0;  }
 17     .ul li{ height:30px;line-height:30px; font-size: 14px; text-align: center; border:1px solid #333; margin-top:-1px; }
 18     .remove{  }
 19     .remove .ul{ margin:0;min-height: 60px; border:1px solid #333; }
 20     .ul.auto{ min-height:30px; border:none; }
 21     .img{ position: absolute;left:0;top:0px;}
 22     </style>
 23     <script>
 24     window.onload = function(){
 25
 26         var oUl = document.getElementById(‘ul‘);
 27         var aLis = null;
 28         var oRemove = document.getElementById(‘remove‘);
 29         var oImg = document.getElementById(‘img‘);
 30         var oUl2 = document.getElementById(‘ul2‘);
 31         var arrTop;
 32         var lastT = 0;
 33         var btn = false;
 34
 35         setLiTop();
 36
 37         function setLiTop (){
 38
 39             arrTop = [];
 40             btn = false;
 41             aLis = oUl.getElementsByTagName(‘li‘);
 42
 43             for( var i=0;i<aLis.length;i++ ){
 44
 45                 aLis[i].index = i;
 46
 47                 var top = aLis[i].offsetTop;
 48
 49                 arrTop.push( top );
 50
 51             }
 52
 53             for( var i=0;i<aLis.length;i++ ){
 54
 55                 aLis[i].ondragstart = function( ev ){
 56
 57                     var ev = window.event || ev;
 58
 59                     this.style.background = ‘#ccc‘;
 60
 61                     var t = -this.offsetHeight/2;
 62
 63                     var l = -this.offsetWidth/2;
 64
 65                     ev.dataTransfer.setData(‘index‘,this.index); // 设置数据,可以看成一个json;
 66
 67                     ev.dataTransfer.effectAllowed  = ‘move‘; //设置鼠标样式
 68
 69                     ev.dataTransfer.setDragImage(oImg,oImg.offsetWidth/2,0); //设置托转出的假图片企业也没多大用 详细文章:http://blog.csdn.net/isaisai/article/details/39892427
 70
 71                 }
 72
 73                 aLis[i].ondragover = function( ev ){
 74
 75                     var ev = window.event || ev;
 76
 77                     lastT = this.offsetTop;
 78
 79                     ev.preventDefault();
 80
 81                 }
 82
 83                 aLis[i].ondragend = function( ev ){
 84
 85                     this.style.background = ‘‘;
 86
 87                     var ev = window.event || ev;
 88
 89
 90                     for( var i=0,len=aLis.length;i<len;i++ ){
 91
 92                         if( lastT == arrTop[i] ){
 93
 94                             if( !btn ){
 95
 96                                 if( i == 0){
 97
 98                                     oUl.insertBefore( this, aLis[i] );
 99
100                                 }else{
101
102                                     oUl.insertBefore( this, aLis[i+1] );
103
104                                 }
105
106                                 setLiTop();
107
108                             }
109                         }
110                     }
111
112                     setLiTop();
113
114                 }
115
116             }
117
118         }
119
120
121         oUl2.ondragenter = function(){
122
123             this.style.backgroundColor = ‘red‘;
124             btn = true;
125
126         }
127
128
129
130         oUl2.ondragover = function(ev){
131
132             var ev = window.event || ev;
133             ev.preventDefault();
134
135         }
136
137         oUl2.ondragleave = function(){
138
139             this.style.background = ‘‘;
140
141             btn = false;
142
143         };
144
145         oUl2.ondrop = function(ev){
146
147             this.className = ‘ul auto‘;
148
149             var index =  parseInt( ev.dataTransfer.getData(‘index‘) ); // 取数据
150
151             var oLi = document.createElement(‘li‘);
152
153             oLi.innerHTML = aLis[index].innerHTML;
154
155             oUl.removeChild(aLis[index]);
156
157             oUl2.appendChild( oLi );
158
159             this.style.background = ‘‘;
160
161         }
162
163
164     }
165
166
167     </script>
168 </head>
169 <body>
170     <div class="conter cr">
171         <div class="left">
172             <h2>
173                 删除列表
174             </h2>
175             <div class="remove" id="remove">
176                 <ul class="ul" id="ul2">
177
178                 </ul>
179             </div>
180         </div>
181
182         <div class="right">
183
184             <ul class="ul" id="ul">
185                 <li draggable="true">
186                     音乐播放列表1
187                 </li>
188                 <li draggable="true">
189                     音乐播放列表2
190                 </li>
191                 <li draggable="true">
192                     音乐播放列表3
193                 </li>
194                 <li draggable="true">
195                     音乐播放列表4
196                 </li>
197                 <li draggable="true">
198                     音乐播放列表5
199                 </li>
200                 <li draggable="true">
201                     音乐播放列表6
202                 </li>
203                 <li draggable="true">
204                     音乐播放列表7
205                 </li>
206             </ul>
207             <img id="img" src="http://static.cnblogs.com/images/logo_small.gif" alt="" >
208         </div>
209
210     </div>
211
212
213 </body>
214 </html>

外部拖拽

Demo : Demo

外部拖拽Demo截图:

代码:

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>Document</title>
  6     <style>
  7     *{ margin:0;padding:0; }
  8     li{ list-style: none; }
  9     .cr:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0;}
 10     .cr{*zoom:1;}
 11
 12     .conter{ width:202px; margin:100px auto; }
 13     p{ margin:10px auto; text-align: center;}
 14     .box{  width:200px;height:200px; margin:0 auto; border:1px solid #ccc; line-height: 200px; font-size:20px; text-align: center; }
 15     .show-img{ width:950px; margin:0 auto; }
 16     .show-img img{ display: block; max-width: 950px; margin:0 auto;}
 17     </style>
 18     <script>
 19     window.onload = function(){
 20
 21         var oBox = document.getElementById(‘box‘);
 22         var oShow = document.getElementById(‘show‘);
 23
 24         oBox.ondragenter = function( ev ){
 25
 26             this.innerHTML = ‘释放‘;
 27
 28         }
 29
 30         oBox.ondragleave = function(){
 31
 32             this.innerHTML = ‘请将文件拖拽到区域‘;
 33
 34         };
 35
 36         oBox.ondragover = function(ev){
 37
 38             ev.preventDefault();
 39
 40         };
 41
 42         oBox.ondrop = function( ev ){
 43             var ev = window.event || ev;
 44             var fs = ev.dataTransfer.files; // 获取拖拽的文件列表
 45             console.log( ev.dataTransfer.files[0] );
 46             for( var i=0,len=ev.dataTransfer.files.length;i<len;i++ ){
 47
 48                 // 判断 上传类型是否为图片;
 49                 if( fs[i].type.indexOf(‘image‘)!= -1 ){
 50
 51                     var fr = new FileReader(); //文件对象
 52                     var n = i;
 53
 54                     fr.onload = function(){ //当文件读取成功就会触发onload事件
 55
 56                              var oP = document.createElement(‘p‘);
 57                              oP.innerHTML = ‘文件名:‘ + fs[n].name + ‘||文件大小:‘ + bytesToSize(fs[n].size);
 58                              oShow.appendChild( oP );
 59
 60                              var oImg = document.createElement(‘img‘);
 61                              oImg.src = this.result;//读取的文件信息
 62                              oShow.appendChild( oImg );
 63
 64                     };
 65
 66                     fr.readAsDataURL(fs[i]);  //读取数据
 67
 68                 }
 69
 70                 // 判断 上传类型是否为txt;
 71                 if( fs[i].type.indexOf(‘text‘)!= -1 ){
 72                     var oP = document.createElement(‘p‘);
 73                      oP.innerHTML = ‘文件名:‘ + fs[i].name + ‘||文件大小:‘ + bytesToSize(fs[i].size);
 74                      oShow.appendChild( oP );
 75                 }
 76
 77              }
 78
 79             this.innerHTML = ‘请将文件拖拽到区域‘;
 80             ev.preventDefault();
 81
 82
 83         }
 84
 85         // 返回文件大小 代码出处:http://blog.csdn.net/lilinoscar/article/details/40825997
 86         function bytesToSize( bytes ) {
 87
 88            if (bytes === 0) return ‘0 B‘;
 89
 90             var k = 1024;
 91
 92             sizes = [‘B‘,‘KB‘, ‘MB‘, ‘GB‘, ‘TB‘, ‘PB‘, ‘EB‘, ‘ZB‘, ‘YB‘];
 93
 94             i = Math.floor(Math.log(bytes) / Math.log(k));
 95
 96             return (bytes / Math.pow(k, i)).toFixed(2) + ‘ ‘ + sizes[i];
 97
 98         }
 99
100     }
101     </script>
102 </head>
103 <body>
104
105     <div class="conter">
106         <p>只做了图片/txt</p>
107         <div class="box" id="box">
108             请将文件拖拽到区域
109         </div>
110
111
112     </div>
113     <div class="show-img" id="show">
114
115     </div>
116
117 </body>
118 </html>

后记:

第一个demo:

drag 的执行顺序:dragstart -> drag -> dragenter -> dragover ->  dragleave  -> drop -> dragend (很重要~)

event.dataTransfer.effectAllowed 设置鼠标样式 和 event.dataTransfer.setDragImage() 设置拖拽图片 基本没用。。。。

event.dataTransfer.setDragImage() 这个还有一个兼容问题 就是图片必须在浏览器内显示否则 谷歌 不能显示 火狐能显示 所以。。。。

event.dataTransfer.setData() 设置拖拽是存的数据

event.dataTransfer.getData() 取拖拽存储的数据

第二个demo:

本地上传预览:

仿照的是QQ邮箱那个上传文件,突然想到其实这个也可以做这个上传头像。。。。

event.dataTransfer.files 拖拽的文件列表

var fr = new FileReader() 文件对象

fs[i].type 这个很重要是拖拽文件的类型 这个需要做类型的判断

fs[i].name 文件的名称

fs[i].size 文件的大小

剩下的自行 consle.log( event.dataTransfer.files[0]  ) 看看有什么属性就行了。。。。

时间: 2024-10-16 19:55:49

html5 - drag 拖拽的相关文章

HTML5开发 拖拽文件上传

Drag&Drop 拖拽功能的处理 关于HTML5拖拽文件上传,其实国外已经有很多网站有这样的应用,最早推出拖拽上传应用的是 Gmail,它支持标准浏览器下拖拽本地文件到浏览器中作为邮件的附件发送,但其实现在利用HTML5的功能实现,主要借助于新版支持的浏览器来实现,IE还是弱很多. 拖拽上传应用主要使用了以下 HTML5技术: Drag&Drop : HTML5基于拖拽的事件机制.File API : 可以很方便的让 Web 应用访问文件对象,File API 包括FileList.Bl

HTML5之拖拽(兼容IE和非IE)

前世:项目中需要拖动div,然后和某个div进行位置交换,这不是关键,关键是还要保存位置,然后在下次打开的时候按照保存的位置显示.还好本人功力深厚,一下子就想到了用localStorage来保存,事实证明真的很好用哦.保存数据的方法有了,然后开始"探索"如何用html(5)和js来实现拖拽的效果,由于H5给了比较规范的实现方式,所以在Chrome中轻松实现,万恶的IE(很少骂IE)竟然不兼容,NONONONO,心塞,只好用了两种方式分别实现拖拽效果.(其实两种方式内的代码很相似,唯一不

Nodejs express、html5实现拖拽上传

Nodejs express.html5实现拖拽上传 一.前言 文件上传是一个比较常见的功能,传统的选择方式的上传比较麻烦,需要先点击上传按钮,然后再找到文件的路径,然后上传.给用户体验带来很大问题.html5开始支持拖拽上传的需要的api.nodejs也是一个最近越来越流行的技术,这也是自己第一次接触nodejs,在nodejs开发中,最常用的开发框架之一是expess,它是一个类似mvc模式的框架.结合html5.nodejs express实现了拖拽上传的功能. 二.基础知识普及 1.No

基于html5可拖拽图片循环滚动切换

分享一款基于html5可拖拽图片循环滚动切换.这是一款支持手机端拖拽切换的网站图片循环滚动特效.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div id="site-wrapper"> <section id="section-header" data-coloroverlap="dark"></section> <section id="second-phase&qu

HTML5 的拖拽介绍

本文主要介绍与拖拽操作相关的对象及事件信息,但并不涉及太多的源码演示. 一个简单的示例 在html5中要实现拖放操作,相对于以前通过鼠标操作实现,要简单得多,数据安全性也更有保障.只需要以下几步即可. 给被拖拽元素添加draggable属性,如果是文件拖放. 为目标元素添加一个dropzone属性,这一步也不是必须的,可以省略. 在拖拽元素的dragstart中初始化相关的数据信息,主要是DataTransfer对象. 在目标元素的dragover事件中,取消其默认操作. 在目标元素的drop事

html5的拖拽dragAPI(如果看了API不懂,看看那三个案例就会恍然大悟)

1.拖拽和释放定义: 拖拽:Drag; 释放:Drop; 2.源对象和目标对象: 3.相关API: ondragstart:源对象开始被拖动 ondrag:源对象被拖动的过程中 ondragend:源对象被拖动结束 ondragenter:目标对象被源对象拖动进入 ondragover:目标对象被源对象悬浮在上面 ondragleave:源对象拖动着离开了目标对象 ondrop:源对象拖动着在目标对象上方松手 4.拖动的源对象和目标对象之间的数据传递: 源对象数据保存:e.data.Transf

HTML5 鼠标拖拽以及web存储

html5 拖拽: (function(){}())执行匿名函数,要用括号包括起来: 1:用鼠标事件来做拖拽: 2:在HTML5中加入draggable="true",就可以拖拽但是是分成了两个,这个更有效率: ondragstart:拖拽开始: ondrag:拖拽中 ondragend:拖拽结束: ondragenter:进入投放去: ondragover:投放区移动: ondragleave:离开投放区: ondrop:投放区投放:           ondragover会阻止d

html5之拖拽(1)

1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <title>图像拖动</title> 6 7 8 <style> 9 body { 10 margin: 0px;; 11 } 12 13 .container { 14 background-color: lightcyan; 15 w

html5新增拖拽和拖放功能介绍:

方法/步骤 1 DataTransfer对象:退拽传递的对象,一般使用Event.dataTransfer. 2 draggable属性,标签元素设置值为true.drangable=true. 3 ondragstart事件:元素被拖拽的时候触发的事件,作用在被拖拽元素上. ondragenter事件:进入目标元素触发事件,作用在目标元素上. ondragover事件:拖拽元素在目标元素上移动的时候触发的事件,作用在目标元素上. ondrop事件:被拖拽的元素在目标元素上同时鼠标放开触发的事件