MicroSoft Live 和GOOGLE个性主页 页面元素可拖拽放置的实现原理

MicroSoft Live 和GOOGLE个性主页 页面元素可拖拽放置的实现原理

基本上msn、microsoft Live 和GOOGLE个性主页 元素可拖动并放置的的实现原理就是对DOM的操作再加上JAVASCRIPT拖动元素。实现起来实际上并不难,但是要做到很美观并符合用户习惯就需要一些时间思考了。 
以下代码实现了上述功能,虽然很简单,但是基本上说明了原理。实现更高级的功能当然还需要改进。 
<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<html>
<head>
  <title>DropLayer2</title>
  <meta name="GENERATOR" C>
  <meta name="CODE_LANGUAGE" C>
  <meta name="vs_defaultClientScript" c>
  <meta name="vs_targetSchema" chttp://schemas.microsoft.com/intellisense/ie5" target=_blank>http://schemas.microsoft.com/intellisense/ie5">
  <style type="text/css">
    div
{
  border-right: lightgrey thin solid;
  border-top: lightgrey thin solid;
  font-weight: bold;
  z-index: 2;
  text-transform: capitalize;
  border-left: lightgrey thin solid;
  color: white;
  border-bottom: lightgrey thin solid;
  background-color: dimgray;
}
  </style>
</head>
<body>
  <div id="parentDiv" class="parentCss" style="width:100">
  <div class="itemCss" >one 1</div>
  <div class="itemCss" >two 2</div>
  <div class="itemCss" >three 3</div>
  <div class="itemCss" >four 4</div>
  <div class="itemCss" >five 5</div>
  <div class="itemCss" >six 6</div>
  <div class="itemCss" >seven 7</div>
  <div class="itemCss" >eight 8</div>
  <div class="itemCss" >nine 9</div>
  <div class="itemCss" >ten 10</div>
  </div>
  <script language="javascript">
<!-- 
var obj,obj2;  //引发事件对象
var rootNode;    //控制对象根节点 
var IsDrag=false;  //是否抓起

var NullDiv;  //空临时层

var x,y;  //鼠标与控件的相对坐标

window.onload = Prepare; //窗体加载时委托到Prepare
 
function Prepare()
{
  //生成临时层,并设置其属性
  NullDiv = document.createElement("div");
   
  //获得控制对象的根节点元素
  rootNode = document.getElementById("parentDiv");
 
  document.onmousemove=MoveIt; //当鼠标在文档上移动时事件委托到MoveIt
 
  document.onmousedown=Drag;  //当鼠标按下时事件委托到Drag
 
  document.onmouseup=Release;  //当鼠标释放台起时事件委托到Release
 
 
}
 
function Drag()
{

  obj = event.srcElement;
 
  x=0;//event.offsetX;
  y=0;//event.offsetY;
   
  obj.style.position='absolute';
 
  obj.style.posTop=event.y-y;
  obj.style.posLeft=event.x-x;
   
  IsDrag=true;
}

function MoveIt()
{
  //window.status = event.x "|" event.y "|" IsDrag "|" x "|" y;
 
  if(IsDrag)
  {
  obj.style.posTop=event.y-y;
  obj.style.posLeft=event.x-x;
  }
}

function Release()
{
  IsDrag=false;
 
  NullDiv.style.display='none';
 
  obj.style.position='';
 
  rootNode.insertBefore(obj,obj2);
}

function InsertDiv(o)
{
  if(IsDrag)
  {
  obj2=o;
  NullDiv.style.display='';
  NullDiv.style.height='18';
  NullDiv.style.width='100';
  rootNode.insertBefore(NullDiv,obj2);
  }
}

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

 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 您可能对 [Asp.Net] 的这些文章也感兴趣:

ASP.net中使用C 和J#
ASP.NET 3.5 Extensions CTP-ASP.NET MVC框架和Silverlight支持
Com与.Net互操作
带你走进ASP.NET(2)
在VB6中动态创建使用ADO控件访问数据库
Populating TreeView Using Database
.Net FrameWork SDK文档的例子演示
XmlDataSource和SiteMapDataSource控件中XmlDataSource的数据绑定
ASP.NET四种页面导航方式之比较与选择
用TreeView实现树菜单