Javascript制作拖动网页布局的方法

2016-02-20 00:45 28 1 收藏

下面是个超简单的Javascript制作拖动网页布局的方法教程,图老师小编精心挑选推荐,大家行行好,多给几个赞吧,小编吐血跪求~

【 tulaoshi.com - Web开发 】

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)这几天不是很忙,就找了些拖动布局方面的资料看看,也学着写了个拖动布局的效果,没想到花了好多时间,
七拼八凑,总算是把这个效果写出来了。哎!还是js的功夫太差。因为是边找资料边写的,很多地方印象不深,
时间一长,再重新写估计也难,所以把当时的思路记录一下!也希望大虾指点一下!

好了,转入正文,在开始之前先介绍几个功能函数!
1.格式化事件的函数
程序代码
function getEvent(){
     //同时兼容ie和ff的写法
     if(document.all)    return window.event;
     func=getEvent.caller;
     while(func!=null){
         var arg0=func.arguments[0];
         if(arg0){
             if((arg0.constructor==Event || arg0.constructor ==MouseEvent)
                || (typeof(arg0)=="object" && arg0.preventDefault && arg0.stopPropagation)){    
                return arg0;
              }
         }
          func=func.caller;
        }
        return null;
}

2.取得鼠标的位置
程序代码
function mouseCoords(ev){
    if(ev.pageX || ev.pageY){
        return {x:ev.pageX, y:ev.pageY};
    }
    return {
        x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
        y:ev.clientY + document.body.scrollTop - document.body.clientTop
    };
}

3.得到元素的位置
程序代码
function getPosition(ele){
    var left = 0;
    var top = 0;
    while (ele.offsetParent){
        left += ele.offsetLeft;
        top += ele.offsetTop;
        ele = ele.offsetParent;
    }
    left += ele.offsetLeft;
    top += ele.offsetTop;
    return {x:left, y:top};
}
首先,当然是写好初始布局的页面,  查看初始页面效果

一般拖动的元素是跟随鼠标的,我的思路是在把拖动的元素增加到一个position为absolute的div中,
鼠标拖动的时候就让它的位置根据鼠标的坐标变化就可以了。所以在页面增加了个onload
程序代码
var tmpDiv=null;//临时存放拖动对象的div
window.onload=function(){
    tmpDiv=document.createElement("div");
    tmpDiv.style.cssText = 'position:absolute;display:none;border:1px dotted #FFCC66;';
    document.body.appendChild(tmpDiv);
}

要实现拖动,首先触发的事件是mouseDown,所以我在拖动的table的一个td上绑定了onmousedown="mouseDown(this);"
程序代码
var dragObject = null;//拖动的元素(table)
var mouseOffset = null;//鼠标的在拖动元素中的位置
var dragDiv=null;//拖动的table所在的列的div
var eleDivW=null;//拖动的table的父节点(div)的高度
var dragDivLen=null;//拖动的table所在的列的div中用来放置table的div的个数
var DragContainer=["col1","col2","col3"];//用来实现列布局的div的id
//鼠标按下拖动的元素
function mouseDown(elem){
    ev=getEvent();
    dragObject = elem.parentNode.parentNode.parentNode;//被拖动的table
    dragDiv=dragObject.parentNode.parentNode;
    //拖动元素所在列里div的个数
    dragDivLen=dragDiv.getElementsByTagName("div").length;
    mouseOffset = getMouseOffset(dragObject, ev);
    eleDivW=dragObject.parentNode.offsetWidth;
    dragObject.parentNode.style.border="1px dotted #FFCC66";
    return false;
}
//得到鼠标在拖动元素中的位置
function getMouseOffset(target, ev){
    var docPos = getPosition(target);
    var mousePos = mouseCoords(ev);
    return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};
}

剩下的当然就是鼠标移动拖动对象也能移动,用到的当然就是mouseMove咯,为简单我在document上绑定,
程序代码
document.onmousemove = mouseMove;
function mouseMove(){
    ev=getEvent();
    var mousePos = mouseCoords(ev);
    if(dragObject){
        dragObject.parentNode.style.display="none";//设置放置被拖动table的div隐藏
        //把拖动的table放到临时的div中,并设置其坐标
        for(var i=0; itmpDiv.childNodes.length; i++) tmpDiv.removeChild(tmpDiv.childNodes[i]);
        tmpDiv.appendChild(dragObject.cloneNode(true));
        tmpDiv.style.width=eleDivW+"px";
        tmpDiv.style.backgroundColor="#FFFFFF";
        tmpDiv.style.display="block";
        tmpDiv.style.top = (mousePos.y - mouseOffset.y)+"px";
        tmpDiv.style.left = (mousePos.x - mouseOffset.x)+"px";
    }
    return false;
}

有了mousemove当然少不了mouseup
程序代码
document.onmouseup = mouseUp;
//鼠标松开
function mouseUp(){
    if(dragObject){
        if(dragObject.parentNode.style.display=="none") dragObject.parentNode.style.display="block";
        dragObject.parentNode.style.border="1px solid #FFCC66";
        tmpDiv.style.display="none";
        //这里是判断当列里有可拖动的元素时清除前面设置的高度值20px
        for(var m=0;mDragContainer.length;m++){
            var colDiv=document.getElementById(DragContainer[m]);
            var colDivLen=colDiv.getElementsByTagName("div").length
            var colSty=colDiv.getAttribute("style");
            if(colDivLen0&&colSty!=null){
                colDiv.removeAttribute("style");
                break;
            }
        }
        dragObject=null;
    }
}


看看是不是可以拖动了,当你松开鼠标左键时,拖动的元素将回到原来的位置  查看拖动页面效果


最后要做的就是让拖动元素不回到原来的位置,而是回到我们拖动的位置。
下面是mousemove事件的所有代码,看看注释就明白了
程序代码
function mouseMove(){
    ev=getEvent();
    var mousePos = mouseCoords(ev);
    if(dragObject){
        //可拖动的个数为1,说明拖动后此列就没有拖动元素,为避免此列没有高度而不见,所以设置其高度为20px
        if(dragDivLen==1) dragDiv.style.height="20px";
        dragObject.parentNode.style.display="none";
        //把拖动的元素加入到临时的tmpDiv中,并设置tmpDiv坐标
        for(var i=0; itmpDiv.childNodes.length; i++) tmpDiv.removeChild(tmpDiv.childNodes[i]);
        tmpDiv.appendChild(dragObject.cloneNode(true));
        tmpDiv.style.width=eleDivW+"px";
        tmpDiv.style.backgroundColor="#FFFFFF";
        tmpDiv.style.display="block";
        tmpDiv.style.top = (mousePos.y - mouseOffset.y)+"px";
        tmpDiv.style.left = (mousePos.x - mouseOffset.x)+"px";
        //被拖动对象的中心点的坐标
        var dragObjCntX=mousePos.x - mouseOffset.x+parseInt(dragObject.offsetWidth)/2;
        var dragObjCntY=mousePos.y - mouseOffset.y+parseInt(dragObject.offsetHeight)/2;
        //判断tmpDiv所在的列
        var dragConLen=DragContainer.length;
        for(var i=0;idragConLen;i++){
            var curContainer=document.getElementById(DragContainer[i]);
            var dcPos=getPosition(curContainer);
            var dcPosMinX=dcPos.x;
            var dcPosMinY=dcPos.y;
            var dcWidth=curContainer.offsetWidth;
            var dcHeight=curContainer.offsetHeight;
            var dcPosMaxX=dcPosMinX+dcWidth;
            var dcPosMaxY=dcPosMinY+dcHeight;
            if(dragObjCntXdcPosMinX&&dragObjCntXdcPosMaxX&&dragObjCntYdcPosMinY&&dragObjCntYdcPosMaxY){
                var activeContainer=curContainer;
                break;
            }
        }
    }
    //判断tmpDiv在此列哪个区块范围内
    if(activeContainer){
        var beforNode=null;
        var sDiv=activeContainer.getElementsByTagName("div")
        var acChiLen=sDiv.length;
        for(j=acChiLen-1;j=0;j--){
            var activeDiv=sDiv[j];
            if(activeDiv){
                var activeDivPos=getPosition(activeDiv);
                var activeDivMinX=activeDivPos.x;
                var activeDivMinY=activeDivPos.y;
                var activeDivMaxX=activeDivMinX+activeDiv.offsetWidth;
                var activeDivMaxY=activeDivMinY+activeDiv.offsetHeight;
                if(activeDivMaxXdragObjCntX&&activeDivMaxYdragObjCntY){
                //if(dragObjCntXactiveDivMinX&&dragObjCntXactiveDivMaxX&&dragObjCntYactiveDivMinY&&dragObjCntYactiveDivMaxY){
                    beforNode=activeDiv;
                }
            }
            
        }
        //若此区块存在,就在此区块前插入拖动元素
        if(beforNode!=null){
            if(dragObject.parentNode!=beforNode){
                curContainer.insertBefore(dragObject.parentNode,beforNode);
                dragObject.parentNode.style.display="block";
                //document.getElementById("test").value=curContainer.id;
            }
        }
        //不存在就在所在列插入拖动元素
        else{
            curContainer.appendChild(dragObject.parentNode);
            dragObject.parentNode.style.display="block";
        }
    }
    return false;
}

好了,一个可以拖动布局的页面就完成了  查看最终页面效果

能力有限,有些地方可能说的不清不楚,若有兴趣,自己好好看看代码吧。
有什么不足的地方,请指教。

来源:http://www.tulaoshi.com/n/20160220/1632472.html

延伸阅读
标签: Web开发
一、简化代码 采用更为简短的写法,不仅可以减少输入的字符数,还可以减少文件大小。大部分采用简单写法的代码,执行效率都有轻微提高。 1.1  简化常用对象定义: 使用 var obj = {}; 代替 var obj = new Object(); 使用 var arr = []; 代替 var arr = new Array(); 1.2  精简if语句 三元操作符可以有效精简只涉及赋值传值操作...
标签: Web开发
在一个国外网站看到的12种常见的div+css布局模板,是可以根据屏幕分辨路自适应宽度的动态布局,感觉很好。                                菜单和内容动态    &nb...
标签: Web开发
相关文章: 用CSS建设网站的实例 原文博客:veerle 翻译整理:西米CC 来自国外博客veerle的一个系列教程,分八个部分讲解一张完整CSS页面的构建过程。虽然它不是每个步骤都解释得非常详细,但是其中提及的很多技巧和经验都很值得初学者借鉴,从界面设计到页面构建,强调了很多细节的设计理念。在翻译的过程中,个人觉得本教程比较薄弱的...
标签: Web开发
新版本网站--lib类函数功能应用DEMO演示 新版本网站--lib类函数功能应用DEMO演示 1 2 3 4 5 6 7 8拖动窗口(1)关闭窗口 理光R系列自来都已全面而著称,去年推出的R7则堪称是相当完善的一款产品,轻巧的机身,7.1倍光学变焦镜头,大尺寸LCD,快速的开机、对焦速度,加上合理的价格,取得了相当不错的销售成绩。 ...
标签: Web开发
你正在学习CSS布局吗?是不是还不能完全掌握纯CSS布局?通常有两种情况阻碍你的学习: 第一种可能是你还没有理解CSS处理页面的原理。在你考虑你的页面整体表现效果前,你应当先考虑内容的语义和结构,然后再针对语义、结构添加CSS。这篇文章将告诉你应该怎样把HTML结构化。 另一种原因是你对那些非常熟悉的表现层属性(例如:cel...

经验教程

877

收藏

48
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部