鼠标拖动层(可任意绑定DIV标签)的两种实现方法

时间:2022-09-13 21:52:15
实现方法一:
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
  2. <html xmlns="http://www.w3.org/1999/xhtml"> 
  3. <head> 
  4. <title> 鼠标拖动层(可任意绑定DIV标签)(一) </title> 
  5. <script language="javascript" type="text/javascript"> 
  6. /*
  7. 鼠标拖动层(可任意绑定DIV标签)(一)
  8. 作者:Anlige
  9. 联系方式:1034555083/zhanghuiguoanlige@126.com

  10. 调用方法:var myDrag=new Endrag(source,target,offSetX, offSetY);
  11. 参数说明:source--鼠标动作绑定对象;target--操作目标对象(要移动的对象);offSetX--横坐标偏移;offSetY--纵坐标偏移
  12. 说明:通过多次调用本方法绑定多个对象的拖动
  13. */
  14. funs={
  15.     index:100,  
  16.     getFocus:function (target){  
  17.         if(target.style.zIndex!=this.index){  
  18.             this.index += 2;  
  19.             var idx = this.index;  
  20.             target.style.zIndex=idx;  
  21.         }  
  22.     },
  23.     abs:function (element) {
  24.         var result = { x: element.offsetLeft, y: element.offsetTop};
  25.         element = element.offsetParent;
  26.         while (element) {
  27.             result.x += element.offsetLeft;
  28.             result.y += element.offsetTop;
  29.             element = element.offsetParent;
  30.         }
  31.         return result;
  32.     }
  33. };

  34. function Endrag(source,target,offSetX, offSetY){
  35.     source=typeof(source)=="object" ? source:document.getElementById(source);
  36.     target=typeof(target)=="object" ? target:document.getElementById(target);
  37.     var x0=0,y0=0,x1=0,y1=0,moveable=false,index=100,NS=(navigator.appName=='Netscape');
  38.     offSetX=typeof offSetX== "undefined" ? 0:offSetX;
  39.     offSetY=typeof offSetY== "undefined" ? 0:offSetY;
  40.     source.onmousedown=function(e){
  41.         e = e ? e : (window.event ? window.event : null);
  42.         funs.getFocus(target); 
  43.         if(e.button==(NS)?0 :1)  { 
  44.             if(!NS){this.setCapture()}
  45.             x0 = e.clientX ;  
  46.             y0 = e.clientY ;  
  47.             x1 = parseInt(funs.abs(target).x);  
  48.             y1 = parseInt(funs.abs(target).y);    
  49.             moveable = true;  
  50.         }  
  51.     };  
  52.     //拖动;  
  53.     source.onmousemove=function(e){
  54.         e = e ? e : (window.event ? window.event : null);  
  55.         if(moveable){  
  56.             target.style.left = (x1 + e.clientX - x0 - offSetX) + "px";  
  57.             target.style.top  = (y1 + e.clientY - y0 - offSetY) + "px";  
  58.         }  
  59.     }; 
  60.     //停止拖动;  
  61.     source.onmouseup=function (e){ 
  62.         if(moveable)  {  
  63.             if(!NS){this.releaseCapture();}
  64.             moveable = false;  
  65.         }  
  66.     };
  67. }
  68. </script> 
  69. </head> 
  70. <body onload="var i=new Endrag('hand','MoveDiv',0,0);var j=new Endrag('Div1','Div1',0,0);"> 
  71. <div id="MoveDiv" style="position:absolute;left:200px;top:50px;width:400px;height:200px;border:1px #dddddd solid;"> 
  72. <div id="hand" style="line-height:25px;text-align:center;background:#f00"> 
  73. 这个用子标签操作父标签 
  74. </div> 
  75. 调用方法<br />var i=new Endrag('hand','MoveDiv',0,0);<br />
  76. 第一个参数为源标签对象或对象id属性;第二个参数为要移动的目标对象或对象id属性;第3、4个参数为偏移值,供最后调整用;<br />
  77. 鼠标指针在红色区域才有效
  78. </div> 
  79. <div id="Div1" style="background:#ffffff;position:absolute;left:400px;top:300px;width:300px;height:200px;border:1px #dddddd solid;"> 
  80. <div id="Div2" style="line-height:25px;text-align:center;background:#f00"> 
  81. 这个用自标签操作自己 
  82. </div> 
  83. 调用方法<br />var j=new Endrag('Div1','Div1',0,0);<br />
  84. 第一个参数为源标签对象或对象id属性;第二个参数为要移动的目标对象或对象id属性;第3、4个参数为偏移值,供最后调整用;<br />
  85. 鼠标指针在Div1标签内就有效
  86. </div> 
  87. </body> 
  88. </html>
复制代码

实现方法二:

调用方法
Endrag.bind('MoveDiv').bind('Div1').offSet({x:0,y:0});
通过多次调用bind方法可以绑定任意多个Div标签;

offSet设置偏移,默认x偏移和y偏移都为0,供调整使用

本方法不能通过子元素绑定操作父元素

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
  2. <html xmlns="http://www.w3.org/1999/xhtml"> 
  3. <head> 
  4. <title> 鼠标拖动层(可任意绑定DIV标签)(二) </title> 
  5. <script language="javascript" type="text/javascript">
  6. /*
  7. 鼠标拖动层(可任意绑定DIV标签)(一)
  8. 作者:Anlige
  9. 联系方式:1034555083/zhanghuiguoanlige@126.com

  10. 调用方法:Endrag.bind('MoveDiv').bind('Div1').offSet({x:0,y:0});
  11. 参数说明:bind的参数为Div标签的ID属性或者Div对象本身;offSet的参数为偏移量,默认(不调用本方法)x,y偏移都为0
  12. 说明:通过多次调用bind方法绑定多个对象的拖动
  13. */ 
  14.   Endrag={
  15.     x0:0,y0:0,x1:0,y1:0,moveable:false,index:100,NS:(navigator.appName=='Netscape'),offSets:{x:0,y:0},
  16.     //开始拖动;  
  17.     startDrag:function (e){
  18.         e = e ? e : (window.event ? window.event : null);
  19.         Endrag.getFocus(this); 
  20.         if(e.button==(Endrag.NS)?0 :1)  { 
  21.             if(!Endrag.NS){this.setCapture()}
  22.             Endrag.x0 = e.clientX ;  
  23.             Endrag.y0 = e.clientY ;  
  24.             Endrag.x1 = parseInt(Endrag.abs(this).x);  
  25.             Endrag.y1 = parseInt(Endrag.abs(this).y);    
  26.             Endrag.moveable = true;  
  27.         }  
  28.     },  
  29.     //拖动;  
  30.     drag:function (e){
  31.         e = e ? e : (window.event ? window.event : null);  
  32.         if(Endrag.moveable){  
  33.             this.style.left = (Endrag.x1 + e.clientX - Endrag.x0 - Endrag.offSets.x) + "px"; 
  34.             this.style.top  = (Endrag.y1 + e.clientY - Endrag.y0 - Endrag.offSets.y) + "px"; 
  35.         }  
  36.     },  
  37.     //停止拖动;  
  38.     stopDrag:function (e){  
  39.         if(Endrag.moveable)  {    
  40.             if(!Endrag.NS){this.releaseCapture();}
  41.             Endrag.moveable = false;  
  42.         }  
  43.     },
  44.     //获得焦点;  
  45.     getFocus:function (obj){  
  46.         if(obj.style.zIndex!=this.index){  
  47.             this.index += 2;  
  48.             var idx = this.index;  
  49.             obj.style.zIndex=idx;  
  50.         }  
  51.     },
  52.     abs:function (element) {
  53.         var result = { x: element.offsetLeft, y: element.offsetTop};
  54.         element = element.offsetParent;
  55.         while (element) {
  56.             result.x += element.offsetLeft;
  57.             result.y += element.offsetTop;
  58.             element = element.offsetParent;
  59.         }
  60.         return result;
  61.     }, 
  62.     offSet:function(setting){
  63.         this.offSets=setting;
  64.     },
  65.     bind:function(obj){
  66.         obj=typeof(obj)=="object" ? obj:document.getElementById(obj);
  67.         obj.onmousedown=Endrag.startDrag;
  68.         obj.onmouseup=Endrag.stopDrag;
  69.         obj.onmousemove=Endrag.drag;
  70.         return this;
  71.     }
  72. };
  73. </script> 
  74. </head> 
  75. <body onload="Endrag.bind('MoveDiv').bind('Div1').offSet({x:0,y:0});"> 
  76. <div id="MoveDiv" style="background:#ffffff;position:absolute;left:200px;top:50px;width:500px;height:200px;border:1px #dddddd solid;"> 
  77. <div id="hand" style="line-height:25px;text-align:center;background:#f00"> 
  78. 拖动层
  79. </div> 
  80. 调用方法<br />
  81. Endrag.bind('MoveDiv').bind('Div1').offSet({x:0,y:0});<br />
  82. 可以绑定任意多个Div标签;<br />offSet设置偏移,默认x偏移和y偏移都为0,供调整使用<br />
  83. 本方法不能通过子元素绑定操作父元素
  84. </div> 
  85. <div id="Div1" style="background:#ffffff;position:absolute;left:400px;top:300px;width:300px;height:200px;border:1px #dddddd solid;"> 
  86. <div id="Div2" style="line-height:25px;text-align:center;background:#f00"> 
  87. 拖动层 
  88. </div> 

  89. </div> 
  90. </body> 
  91. </html>
复制代码
文/ 惜潭   出处/CSDN