打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
仿Google和Windows Live的JS+DIV Drag

仿Google和Windows Live的JS+DIV Drag

CSS
body,table,td,th,input,textarea,button,select{font:13px/16px Verdana,"宋体",sans-serif;}
table
{border-collapse:collapse;}
p
{margin:0px;}
.container
{margin:8px;}
.column
{width:33%;margin:0px;padding:0px;float:left;overflow:hidden;}
.column1
{width:55%;margin:0px;padding:0px;float:left;overflow:hidden;}
.module
{margin:5px;padding:0px;border:1px solid #dcd;position:relative;background-color:white;list-style:none;}
.title
{background-color:#edf;padding:1px 0px;width:100%;overflow:hidden;cursor:move;z-index:0;font-weight:bold;}
.cont
{padding:3px;overflow:hidden;}
.hide .cont
{display:none;}
.pageTitle
{font-weight:bold;text-align:center;}
input.pageTitle
{display:none;border:0px;padding:0px;width:100%;}
.webNote
{background-color:#ffffe0;border:1px solid #ffffe0;}
textarea.webNote
{display:none;overflow:hidden;padding:0px;border:0px;padding:0px;}
.ghost
{border:1px dashed #999999;}
.float
{position:absolute;z-index:100;margin:0px;padding:0px;overflow:hidden;list-style:none;-moz-opacity:.75;filter:Alpha(opacity=75);}

JS

<!--
var IE=false,FF=false,W=window,D=document,H,B,GET="getElementsByTagName",GEI="getElementById",qq=0;
function fold(){
    
var e;
    e
=fixE(e);
    
if(e)element=fixElement(e);
    element
=element.parentNode.parentNode;
    element.className
=element.className.indexOf("hide")>0"module":"module hide";
}
var Drag={
    draging : 
false,
    x : 
0,
    y : 
0,
    element : 
null,
    fDiv : 
null,
    ghost : 
null,
    addEvent : 
function(){var a=D[GET]("li");for(var i=a.length-1;i>-1;i--)if(a[i].className=="module")a[i].onmousedown=Drag.dragStart;},
    ix:
2,iy:7,
    ox:
6,oy:7,
    fx:
6,fy:6,
    dragStart : 
function (e){
        
if(Drag.draging)return;
        
var e;
        e
=fixE(e);
        
if(e)element=fixElement(e);
        
        
/*********
        var k,s="";
        for(k in element)s+=k+" : "+element[k]+"<br/>";
        D.getElementById("bbb").innerHTML=s;
        *********
*/
        D.getElementById(
"aaa").innerHTML=element.parentNode.offsetTop+ ","+element.parentNode.offsetHeight;
        
//测试
        if(element.className!="title")return;
        element
=element.parentNode;
        Drag.element
=element;
        
//以上获得当前移动的模块
        Drag.x=e.layerXe.layerX+Drag.fx:(IEe.x+Drag.ix:e.offsetX+Drag.ox);
        Drag.y
=e.layerYe.layerY+Drag.fy:(IEe.y+Drag.iy:e.offsetY+Drag.oy);
        
//鼠标相对于模块的位置
        Drop.measure();
        
if(e.layerX){Drag.floatIt(e);Drag.drag(e);}//fix FF
        B.style.cursor="move";
        D.onmousemove
=Drag.drag;
        D.ondragstart
=function(){window.event.returnValue = false;}
        D.onselectstart
=function(){window.event.returnValue = false;};
        D.onselect
=function(){return false};
        D.onmouseup
=element.onmouseup=Drag.dragEnd;
        element.onmousedown
=null;
    },
    drag : 
function (e){
        
var e;
        e
=fixE(e);
        
if(!Drag.fDiv)Drag.floatIt(e);//for IE & Opera
        var x=e.clientX,y=e.clientY;
        Drag.fDiv.style.top
=y+H.scrollTop-Drag.y+"px";
        Drag.fDiv.style.left
=x+H.scrollLeft-Drag.x+"px";
        Drop.drop(x,y);
        
//statu(e);
    },
    dragEnd : 
function (e){
        B.style.cursor
="";
        D.ondragstart
=D.onmousemove=D.onselectstart=D.onselect=D.onmouseup=null;
        Drag.element.onmousedown
=Drag.dragStart;
        
if(!Drag.draging)return;
        Drag.ghost.parentNode.insertBefore(Drag.element,Drag.ghost);
        Drag.ghost.parentNode.removeChild(Drag.ghost);
        B.removeChild(Drag.fDiv);
        Drag.fDiv
=null;
        Drag.draging
=false;
        Drop.init(D[GEI](
"container"));
    },
    floatIt : 
function(e){
        
var e,element=Drag.element;
        
var ghost=D.createElement("LI");
        Drag.ghost
=ghost;
        ghost.className
="module ghost";
        ghost.style.height
=element.offsetHeight-2+"px";
        element.parentNode.insertBefore(ghost,element);
        
//创建模块占位框
        var fDiv=D.createElement("UL");
        Drag.fDiv
=fDiv;
        fDiv.className
="float";
        B.appendChild(fDiv);
        fDiv.style.width
=ghost.parentNode.offsetWidth+"px";
        fDiv.appendChild(element);
        
//创建容纳模块的浮动层
        Drag.draging=true;
    }
}
var Drop={
    root : 
null,
    index : 
null,
    column : 
null,
    init : 
function(it){
        
if(!it)return;
        Drop.root
=it;
        it.firstItem
=it.lastItem=null;
        
var a=it[GET]("ul");
        
for(var i=0;i<a.length;i++){
            
if(a[i].className!="column")continue;
            
if(it.firstItem==null){
                it.firstItem
=a[i];
                a[i].previousItem
=null;
            }
else{
                a[i].previousItem
=a[i-1];
                a[i
-1].nextItem=a[i];
            }
            a[i].nextItem
=null;
            it.lastItem
=a[i];
            a[i].index
=i;
            a[i].firstItem
=a[i].lastItem=null;
            
var b=a[i][GET]("li");
            
for(var j=0;j<b.length;j++){
                
if(b[j].className.indexOf("module")==-1)continue;
                
if(a[i].firstItem==null){
                    a[i].firstItem
=b[j];
                    b[j].previousItem
=null;
                }
else{
                    b[j].previousItem
=b[j-1];
                    b[j
-1].nextItem=b[j];
                }
                b[j].nextItem
=null;
                a[i].lastItem
=b[j];
                b[j].index
=i+","+j;
            }
        }
    },
    measure : 
function(){
        
if(!Drop.root)return;
        
var currentColumn=Drop.root.firstItem;
        
while(currentColumn){
            
var currentModule=currentColumn.firstItem;
            
while(currentModule){
                currentModule.minY
=currentModule.offsetTop;
                currentModule.maxY
=currentModule.minY+currentModule.offsetHeight;
                currentModule
=currentModule.nextItem;
            }
            currentColumn.minX
=currentColumn.offsetLeft;
            currentColumn.maxX
=currentColumn.minX+currentColumn.offsetWidth;
            currentColumn
=currentColumn.nextItem;
        }
        Drop.index
=Drag.element.index;
    },
    drop : 
function(x,y){
        
if(!Drop.root)return;
        
var x,y,currentColumn=Drop.root.firstItem;
        
while(x>currentColumn.maxX)if(currentColumn.nextItem)currentColumn=currentColumn.nextItem;else break;
        
var currentModule=currentColumn.lastItem;
        
if(currentModule)while(y<currentModule.maxY){
            
if(y>currentModule.minY-12){
                
if(Drop.index==currentModule.index)return;
                Drop.index
=currentModule.index;
                
if(currentModule.index==Drag.element.index){if(currentModule.nextItem)currentModule=currentModule.nextItem;else break;}
                currentColumn.insertBefore(Drag.ghost,currentModule);
                Drop.column
=null;
                window.status
=qq++;
                
return;
            }
else if(currentModule.previousItem)currentModule=currentModule.previousItem;else return;
        }
        
if(Drop.column==currentColumn.index)return;
        currentColumn.appendChild(Drag.ghost);
        Drop.index
=0;
        Drop.column
=currentColumn.index;
        window.status
=qq++;
    }
}
var webNote={
    obj : 
null,
    canEdit : 
function(e){
        
var e,element;
        e
=fixE(e);
        element
=fixElement(e);
        
if(element.className!='webNote')return;
        
if(typeof element.contentEditable!="undefined"){
            element.contentEditable
=true;
            element.style.borderColor
='red';
            element.focus();
            webNote.obj
=element;
        }
    },
    cannotEdit : 
function(){
        
if(!webNote.obj)return;
        
if(typeof webNote.obj.contentEditable!="undefined"){
            webNote.obj.style.borderColor
='#ffffe0';
            webNote.obj.contentEditable
=false;
            webNote.obj
=null;
        }
    }
}
function fixE(e){var e;e=ee:(window.eventwindow.event:null);return e}
function fixElement(e){var e;return e.target(e.target.nodeType==3e.target.parentNode:e.target):e.srcElement;}
onload
=function(){
    B
=D[GET]("body")[0];
    H
=D[GET]("html")[0];
    Drop.init(D[GEI](
"container"));
    Drag.addEvent();
}
function statu(e){
    
var e,element;
    element
=fixElement(e);
    
var aa=D.getElementById("aaa");
    aa.innerHTML
="e.xy:("+e.x+","+e.y+")<br/>e.offsetXY:("+e.offsetX+","+e.offsetY+")<br/>e.clientXY:("+e.clientX+","+e.clientY+")<br/>element.offsetLeftTop:("+element.offsetLeft+","+element.offsetTop+")<br/>e.layerXY:("+e.layerX+","+e.layerY+")";
}
//-->

HTML
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    
<title>无标题页</title>  
    
<link href="../JSWebPart/css/Stylesheet.css" rel="stylesheet" type="text/css" />
   
<script type="text/javascript" src="scripts/DragJS.js" language="javascript"></script> 

</head>
<body>
    
<form id="form1" runat="server">   
  
<center><span class="pageTitle" onclick="with(this.nextSibling){value=this.innerHTML;style.display='block';focus()};this.style.display='none';">You can input a topic here!</span><input class="pageTitle" onBlur="with(this.previousSibling){D.title=innerHTML=this.value?this.value:'Demo';style.display='block';};this.style.display='none'" /></center>
<div class="container" id="container">
    
<ul class="column">
        
<li class="module">
            
<div class="title"><span onclick="fold()">+</span> Coodinate</div>
            
<div class="cont" id="aaa">content</div>
        
</li>
        
<li class="module">
            
<div class="title"><span onclick="fold()">+</span> contentEditable</div>
            
<div class="cont" onclick="alert('this.contentEditable:'+this.contentEditable)">click here</div>
        
</li>
        
<li class="module">
            
<div class="title"><span onclick="fold()">+</span> long long ago</div>
            
<div class="cont">有形者 生于无形 无能生有 有归于无<br/>是以 凡所有所相 皆是虚妄<br/>若是能见诸相非相 当知虚非真虚<br/>有生之气 有形之状 尽是幻也<br/>造物之所始 阴阳之所变者 谓之生 谓之死<br/>穷数达变 因形移易者 谓之化 谓之幻<br/>了悟有无 参透虚实 自然遨游天地宇宙 无所阻碍<br/>是谓大幻之道</div>
        
</li>
    
</ul>
    
<ul class="column">
        
<li class="module">
            
<div class="title"><span onclick="fold()">+</span> this.parentNode</div>
            
<div class="cont"><button onclick="alert(this.parentNode.parentNode.parentNode.innerHTML)">parentNode</button></div>
        
</li>
        
<li class="module">
            
<div class="title"><span onclick="fold()">+</span> webNote</div>
            
<div class="cont"><div class="webNote" onblur="webNote.cannotEdit()" onclick="webNote.canEdit(event)">You can note something here.<br/><br/>从前有座山<br/>山里有座庙<br/>庙里有个老和尚讲故事</div><textarea class="webNote"></textarea></div>
        
</li>
        
<li class="module">
            
<div class="title"><span onclick="fold()">+</span> Google</div>
            
<div class="cont"><center><href="http://www.google.com" style="font:bold 31px/2 Arial;">Gooooooogle</a></center></div>
        
</li>
    
</ul>
    
<ul class="column">
        
<li class="module">
            
<div class="title"><span onclick="fold()">+</span> pia~~</div>
            
<div class="cont">十里平湖霜满天<br/>寸寸青丝愁华年<br/>对月形单忘相护<br/>只羡鸳鸯不羡仙</div>
        
</li>
        
<li class="module">
            
<div class="title"><span onclick="fold()">+</span> biu~~</div>
            
<div class="cont">您好!<br/>主人不在,您可以在biu~的一声后留言<br/>biu~~</div>
        
</li>
        
<li class="module">
            
<div class="title"><span onclick="fold()">+</span> 无话可说</div>
            
<div class="cont" id="bbb">吃葡萄不吐葡萄皮<br/>不吃葡萄倒吐葡萄皮<br/>(字数不够,再吃一遍
)
</div>
        
</li>
    
</ul>
</div>
<div style="font-size:10px;line-height:14px;clear:both;margin:6px 3%;text-align:center;border:1px solid #eee;">&copy;2006 forfor</div>
    
</form>
</body>
</html>

暂时还没想到怎么去保存布局....郁闷中




分类: JS, CSS, AJAX, .NET2.0
绿色通道: 好文要顶 关注我 收藏该文与我联系
0
0
(请您对文章做出评价)
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Drag and Drop Products to the Shopping Basket...
对google个性主页的拖拽效果的js的完整注释
类似google的模块可拖动
漂亮的Js拖动层,窗口拖拽(改变大小/最小化/最大化/还原/关闭)
js实现点击div隐藏相应部分,再次点击显示
用js原生api代替JQuery api
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服