Div托拽移动

基于Jquery的Div托拽移动方法。在IE6、IE8、Chrome、FireFox、Opera下测试通过。兼容性主要取决于代码中的两组变量:X,Y和offx,offy。谁有更佳的赋值方法,请指出来。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Div托拽移动-CSDN-win32fan</title>
  
<script language="javascript" src="js/jquery162.js"></script><!--我引用的jquery库,可用你自己的替代,无版本要求-->
<script language="javascript" type="text/javascript">
  
/*div托移动位置
 dragDiv jquery对象,实施托拽的div
 moveDiv jquery对象,被托拽的的div
 
 dragDiv可以是moveDiv的子元素,也可以等于moveDiv
 
 注意:需要指定xhtml文档类型,比如:
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 作者:win32fan QQ:184263203
*/
function Drag(dragDiv,moveDiv)
{
	var ie6 = false;
    if ($.browser.msie && $.browser.version == "6.0") {
		ie6 = true;
    }
	
	var dd = dragDiv;
	var md = moveDiv;
	
	var X;
	var Y;

	var offx = 0;
	var offy=0;
	
	var width;
	var height;
	var bodyw;
	var bodyh;
	
	var mgx;
	var mgy;
	
	var down = false;

	//absolute下可能因托拽而撑大body,所以非IE6之下用fixed。
	moveDiv.css("position",ie6 ? "absolute" : "fixed");
	
	dragDiv.bind("mousedown",function(evt){			  
		dd.css("cursor","move");
		evt=evt || window.event; 
		
		//X Y offx offy是托拽计算的核心,赋值方法要考虑兼容性,欢迎大家提出更好、更兼容的赋值法。
		X = evt.originalEvent.clientX;
		Y = evt.originalEvent.clientY;
		offx = X - parseInt(md.offset().left);
		offy = Y - parseInt(md.offset().top);

		mgx = parseInt(md.css("margin-left"));
		mgy = parseInt(md.css("margin-top"));
		
		width = md.width();
		height = md.height();
		
		bodyw = document.documentElement.clientWidth-16;
		bodyh = document.documentElement.clientHeight;
		
		down = true;
			
        inFstop(evt);    
        inFabort(evt);
	});

	dragDiv.bind("mouseup",function(evt){
		dd.css("cursor","default");
		down = false;
	});
	
	dragDiv.bind("mousemove",function(evt){							  
		evt=evt || window.event; 

		X = evt.originalEvent.clientX;
		Y = evt.originalEvent.clientY;
		
		if(!down){return;}
		
		var left = X - offx - mgx;
		var top = Y - offy - mgy;

		//发现光标如果进入了不可见区域(客户区以外),移动可能发生混乱,这里进行预防。
		if(X < 16 || X > bodyw - 16 || Y < 16 || Y > bodyh - 16){
			inFstop(evt); 
			inFabort(evt);
			return;
		}
		
		//防止i6下把body额外给撑大,因为IE6下只能用absolute,这种模式下被托动div其定位依靠文档中相邻对象,因而其大小也被计入文档大小。
		if(ie6 && (top <= 0 || left <= 0 || top + height >= bodyh || left + width >= bodyw )){
			inFstop(evt); 
			inFabort(evt);
			return;
		}

		md.css("left",left + "px");
		md.css("top",top + "px");
		inFstop(evt); 
		inFabort(evt);
	});
	
	//和inFabort都是为了协调本类的托拽操作和浏览器默认的托拽操作不冲突。
	function inFstop(evt){
		 var e=(evt)?evt:window.event;
		 if (window.event) {
		    e.cancelBubble=true;//ie下阻止冒泡
		 } else {
		    e.stopPropagation();//其它浏览器下阻止冒泡
		 }         
	} 
	
	function inFabort(e){
       if ( e && e.preventDefault ) 
        e.preventDefault(); 
       else 
        window.event.returnValue = false; 
	} 
}
</script>
</head>

<body>

<div id="dm" style='margin-top:50px;margin-left:100px;width:400px;height:400px;border:#000 solid 1px;'>
<div id="dd" style='width:400px;height:40px;line-height:40px;background-color:#3366FF;color:#FFFFFF;'> 点蓝色部分托拽移动</div>
</div>


<script language="javascript" type="text/javascript">
var d = new Drag($("#dd"),$("#dm"));
</script>
</body>
</html>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值