Показать сообщение отдельно
  #2 (permalink)  
Старый 14.05.2009, 17:33
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Что-то больно много кода для такой маленькой функции... Мне как-то тожн нечего было делать и я написал вот что:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Untitled Document</title>
<style type="text/css">
body, html{
	margin:0;
	padding:0;
	overflow:hidden;
	width:100%;
	height:100%;
}
div{
	background-color:#CCC;
	margin:10px;
	border:#F00 1px solid;
}
#wBody{
	position:absolute;
	top:50px;
	left:50px;
	width:250px;
	height:250px;
	margin:0;
}
</style>
<script etype="text/javascript">
function xGetElementById(e){
  if(!xStr(e)) return e;
  if(document.getElementById) return document.getElementById(e);
  else if(document.all) return document.all[e];
}
function xDef() {
  for(var i=0; i<arguments.length; ++i){if(typeof(arguments[i])=='undefined') return false;}
  return true;
}
function xStr() {
  for(var i=0; i<arguments.length; ++i){if(typeof(arguments[i])!='string') return false;}
  return true;
}
function xNum() {
  for(var i=0; i<arguments.length; ++i){if(typeof(arguments[i])!='number') return false;}
  return true;
}
function getCS(e,s1,s2){
	if(xDef(e.currentStyle)) var s=parseInt(eval('e.currentStyle.'+s1));
	else if(xDef(window.getComputedStyle)) var s=parseInt(window.getComputedStyle(e,'').getPropertyValue(s2));
	return (isNaN(s))?0:s;
}
function getBorderWidth(e,width){
	if(width)return getCS(e,'borderTopWidth','border-top-width')+getCS(e,'borderBottomWidth','border-bottom-width');
	else return getCS(e,'borderLeftWidth','border-left-width')+getCS(e,'borderRightWidth','border-right-width')
}
function xTop(e,y){
	if(xDef(y)) e.style.top=y+'px';
	else return e.offsetTop-getCS(e,'marginTop','margin-top');
}
function xLeft(e,x){
	if(xDef(x)) e.style.left=x+'px';
	else return e.offsetLeft-getCS(e,'marginLeft','margin-left');
}
function xWidth(e,w){
	if(w){if(w>0) e.style.width=w+'px'; else return 0}
	else if(xNum(e.style.width)) return parseInt(e.style.width);
	else return e.clientWidth+getBorderWidth(e,true);
}
function xHeight(e,h){
	if(h){if(h>0) e.style.height=h+'px'; else return 0}
	else if(xNum(e.style.height)) return parseInt(e.style.height);
	else return e.clientHeight+getBorderWidth(e);
}
</script>
</head>

<body>
<div id="wBody">
Parent
<div id="wDrag">wDrag</div>
<div id="wReSizeXY">wReSizeXY</div>
<div id="wReSizeX">wReSizeX</div>
<div id="wReSizeY">wReSizeY</div>
<div id="wClose">wClose</div>
</div>

<script etype="text/javascript">
var wBody=xGetElementById('wBody');
var wDrag=xGetElementById('wDrag');
var wReSizeXY=xGetElementById('wReSizeXY');
var wReSizeX=xGetElementById('wReSizeX');
var wReSizeY=xGetElementById('wReSizeY');
var wClose=xGetElementById('wClose');

initWindow(wBody,wDrag,false,true,true);
initWindow(wBody,wReSizeXY,true,true,true);
initWindow(wBody,wReSizeX,true,true,false);
initWindow(wBody,wReSizeY,true,false,true);

wClose.onclick=function(){
	document.body.removeChild(wBody);
}
	
function initWindow(oBody,oInitEvent,eType,useX,useY){
	oInitEvent.onmousedown=function(event){
		event=event||window.event;
		var fncX=(eType)?xWidth:xLeft;
		var fncY=(eType)?xHeight:xTop;
		var x=event.clientX-fncX(oBody);
		var y=event.clientY-fncY(oBody);
		var minW=200;
		var minH=200;
		var cW=document.documentElement.clientWidth;
		var cH=document.documentElement.clientHeight;
		document.onmousemove=function(event){
			event=event||window.event;
			if(useX){
				fncX(oBody,event.clientX-x);
				if(eType){
					if((xWidth(oBody)>minW)?false:xLeft(oBody)+minW>event.clientX)xWidth(oBody,minW);
					if(xWidth(oBody)+xLeft(oBody)>cW)xWidth(oBody,cW-xLeft(oBody)-getBorderWidth(oBody,true));
				}else{
					if(xLeft(oBody)+xWidth(oBody)>cW)xLeft(oBody,cW-xWidth(oBody));
					if(xLeft(oBody)<0)xLeft(oBody,0);
				}
			}
			if(useY){
				fncY(oBody,event.clientY-y);
				if(eType){
					if((xHeight(oBody)>minH)?false:xTop(oBody)+minH>event.clientY)xHeight(oBody,minH);
					if(xHeight(oBody)+xTop(oBody)+getBorderWidth(oBody)>cH)xHeight(oBody,cH-xTop(oBody)-getBorderWidth(oBody));
				}else{
					if(xTop(oBody)+xHeight(oBody)>cH)xTop(oBody,cH-xHeight(oBody));
					if(xTop(oBody)<0)xTop(oBody,0);
				}
			}
		}
		document.onmouseup=function(){
			if(!eType){
				oBody.style.top=xTop(oBody)*100/cH+'%';
				oBody.style.left=xLeft(oBody)*100/cW+'%';
			}
			document.onmousemove=function(){return false;}
		}
	}
}

</script>
</body>
</html>


Помимо перетаскивания, умеет ресайзить X, Y и X+Y и закрывацца... По сути - окно...
Полностью кроссбраюзерно и быстро...

Для того, чтобы назначить объект для таскания используем функцию

initWindow(oBody,oInitEvent,eType,useX,useY)


Параметры:
oBody - узел, подвергающийся тасканию/ресайзу
oInitEvent - узел, который инициализирует событие
eType - тип события. Булево значение: true - ресайз, false - драг.
useX,useY - использовать координаты X и/или Y соответственно. Например, можно таскать/ресайзить только по X.
Ответить с цитированием