用javascript做拖动布局的思路

好了,转入正文,在开始之前先介绍几个功能函数!
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; i<tmpDiv.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;m<DragContainer.length;m++){ 
            var colDiv=document.getElementById(DragContainer[m]); 
            var colDivLen=colDiv.getElementsByTagName("div").length 
            var colSty=colDiv.getAttribute("style"); 
            if(colDivLen>0&&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; i<tmpDiv.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;i<dragConLen;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(dragObjCntX>dcPosMinX&&dragObjCntX<dcPosMaxX&&dragObjCntY>dcPosMinY&&dragObjCntY<dcPosMaxY){ 
                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(activeDivMaxX>dragObjCntX&&activeDivMaxY>dragObjCntY){ 
                //if(dragObjCntX>activeDivMinX&&dragObjCntX<activeDivMaxX&&dragObjCntY>activeDivMinY&&dragObjCntY<activeDivMaxY){ 
                    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; 
}

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

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

(0)

相关推荐

  • 拖动布局之保存布局页面cookies篇

    我实现的方法是记录每列拥有的拖动对象,这样在初始或刷新的时候读取这列有哪些拖动对象,直接把拖动对象通过appenChild加进去就可以了,比如拖动后列的id为col2,在这一列的拖动对象的id为col1_2,col3_1,col2_1,我就把col2=col1_2|col3_1|col2_1记录下来,在刷新页面的时候就读取col2的值,循环通过document.getElementById(col2).appendChild(document.getElementById(col1_2))实现显

  • php+dojo 的数据库保存拖动布局的一个方法dojo 这里下载

    看老大介绍的dojo框架,学习着写了下.刚开始学习php 请大家指教下!发现发不了附件.发两个代码大家自己体会了. 复制代码 代码如下: <?php  session_start();  if ($_SESSION['gh']==''){  header('location:login.php');   }  include("config.php");  $sql="select * from module";   $result=mssql_query($

  • 基于jquery的拖动布局插件

    复制代码 代码如下: (function($){ $.fn.lsMovePanel=function(){ var id=this.attr("id"); var X=Y=0; var offsetX=offsetY=0;//绝对位置 var OldIndex=0;///存储原始索引 var Temp_Li="<li id=\"Temp_Li\" style=\"background-color:#FFFFFF;border-color:#

  • 用javascript做拖动布局的思路

    好了,转入正文,在开始之前先介绍几个功能函数! 1.格式化事件的函数 复制代码 代码如下: function getEvent(){       //同时兼容ie和ff的写法       if(document.all)    return window.event;       func=getEvent.caller;       while(func!=null){           var arg0=func.arguments[0];           if(arg0){     

  • 原生JavaScript实现拖动校验功能

    本文实例为大家分享了JavaScript实现拖动校验的具体代码,供大家参考,具体内容如下 思路 1.页面布局采用定位,背景颜色变化bg的宽度为0,其宽度会随着滑块的移动而移动. 页面结构 <!--验证--> <div class="box"> <!--滑块--> <div class="btn"></div> <!--文字--> <p class="text">请

  • javascript实现拖动元素交换位置

    本文实例讲述了javascript实现拖动元素交换位置的代码.分享给大家供大家参考.具体如下: 实现目标:可拖动元素拖动到另外一个元素位置的时候,互相交换位置. 启发来源:最初形式是网上看到的一个拼图小游戏. 运行效果截图如下: 具体代码如下: 代码: body,ul,li{margin:0;padding:0;} ul{list-style: none;} body{font:13px/1.5 Tahoma;} #box{position:relative;width:435px;height

  • jQuery拖动布局其结果保存到数据库

    最近的项目中涉及到了用户个性化定制首页的需求,用户要求可以随意拖动首页模块的位置,来实现个性化的布局.本文讲解如何使用和PHP实现拖动布局并将拖动后的布局位置保存到数据库. 很多网站的拖动布局的例子都是采用浏览器的COOKIE来记录用户拖动模块的位置,也就是说拖动后各模块的排序位置信息是记录在客户端的cookie里的.当用户清空客户端的cookie或浏览器的cookie过期后,再次访问页面时,发现布局又还原成最初的状态.这种cookie记录的方式使用简单,但不适合像个人中心.管理系统主页的要求.

  • 使用javascript做在线算法编程

    基于node的readline一样可以使用标准流的输入输出 对于大学生在刚开始学习c ,c++, java的时候,写着hello word的代码,然后在命令框中输入输出: 基于很多算法的学习,在我短浅的认识中,身边的同学都是使用 c, c++,甚至是java去写: 很多算法题目中的输入描述和输出描述 例如牛客网上的算法题: 类似于这种的东西,在杭州acm的算法题目也是. 诀窍------使用nodejs内置封装好的readline模块:[kbd][/kbd] 1.readline 模块 [逐行读

  • JavaScript实现拖动滑块拼图验证功能(html5、canvas)

    引言: 滑块拖动验证现在很多地方都用到,周末就琢磨着写了一个,放上来,看看有没有人用得上! 效果: 实现思路: 用一张画布绘制源图,再绘制一个填充的方形,这样就可以达到缺失的效果(方形的坐标是随机的): 再用一个画布绘制拖动块,同时用drawImage截取和上一步中方形区域一样坐标.大小的原图,就作为验证图了,把验证图放在最左边: 在拖动块处,按下鼠标然后拖动,拖动块和验证图会跟随鼠标移动,达到一定范围后放开鼠标,会进行验证: 验证通过则提示验证成功,验证不通过则拖动块和验证图会返回到最左边.

  • 利用JavaScript做数独的完整实现过程

    目录 前言 怎么解数独 填第一个格子 填第二个格子 填第三个格子 填第九个格子 综上所述 通过代码来实现 动态展示做题过程 九宫格样式 做题逻辑 总结 前言 最近看到老婆天天在手机上玩数独,突然想起 N 年前刷 LeetCode 的时候,有个类似的算法题(37.解数独),是不是可以把这个算法进行可视化. 说干就干,经过一个小时的实践,最终效果如下: 怎么解数独 解数独之前,我们先了解一下数独的规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一

  • JavaScript实现斗地主游戏的思路

    本文知识给大家分享一下使用js写斗地主的思路,代码写的不好,还请见谅. 这里说说斗地主主要包含的功能:洗牌,发牌,玩家出牌.电脑出牌,出牌规则的验证,输赢啥的没有判断,只是实现了这几个主要功能,下面依次说说几个功能的实现: 1.洗牌: var pukes=this.manage.pukes;//存放扑克牌的数组 //洗牌 for(var i=;i<pukes.length;i++){ var tmp=pukes[i]; var index=util.random(i,pukes.length);

  • JavaScript实现拖动对话框效果的实现代码

    代码实现: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style

随机推荐