自定义布局(转)

// 控件之间的间距
var space = 33;

//装载显示在左边的DIV
var leftObjs = [];
// 装载显示在中间的DIV,目前没用到,扩展成三列时用到
var centerObjs = [];
//装载显示在右边的DIV
var rightObjs = [];

var layout="maxMin";		// 默认为中间对中间版式,目前可选值为:"centerCenter" , "maxMin" , "minMax"
var isLayout = false;		// 表示当前用户是否正在布局,默认为没有
var isMouseDown = false;	// 表示鼠标是否被按下,默认为没有,用于拖动版块时

// 记录版块拖动时的前一个位置的坐标
var divLeft = 0;
var divTop = 0;
// 记录正在拖动的div
var activeDiv = null;
// 记录版块拖动时鼠标的前一个位置的坐标
var oldX =0;
var oldY = 0;


// 得到距离左边的距离
function getOffsetLeft(e)
{
	var offLeft = 0;	
	while(e)
	{
		offLeft += e.offsetLeft;		
		e = e.offsetParent;
	}	
	return offLeft;
}

// 得到距离顶端的距离
function getOffsetTop(e)
{
	var offTop = 0;
	while(e)
	{
		offTop += e.offsetTop;
		e = e.offsetParent;
	}
	return offTop;
}


// 给装载对象布局
function layoutObjs()
{
	// 得到初始布局高度
	var initTop = getOffsetTop($("#pageHeader").get(0)) + $("#pageHeader").get(0).offsetHeight;
	var itTop = initTop;
	var i;
	
	for(i = 0 ; i < leftObjs.length ; i++)
	{
		$(leftObjs[i]).removeAttr("class");
		$(leftObjs[i]).addClass("share");
		$(leftObjs[i]).css({top:itTop});
		itTop += leftObjs[i].offsetHeight + 10;

		// 根据参数动态加载布局样式
		if(layout=="centerCenter")
		{
			$(leftObjs[i]).addClass("centerLeft");
		}
		else if(layout == "maxMin")
		{
			$(leftObjs[i]).addClass("maxLeft");
		}
		else if(layout == "minMax")
		{
			$(leftObjs[i]).addClass("minLeft");
		}
	}
		

	itTop = initTop;
	for(i = 0 ; i < rightObjs.length; i++)
	{
		$(rightObjs[i]).removeAttr("class");
		$(rightObjs[i]).addClass("share");
		$(rightObjs[i]).css({top:itTop});
		itTop += rightObjs[i].offsetHeight + 10;

		if(layout=="centerCenter")
		{
			$(rightObjs[i]).addClass("centerRight");
		}
		else if(layout == "maxMin")
		{
			$(rightObjs[i]).addClass("minRight");
		}
		else if(layout == "minMax")
		{
			$(rightObjs[i]).addClass("maxRight");
		}
	}
	
}


// 初始化装载对象
function initObjs()
{
	
	leftObjs.push($("#userInfo").get(0));
	leftObjs.push($("#content").get(0));
	rightObjs.push($("#time").get(0));
	rightObjs.push($("#weather").get(0));	

	/*
	leftObjs[0] = $("#userInfo").get(0);
	leftObjs[1] = $("#content").get(0);
	rightObjs[0] = $("#time").get(0);
	rightObjs[1] = $("#weather").get(0);
	*/

	layoutObjs();
}



var dragFn = function drag()
{
	if(isLayout)
	{
		oldX = event.clientX + document.body.scrollLeft;
		oldY = event.clientY + document.body.scrollTop;		
		divLeft = getOffsetLeft(this);
		divTop = getOffsetTop(this);			
		
		// 记录实际需要拖动布局的控件DIV
		activeDiv = this;
		
		// 构造一个临时的悬浮DIV,相当于复制一个实际被拖动的对象
		$("#tempDiv").html($(this).html());
		$("#tempDiv").css({visibility:"visible",left:divLeft,top:divTop,width:this.offsetWidth,height:this.offsetHeight});
		$("#tempDiv").fadeTo("fast" , 0.4 , function(){});

		isMouseDown = true;
		$("#tempDiv").mousemove(moveFn);	
	}
};

// 移动其他元素填补隐藏控件的位置
function moveUp()
{
	// 标识是否匹配到拖动元素
	var flag = false;
	var index = -1;

	// 需要遍历所有对象数组

	for(var i = 0 ; i < leftObjs.length; i++)
	{
		if(leftObjs[i] == activeDiv)
		{
			index = i;
			flag = true;
		}
		else
		{
			if(flag)
			{
				// 往前挪动
				leftObjs[i-1] = leftObjs[i];
			}
		}
	}

	if(index >= 0)
	{
		// 弹出最后一个对象
		leftObjs.pop();

		// 在界面上移动其他元素
		for(var i = index ; i < leftObjs.length; i++)
		{
			divTop = getOffsetTop(leftObjs[i]);
			divTop -= ($("#tempDiv").get(0).offsetHeight + 20 + document.body.scrollTop);
			$(leftObjs[i]).css({top:divTop});
		}
		return ;
	}

/*	扩展成三列时用到
	for(var i = 0 ; i< centerObjs.length; i++)
	{}
*/	

	index = -1;
	for(var i = 0 ; i< rightObjs.length; i++)
	{
		if(rightObjs[i] == activeDiv)
		{
			index = i;
			flag = true;
		}
		else
		{
			if(flag)
			{
				// 往前挪动
				rightObjs[i-1] = rightObjs[i];
			}
		}
	}

	if(index >= 0)
	{
		// 弹出最后一个对象
		rightObjs.pop();

		// 在界面上移动其他元素
		for(var i = index ; i < rightObjs.length; i++)
		{
			divTop = getOffsetTop(rightObjs[i]);
			divTop -= ($("#tempDiv").get(0).offsetHeight + 20 + document.body.scrollTop);
			$(rightObjs[i]).css({top:divTop});
		}
		return ;
	}
}

// 找到拖动元素的新位置,找到时需要先去掉该元素的旧位置
function findNewPosition()
{
	// 记录拖动元素在对象数组中的下标
	var index = -1;
	if(    (layout=="centerCenter" && oldX < 500 ) 
		|| (layout=="maxMin" && oldX < 666 )
		|| (layout=="minMax" && oldX <= 334 ))
	{
		// 记录数组长度
		var arrayLen = leftObjs.length;
		
		// 左边数组没有元素时,即界面上左边为空的情况
		if(arrayLen <= 0)
		{
			moveUp();
			leftObjs[0] = activeDiv;

			divTop = getOffsetTop($("#pageHeader").get(0)) + $("#pageHeader").get(0).offsetHeight;
		}
		// 判断是否加在最末尾
		else if(oldY >= (getOffsetTop(leftObjs[arrayLen-1]) + leftObjs[arrayLen-1].offsetHeight))
		{
			index = arrayLen;
			moveUp();// 调用该函数可能改变当前数组的长度,故需要进行判断
			if(arrayLen > leftObjs.length)
				index--;				

			leftObjs[index] = activeDiv;
			
			// 获得拖动元素新位置的top值
			divTop = getOffsetTop(leftObjs[index-1]) + leftObjs[index-1].offsetHeight + 10;
		}
		else
		{
			// 再判断其他元素
			for(var i = arrayLen-1  ; i >=0 ; i--)
			{
				var temp = getOffsetTop(leftObjs[i]) - 10;
				if(oldY > temp)
				{
					leftObjs[i+1] = leftObjs[i];
					index = i;
					moveUp();// 调用该函数可能改变当前数组的长度,故需要进行判断
					if(arrayLen > leftObjs.length)
						index--;					

					leftObjs[index] = activeDiv;

					// 获得拖动元素新位置的top值
					if(index == 0)	// 如果是加在最前面
						divTop = getOffsetTop($("#pageHeader").get(0)) + $("#pageHeader").get(0).offsetHeight;
					else
						divTop = getOffsetTop(leftObjs[index-1]) + leftObjs[index-1].offsetHeight + 10;

					break;
				}
				else
				{
					leftObjs[i+1] = leftObjs[i];
				}
			}
		}	
		if(layout == "centerCenter")
			$(activeDiv).addClass("centerLeft");
		else if(layout == "maxMin")
			$(activeDiv).addClass("maxLeft");
		else if(layout == "minMax")
			$(activeDiv).addClass("minLeft");
	}
	else
	{
		// 记录数组长度
		var arrayLen = rightObjs.length;

		// 右边数组没有元素时,即界面上右边为空的情况
		if(arrayLen <= 0)
		{
			moveUp();
			rightObjs[0] = activeDiv;

			divTop = getOffsetTop($("#pageHeader").get(0)) + $("#pageHeader").get(0).offsetHeight;
		}
		// 判断是否加在最末尾
		else if(oldY >= (getOffsetTop(rightObjs[arrayLen-1]) + rightObjs[arrayLen-1].offsetHeight))
		{
			index = arrayLen;

			moveUp();// 调用该函数可能改变当前数组的长度,故需要进行判断
			if(arrayLen > rightObjs.length)
				index--;				

			rightObjs[index] = activeDiv;
			
			// 获得拖动元素新位置的top值			
			divTop = getOffsetTop(rightObjs[index-1]) + rightObjs[index-1].offsetHeight + 10;
		}
		else
		{
			// 再判断其他元素
			for(var i = arrayLen-1  ; i >=0 ; i--)
			{
				var temp = getOffsetTop(rightObjs[i]) - 10;
				if(oldY > temp)
				{
					rightObjs[i+1] = rightObjs[i];
					index = i;
					moveUp();// 调用该函数可能改变当前数组的长度,故需要进行判断
					if(arrayLen > rightObjs.length)
						index--;					

					rightObjs[index] = activeDiv;

					// 获得拖动元素新位置的top值
					if(index == 0)	// 如果是加在最前面
						divTop = getOffsetTop($("#pageHeader").get(0)) + $("#pageHeader").get(0).offsetHeight;
					else
						divTop = getOffsetTop(rightObjs[index-1]) + rightObjs[index-1].offsetHeight + 10;

					break;
				}
				else
				{
					rightObjs[i+1] = rightObjs[i];
				}
			}
		}
		if(layout == "centerCenter")
			$(activeDiv).addClass("centerRight");
		else if(layout == "maxMin")
			$(activeDiv).addClass("minRight");
		else if(layout == "minMax")
			$(activeDiv).addClass("maxRight");
	}

	// 重新设置拖动元素位置
	$(activeDiv).css({top:divTop});
	$(activeDiv).removeAttr("class");
	$(activeDiv).addClass("share");
	layoutObjs();
}

var dropFn = function drop()
{	
	if(isLayout)
	{		
		isMouseDown = false;
		// 记录鼠标放下时的坐标
		oldX = event.clientX + document.body.scrollLeft;
		oldY = event.clientY + document.body.scrollTop;		

		// 只是隐藏了临时控件,但它目前仍然记录着实际控件的各种信息,将用到
		$("#tempDiv").css("visibility" , "hidden");

		// 通过鼠标位置判断拖动控件新位置
		findNewPosition();
	}
};

var moveFn = function move()
{
	if(isMouseDown)
	{
		var newX = event.clientX + document.body.scrollLeft;
		var newY = event.clientY + document.body.scrollTop;
		// 设置被拖动版块的新位置
		divLeft += (newX - oldX);
		divTop += (newY - oldY);
		oldX = newX;
		oldY = newY;
		$("#tempDiv").css({left:divLeft,top:divTop});
	}
};

// 初始化页头以及一些触发事件
function initLayout()
{
	// 设置版式触发事件
	$("#close").click(function(){
		$("#layout").hide("slow");
	});

	$("#layoutTool").click(function(){
		$("#layout").css("visibility","visible");
		$("#layout").show("slow");
	});

	$("#centerCenter").click(function(){
		layout = "centerCenter";
		layoutObjs();
	});

	$("#maxMin").click(function(){
		layout = "maxMin";
		layoutObjs();
	});

	$("#minMax").click(function(){
		layout = "minMax";
		layoutObjs();
	});

	$("#beginLayout").click(function(){
		$("#beginLayout").css("display" , "none");
		$("#stopLayout").css("display" , "inline");
		isLayout = true;
		// 设置可以拖动控件时显示的光标
		$(".share").addClass("dragCursor");
	});

	$("#stopLayout").css("display" , "none");

	$("#stopLayout").click(function(){
		$("#stopLayout").css("display" , "none");
		$("#beginLayout").css("display" , "inline");
		isLayout = false;
		// 不可拖动控件时去掉移动光标
		$(".share").removeClass("dragCursor");
	});
}

// 页面下载完后执行的函数
var readyFn = function ready()
{
	// 初始布局
	initLayout()

	// 初始布局控件
	initObjs();

	// 设置版块拖动时所响应的函数
	/*
	$("#content").mousedown(dragFn);
	$("#userInfo").mousedown(dragFn);
	$("#time").mousedown(dragFn);
	$("#weather").mousedown(dragFn);
	*/
	$(".share").mousedown(dragFn);

	$("#tempDiv").mouseup(dropFn);

}

$(readyFn);

layout.css:

body
{
	position:absolute;
}

#tempDiv
{
	position:absolute;
	z-index:100;
	/* visibility:hidden; */
}

.divHeader
{
	font-size:large;
	font-weight:bold;
	text-align:left;
}

.toolClass
{
	display:inline;
	color:red;
	margin-left:5px;
	margin-right:5px;
}

#layout
{
	z-index:10;
	position:absolute;
	left:0;
	top:0;
	width:100%;
	height:100px;
	text-align:center;
	background:yellow;
	visibility:hidden;
}

#centerCenter,#maxMin,#minMax
{
	width:200px;
	display:inline;
	margin-top:20px;
}

#close
{
	float:right;
	margin-right:15px;
	color:red;
}

#pageHeader
{
	background:yellow;
	height:1.5em;
	padding-top:5px;
	position:absolute;
	top:0;
	left:0;
	width:100%;
	text-align:left;
	padding-left:20px;
}


.share
{
	padding:5px;
	background:gray;
	position:absolute;
}

.dragCursor
{
	cursor:move;
}

.minRight
{
	width:300px;
	right:33px;
}

.maxLeft
{
	width:600px;
	left:33px;
}

.minLeft
{
	width:300px;
	left:33px;
}

.maxRight
{
	width:600px;
	right:33px;
}

.centerLeft
{
	width:450px;
	left:33px;
}

.centerRight
{
	width:450px;
	right:33px;
}

#time,#userInfo,#weather
{
	height:150px;
}

#content
{
	height:350px;
}

  html

  

<html>

<head><title></title>

<link rel="stylesheet" href="layout.css" />
<script language="javascript" type="text/javascript" src="../jquery-1[1].2.6.js"></script>
<script language="javascript" type="text/javascript" src="layout.js"></script>

</head>

<body>
<!-- 临时的悬浮DIV -->
<div id="tempDiv" class="share"></div>

<!-- 显示布局版式 -->
<div id="layout">
	<div id="centerCenter">
		中间/中间
	</div>
	
	<div id="maxMin">
		大/小
	</div>

	<div id="minMax">
		小/大
	</div>

	<div id="close">
		关闭
	</div>
</div>


<!-- 定义可供用户布局的控件 -->
<!-- 显示时间的控件 -->
<div id="time" class="share" dragDiv="true">
	<div class="divHeader">时间</div>
	<div>
	the time is 2008-07-27
	</div>
</div>

<!-- 显示用户个人信息的控件 -->
<div id="userInfo" class="share" dragDiv="true">
	<div class="divHeader">个人信息</div>
	<div>
	hello:sunhao
	</div>
</div>

<!-- 显示天气的控件 -->
<div id="weather" class="share" dragDiv="true">
	<div class="divHeader">天气</div>
	<div>
	今 22℃~32℃ 明 22℃~30℃ 
	</div>
</div>

<!-- 显示正文的控件 -->
<div id="content" class="share" dragDiv="true">
	<div class="divHeader">正文</div>
	<div>
	<pre>
	汉皇重色思倾国,御宇多年求不得.
	杨家有女初长成,养在深闺人未识.
	天生丽质难自弃,一朝选在君王侧.
	回眸一笑百媚生,六宫粉黛无颜色.
	春寒赐浴华清池,温泉水滑洗凝脂.
	侍儿扶起娇无力,始是新承恩泽时.
	云鬓花颜金步摇,芙蓉帐暖度春宵.
	春宵苦短日高起,从此君王不早朝.
	承欢侍宴无闲暇,春从春游夜专夜.
	后宫佳丽三千人,三千宠爱在一身.
	</pre>
	</div>
</div>


<div id="pageHeader">
	工具条:
	<div id="layoutTool" class="toolClass">打开版式</div>
	<div id="beginLayout" class="toolClass">开始布局</div>
	<div id="stopLayout" class="toolClass">停止布局</div>
</div>

</body>

</html>

  

转自:www.iteye.com/topic/222353

猜你喜欢

转载自www.cnblogs.com/ihzeng/p/9632110.html