JS—实现拖拽


JS中的拖拽示例:
    1)实现拖拽思路:当鼠标按下和拖拽过程中,鼠标与拖拽物体之间的相对距离保持不变
    2)实现拖拽遇到的问题:
        问题1:当鼠标按下移动过快时,离开了拖拽的物体时,这时拖拽物体将不再随着鼠标移动
                因为拖拽的div太小了,这时我们可以将在拖拽物体上的mousemove事件放到document上面
                同时将mouseup也改为document上面的事件
                IE下直接用obj.setCapture()即可解决,但要做三个浏览器的兼容问题
        问题2:在FF中第二次拖拽,空div的Bug
                解决方法:在mousedown函数上面添加阻止默认行为即可:return false;
        问题3:会出现将div脱出浏览器窗口的情况,用户体验不好
                解决方法:限制div的拖动范围
        问题4:对于图片拖拽--阻止默认事件return false
        问题5:当拖拽图片或者div时,经过其他文字时,会出现文字选中
            解决方法:
                1.阻止默认事件return false
                    --return false为新版浏览器FF,Chrome,IE9-11阻止了这个问题,但是IE8以下却不行
                2.IE下解决拖拽时文字选中问题--用事件捕获(只写IE下认识的事件),要解决兼容问题

    3)事件捕获:只有IE识别
        obj.setCapture()--作用是将整个网页中所有的事件集中在某个对象上,即网页中的其他对象不能获得事件
        obj.releaseCapture()--解除事件捕获

 

示例1:拖拽1,不拖出对象的父级dragDiv

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4   <meta charset="UTF-8">
 5   <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6   <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7   <title>Document</title>
 8   <style media="screen">
 9  #dragDiv{ 10  width:400px; 11  height: 400px; 12  background: #ccc; 13  position: relative; 14  margin: 20px; 15  } 16  #drag{ 17  width: 100px; 18  height: 100px; 19  background: red; 20  position: absolute; 21  } 22   </style>
23 </head>
24 <body>
25   <div id="dragDiv">
26         11111111111111111111
27         <div id="drag">拖拽2-有范围拖拽</div>
28     </div>
29 
30 
31   <script type="text/javascript">
32     window.onload=function(){ 33       //拖拽,不拖出对象的父级dragDiv
34           var oDragDiv=document.getElementById('dragDiv'); 35           var oDrag=document.getElementById('drag'); 36           oDrag.onmousedown=function(ev){ 37               var oEvent=ev||event; 38               var pos=getMousePosition(oEvent); 39               var disX=pos.x-oDrag.offsetLeft; 40               var disY=pos.y-oDrag.offsetTop; 41               if(oDrag.setCapture){ 42                   //兼容IE7-11
43                   oDrag.onmousemove=Mousemove; 44                   oDrag.onmouseup=mouseUp; 45  oDrag.setCapture(); 46               }else{ 47                   //兼容FF,Chrome
48                   document.onmousemove=Mousemove; 49                   document.onmouseup=mouseUp; 50  } 51 
52               function getMousePosition(ev){ 53                   var scrollTop=document.documentElement.scrollTop||document.body.scrollTop; 54                   var scrollLeft=document.documentElement.scrollLeft||document.body.scrollLeft; 55                   return {x:ev.clientX+scrollLeft,y:ev.clientY+scrollTop}; 56  }; 57               //合并代码
58               function Mousemove(ev){ 59                   var oEvent=ev||event 60                   var pis=getMousePosition(oEvent); 61                   var l=pis.x-disX; 62                   var t=pis.y-disY; 63 
64                   //限制范围,磁性吸附,快接近父级时,自动吸附上去
65                   if (l<30) { 66                       l=0; 67                   }else if(l>oDragDiv.offsetWidth-oDrag.offsetWidth){ 68                       l=oDragDiv.offsetWidth-oDrag.offsetWidth; 69  } 70                   if (t<30) { 71                       t=0; 72                   }else if(t>oDragDiv.offsetHeight-oDrag.offsetHeight){ 73                       t=oDragDiv.offsetHeight-oDrag.offsetHeight; 74  } 75                   oDrag.style.left=l+'px'; 76                   oDrag.style.top=t+'px'; 77  }; 78               function mouseUp(){ 79                   //当鼠标抬起时,mousemove/up清空
80                   this.onmousemove=null; 81                   this.onmouseup=null; 82                   if (oDrag.releaseCapture) { 83  oDrag.releaseCapture(); 84  } 85  }; 86               return false;    //FF等高版本浏览器中阻止默认行为
87  }; 88  } 89   </script>
90 </body>
91 </html>

 

示例2:带框的拖拽:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4   <meta charset="UTF-8">
 5   <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6   <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7   <title>Document</title>
 8   <style media="screen">
 9  #dragDiv1{  10  width:400px;  11  height: 400px;  12  background: #ccc;  13  position: relative;  14  margin: 20px;  15  }  16  #drag1{  17  width: 100px;  18  height: 100px;  19  background: red;  20  position: absolute;  21  }  22  .box{  23  border: 1px dashed black;  24  position: absolute;  25  }  26   </style>
 27 </head>
 28 <body>
 29   <div id="dragDiv1">
 30         11111111111111111111
 31         <div id="drag1">拖拽2-带框拖拽</div>
 32     </div>
 33 
 34 
 35   <script type="text/javascript">
 36     window.onload=function(){  37       //拖拽3:结合DOM,带框的拖拽
 38       var oDragDiv1=document.getElementById('dragDiv1');  39       var oDrag1=document.getElementById('drag1');  40       oDrag1.onmousedown=function(ev){  41         var oEvent=ev||event;  42         var pos=getMousePosition(oEvent);  43         var disX=pos.x-oDrag1.offsetLeft;  44         var disY=pos.y-oDrag1.offsetTop;  45         //定义拖出来的框
 46         var oBox=document.createElement('div');  47         oBox.className='box';  48         oBox.style.width=oDrag1.offsetWidth-2+'px';  49         oBox.style.height=oDrag1.offsetHeight-2+'px';  50         //每次拖动时,给虚框div的初始位置和红色实体初始位置相同,防止虚框闪动
 51         oBox.style.left=oDrag1.offsetLeft+'px';  52         oBox.style.top=oDrag1.offsetTop+'px';  53  oDragDiv1.appendChild(oBox);  54         if(oBox.setCapture){  55           //兼容IE7-11
 56           oBox.onmousemove=Mousemove;  57           oBox.onmouseup=mouseUp;  58  oBox.setCapture();  59         }else{  60           //兼容FF,Chrome
 61           document.onmousemove=Mousemove;  62           document.onmouseup=mouseUp;  63  }  64 
 65         function getMousePosition(ev){  66           var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;  67           var scrollLeft=document.documentElement.scrollLeft||document.body.scrollLeft;  68           return {x:ev.clientX+scrollLeft,y:ev.clientY+scrollTop};  69  };  70         //合并代码
 71         function Mousemove(ev){  72           var oEvent=ev||event  73           var pis=getMousePosition(oEvent);  74           var l=pis.x-disX;  75           var t=pis.y-disY;  76 
 77           //3.限制范围,磁性吸附,快接近父级时,自动吸附上去
 78           if (l<30) {  79             l=0;  80           }else if(l>oDragDiv1.offsetWidth-oBox.offsetWidth){  81             l=oDragDiv1.offsetWidth-oBox.offsetWidth;  82  }  83           if (t<30) {  84             t=0;  85           }else if(t>oDragDiv1.offsetHeight-oBox.offsetHeight){  86             t=oDragDiv1.offsetHeight-oBox.offsetHeight;  87  }  88           oBox.style.left=l+'px';  89           oBox.style.top=t+'px';  90  };  91         function mouseUp(){  92           //当鼠标抬起时,mousemove/up清空
 93           this.onmousemove=null;  94           this.onmouseup=null;  95           oDrag1.style.left=oBox.offsetLeft+'px';  96           oDrag1.style.top=oBox.offsetTop+'px';  97  oDragDiv1.removeChild(oBox);  98           if (oBox.releaseCapture) {  99  oBox.releaseCapture(); 100  } 101  }; 102         return false;    //FF中阻止默认行为
103  }; 104  } 105   </script>
106 </body>
107 </html>

 

示例3:拖拽实现自定义滚动条

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4   <meta charset="UTF-8">
 5   <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6   <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7   <title>Document</title>
 8   <style media="screen">
 9  #scroll{  10  width: 500px;  11  height: 20px;  12  background: #ccc;  13  position: relative;  14  margin: 20px;  15     border-radius: 3px;  16  }  17  #drag2{  18  width: 20px;  19  height: 20px;  20  background: red;  21     border-radius: 3px;  22  position: absolute;  23  }  24  #scrollCtrl{  25  width: 150px;  26  height: 150px;  27     filter: alpha(opacity:0);  28     opacity: 0;  29  background: green;  30  margin: 20px;  31  }  32  #ctrlWords{  33  width: 300px;  34  height: 400px;  35     border: 1px solid #000;  36  margin: 20px;  37  position: relative;  38  overflow: hidden;  39  }  40  #words{  41  position: absolute;  42     top: 0;  43     left: 0;  44  }  45   </style>
 46 </head>
 47 <body>
 48   <div id="scroll">
 49         <div id="drag2"></div>
 50     </div>
 51     <div id="scrollCtrl"></div>
 52 
 53     <div id="ctrlWords">
 54         <div id="words">
 55  每天开心快乐的生活是我们每个人追求的目标,有人孜孜不倦,苦苦追寻,仍找不到快乐的影踪。有人默默不语,静静守候,快乐总是如期而至,伴其左右。  56 
 57    一名记者到一个集市上采访,他看到一个年迈的老太太在一个角落里卖柠檬,“柠檬!柠檬!五毛钱一个!”老人有气无力地喊着,老太太的生意显然不太好,一上午也没卖几个。记者动了恻隐之心,打算把老太太的柠檬全部买下来,以使她能“高高兴兴地早些回家”。当他把自己的想法告诉老太太时,老太太的回答让他大吃一惊:“我现在都卖给你了,那我下午卖什么”。  58 
 59    快乐对于这位老太太来说,就是踏踏实实的生活,体会身边发生的点滴事情。我们的眼睛有时会欺骗我们,我们认为该烦恼的人其实是快乐的,而我们以为会快乐的人却充满了烦恼。真实的生活,往往会给人们带来无穷乐趣,只要你懂得去感受,你一定会收获快乐。  60 
 61    有一位为了金钱忙得焦头烂额而且并不快乐的爸爸问女儿:“你快乐吗?”女儿高兴地回答说:“快乐”。迷惑不解的爸爸说:“那什么是快乐呢?”女儿天真地回答说:”比如现在,我们都吃完了晚饭,你陪我在楼顶看星星,我感觉很快乐。”迷惑的爸爸一下子就清楚了自己不快乐的原因了。  62 
 63    女孩的快乐如此简单,却是来自内心最真实的快乐。仔细体会,身边的一草一木,一花一叶,都能带给我们最纯真的快乐。心中平静喜悦,无论是仰望星空,还是低头赏花,是临水观鱼,还是听风赏雨,都是其乐无穷。  64         </div>
 65     </div>
 66 
 67 
 68   <script type="text/javascript">
 69     window.onload=function(){  70       //自定义滚动条
 71         var scroll=document.getElementById('scroll');  72         var oDrag2=document.getElementById('drag2');  73         var scrollCtrl=document.getElementById('scrollCtrl');  74         var ctrlWords=document.getElementById('ctrlWords');  75         var words=document.getElementById('words');  76         oDrag2.onmousedown=function(ev){  77             var oEvent=ev||event;  78             var pos=getMousePosition(oEvent);  79             var disX=pos.x-oDrag2.offsetLeft;  80             if(oDrag2.setCapture){  81                 //兼容IE7-11
 82                 oDrag2.onmousemove=Mousemove;  83                 oDrag2.onmouseup=mouseUp;  84  oDrag2.setCapture();  85             }else{  86                 //兼容FF,Chrome
 87                 document.onmousemove=Mousemove;  88                 document.onmouseup=mouseUp;  89  }  90 
 91             function getMousePosition(ev){  92                 var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;  93                 var scrollLeft=document.documentElement.scrollLeft||document.body.scrollLeft;  94                 return {x:ev.clientX+scrollLeft,y:ev.clientY+scrollTop};  95  };  96             //合并代码
 97             function Mousemove(ev){  98                 var oEvent=ev||event  99                 var pis=getMousePosition(oEvent); 100                 var l=pis.x-disX; 101 
102                 //3.限制范围
103                 if (l<0) { 104                     l=0; 105                 }else if(l>scroll.offsetWidth-oDrag2.offsetWidth){ 106                     l=scroll.offsetWidth-oDrag2.offsetWidth; 107  } 108                 oDrag2.style.left=l+'px'; 109                 //百分数scale0-100%
110                 var scale=l/(scroll.offsetWidth-oDrag2.offsetWidth);
111                 scrollCtrl.style.filter='alpha(opacity:'+scale*100+')'; 112                 scrollCtrl.style.opacity=scale; 113                 words.style.top=-scale*(words.offsetHeight-ctrlWords.offsetHeight)+'px'; 114  }; 115             function mouseUp(){ 116                 //当鼠标抬起时,mousemove/up清空
117                 this.onmousemove=null; 118                 this.onmouseup=null; 119                 if (oDrag2.releaseCapture) { 120  oDrag2.releaseCapture(); 121  } 122  }; 123             return false;    //FF中阻止默认行为
124  }; 125  } 126   </script>
127 </body>
128 </html>

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM