javascript拖动布局 - 适合在几个容器里把容器里的元素在各个容器里拖来拖去

近阶段项目里需要用到拖动布局,就先写个DEMO试试看,效果如下:(部分资料来源于网上)


目标:

1、有三个目标容器,如图所示,是三个竖着的虚线框,每个容器里有若干个允许拖动的元素。

2、拖动任何一个元素,可以拖放到任何一个容器内。

3、在同一个容器里拖动不改变什么。


一、先准备html页面

1、定义容器:<div class="dragitems" ></div>

2、定义容器内被拖动的元素:<div class="dragitem" id="xxxx"></div>

也就是说需要让 className为“dragitem”的DIV能在className为"dragitems"的DIV里任意拖放,对其他页面上的元素没任何要求,这样使用可以简单点。(容器的ID为任何字符串,不重复就行)

页面代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk" />
<script type="text/javascript" src="jquery-1.7.1.min.js"></script>
<script type="text/javascript" src="drag.js"></script>
<title>js拖动布局 - 适合在几个容器里把容器里的元素在各个容器里拖来拖去</title>
<style type="text/css">
body{
margin:0px auto;
height:100%;
}
#root{
margin:0px auto;
width:770px;
}
.dragitems{
padding:5px;
width:200px;
float:left;
margin:auto 10px;
border:1px dotted #ccc;
}
.dragitem{
border:1px solid #FFCC66;
height:130px;
margin-bottom:10px;
background-color:#FFFFFF;
}
</style>
</head>
<body>
<div style="text-align:center;padding:10px;">
<a href="#" οnclick="dragUI.startDrag('dragitems','dragitem');return false;">启动拖动功能</a>
<a href="#" οnclick="dragUI.stopDrag();return false;">关闭拖动功能</a>
</div>
<div id="root">
  <div class="dragitems" id="dragitems1">
    <div class="dragitem">
      <table width="100%" border="0" cellspacing="0" cellpadding="0">
        <tbody>
  <tr>
          <td height="30" colspan="3" bgcolor="#FFFFCC"> </td>
        </tr>
        <tr>
          <td height="30"> </td>
          <td height="30">1_1</td>
          <td height="30"> </td>
        </tr>
        <tr>
          <td height="30"> </td>
          <td height="30"> </td>
          <td height="30"> </td>
        </tr>
        <tr>
          <td height="30"> </td>
          <td height="30"> </td>
          <td height="30"> </td>
        </tr>
  </tbody>
      </table>
    </div>
    <div class="dragitem">
      <table width="100%" border="0" cellspacing="0" cellpadding="0">
        <tr>
          <td height="30" colspan="3" bgcolor="#FFFFCC"> </td>
        </tr>
        <tr>
          <td height="30"> </td>
          <td height="30">1_2</td>
          <td height="30"> </td>
        </tr>
        <tr>
          <td height="30"> </td>
          <td height="30"> </td>
          <td height="30"> </td>
        </tr>
        <tr>
          <td height="30"> </td>
          <td height="30"> </td>
          <td height="30"> </td>
        </tr>
      </table>
    </div>
  </div>
  <div class="dragitems" id="dragitems2">
    <div class="dragitem">
      <table width="100%" border="0" cellspacing="0" cellpadding="0">
        <tr>
          <td height="30" colspan="3" bgcolor="#FFFFCC"> </td>
        </tr>
        <tr>
          <td height="30"> </td>
          <td height="30">2_1</td>
          <td height="30"> </td>
        </tr>
        <tr>
          <td height="30"> </td>
          <td height="30"><input name="test" type="text" id="test" /></td>
          <td height="30"> </td>
        </tr>
        <tr>
          <td height="30"> </td>
          <td height="30"> </td>
          <td height="30"> </td>
        </tr>
      </table>
    </div>
    <div class="dragitem">
      <table width="100%" border="0" cellspacing="0" cellpadding="0">
        <tr>
          <td height="30" colspan="3" bgcolor="#FFFFCC"> </td>
        </tr>
        <tr>
          <td height="30"> </td>
          <td height="30">2_2</td>
          <td height="30"> </td>
        </tr>
        <tr>
          <td height="30"> </td>
          <td height="30"> </td>
          <td height="30"> </td>
        </tr>
        <tr>
          <td height="30"> </td>
          <td height="30"> </td>
          <td height="30"> </td>
        </tr>
      </table>
    </div>
    <div class="dragitem">
      <table width="100%" border="0" cellspacing="0" cellpadding="0">
        <tr>
          <td height="30" colspan="3" bgcolor="#FFFFCC"> </td>
        </tr>
        <tr>
          <td height="30"> </td>
          <td height="30"> </td>
          <td height="30"> </td>
        </tr>
        <tr>
          <td height="30"> </td>
          <td height="30">2_3</td>
          <td height="30"> </td>
        </tr>
        <tr>
          <td height="30"> </td>
          <td height="30"> </td>
          <td height="30"> </td>
        </tr>
      </table>
    </div>
  </div>
  <div class="dragitems" id="dragitems3">
    <div class="dragitem">
      <table width="100%" border="0" cellspacing="0" cellpadding="0">
        <tr>
          <td height="30" colspan="3" bgcolor="#FFFFCC"> </td>
        </tr>
        <tr>
          <td height="30"> </td>
          <td height="30"> </td>
          <td height="30"> </td>
        </tr>
        <tr>
          <td height="30">3_1</td>
          <td height="30"> </td>
          <td height="30"> </td>
        </tr>
        <tr>
          <td height="30"> </td>
          <td height="30"> </td>
          <td height="30"> </td>
        </tr>
      </table>
    </div>
    <div class="dragitem">
      <table width="100%" border="0" cellspacing="0" cellpadding="0">
        <tr>
          <td height="30" colspan="3" bgcolor="#FFFFCC"> </td>
        </tr>
        <tr>
          <td height="30"> </td>
          <td height="30"> </td>
          <td height="30"> </td>
        </tr>
        <tr>
          <td height="30"> </td>
          <td height="30"> </td>
          <td height="30"> </td>
        </tr>
        <tr>
          <td height="30"> </td>
          <td height="30"> </td>
          <td height="30">3_2</td>
        </tr>
      </table>
    </div>
  </div>
</div>
</body>
</html>

二、写javascript文件

这里引用了jquery 1.7版本,老项目,更新了怕出轨。思路如下:

1、在启动拖放功能的时候,做好初始化工作。

先在body里放一个临时对象,用来存放当前拖动的元素,再把所有的允许拖动的元素绑定mousedown事件,在事件里做好初始化工作,为鼠标移动事件做准备。参考代码:

function(dragitems,dragitem){
		if(!dragitems || !dragitem){
			alert("request param");
			return;
		}
		this.dragitems = dragitems;
		this.dragitem = dragitem;
		document.onmousemove = this.mouseMove;
		document.onmouseup = this.mouseUp;
		dragUI.tempDiv = $("<div id='dragUI_tempDiv' style='position:absolute;display:none;'></div>");
		$("body").append(dragUI.tempDiv);
		$("." + dragUI.dragitem).bind("mousedown",function(){	
			var ev = dragUI.getEvent();
			dragUI.dragObj = this; //被拖动的对象
			dragUI.dragDiv = dragUI.dragObj.parentNode;//启动时存放被拖动对象的容器
			dragUI.curDragDiv = dragUI.dragObj.parentNode;//最后一个存放被拖动对象的容器
			dragUI.dragDivSize = $(dragUI.dragDiv).children("." + dragUI.dragitem).length;//计算存放被拖动对象的容器还剩下几个对象
			dragUI.mouseOffset = dragUI.getMouseOffset(dragUI.dragObj, ev);//获得鼠标的相对被拖动对象的位置
			dragUI.tempDivW = dragUI.dragObj.offsetWidth;//获取被拖动对象的宽度
			dragUI.DragContainer = $("." + dragUI.dragitems);//允许存放被拖动对象的容器列表
			return false;
		});
	}


2、定义鼠标移动事件。

在鼠标移动的时候要把被拖动的元素复制到body的临时对象里去,并让临时对象随着鼠标的位置的改变而移动。同时,需要时刻判断当鼠标的位置位于某个容器内的时候,要及时把拖动元素移动到当前的容器内。参考代码:

function(){
		var ev = dragUI.getEvent();
		var mousePos = dragUI.mouseCoords(ev);
		if (dragUI.dragObj) {
			//可拖动的个数为1,说明拖动后此列就没有拖动元素,为避免此列没有高度而不见,所以设置其高度为20px
			if (dragUI.dragDivSize == 1) dragUI.dragDiv.style.height = "32px";
			dragUI.dragObj.style.display = "none";
			//把拖动的元素加入到临时的tmpDiv中,并设置tmpDiv坐标
			dragUI.tempDiv.html("");
			var tmpnode = dragUI.dragObj.cloneNode(true);
			tmpnode.style.display = "block";
			dragUI.tempDiv.append(tmpnode).css("width",dragUI.tempDivW + "px")
										  .css("background-color","#FFF")
										  .css("top",(mousePos.y - dragUI.mouseOffset.y) + "px")
										  .css("left",(mousePos.x - dragUI.mouseOffset.x) + "px")
										  .show();
			//被拖动对象的中心点的坐标(以鼠标坐标代替)
			var dragObjCntX = mousePos.x;
			var dragObjCntY = mousePos.y;
			//判断tmpDiv所在的容器
			var dragConLen = dragUI.DragContainer.length;
			for (var i = 0; i < dragConLen; i++) {
				var curContainer = dragUI.DragContainer[i];
				var dcPos = dragUI.getPosition(curContainer);
				var dcPosMinX = dcPos.x;
				var dcPosMinY = dcPos.y;
				var dcWidth = curContainer.offsetWidth;
				var dcHeight = curContainer.offsetHeight;
				var dcPosMaxX = dcPosMinX + dcWidth;
				var dcPosMaxY = dcPosMinY + dcHeight;
				if (dragObjCntX > dcPosMinX && dragObjCntX < dcPosMaxX && dragObjCntY > dcPosMinY && dragObjCntY < dcPosMaxY) {
					if($(dragUI.curDragDiv).attr("id") != $(curContainer).attr("id")){
						dragUI.curDragDiv = curContainer;	
						curContainer.appendChild(dragUI.dragObj);
					}
					$(dragUI.dragObj).show();
					break;
				}
			}
		}
		return false;
	}


3、定义鼠标弹起事件

鼠标弹起意味着一次拖动已经结束,做好必要的清理工作,需要和数据库交互的话,相关代码应该写在这里。参考代码:

function(){
		if (dragUI.dragObj) {
			if (dragUI.dragObj.style.display == "none") dragUI.dragObj.style.display = "block";
			dragUI.tempDiv.hide();
			for (var m = 0; m < dragUI.DragContainer.length; m++) {
				var colDiv = dragUI.DragContainer[m];
				var colDivLen = $(colDiv).children("." + dragUI.dragitem).length;
				var colSty = colDiv.getAttribute("style");
				if (colDivLen > 0 && colSty != null) {
					colDiv.removeAttribute("style");
					break;
				}
			}
			dragUI.dragObj = null;
		}
	}



主要思路就是以上三点,其他的就是一些被调用到的方法。


代码打包下载: http://download.csdn.net/detail/gameoverwjl/6839913

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值