自定義佈局(轉)

// 控件之間的間距
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:javascript

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;
}

  htmlcss

  

<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/222353html

相關文章
相關標籤/搜索