拖拽碰撞效果,高级浏览器下全部搞定(ie6-8还没有搞定)

<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title>可拖拽的照片墙</title>
<style type="text/css">
html body {
    margin:0;
}
#wrap {
    list-style:none;
    padding:0;
    margin:30px auto;
    width:670px;
    position:relative;
    zoom:1;
}
.clearfix:after {
    content:'';
    height:0;
    clear:both;
    display:block;
    visibility:hidden;
}
#wrap div{
    float:left;
    margin:10px;
    z-index:1;
    border:1px solid #fff;
}
#wrap div img{
    width:200px;
    height:150px;
    vertical-align:bottom;
}
#wrap div.active {
    border:1px dashed red;
}
</style>
</head>
<body>
<div id="wrap" class='clearfix'>
  <div><img src="http://pingfan1990.sinaapp.com/javacript/dargimg/1.jpg" /></div>
  <div><img src="http://pingfan1990.sinaapp.com/javacript/dargimg/2.jpg" /></div>
  <div><img src="http://pingfan1990.sinaapp.com/javacript/dargimg/3.jpg" /></div>
  <div><img src="http://pingfan1990.sinaapp.com/javacript/dargimg/4.jpg" /></div>
  <div><img src="http://pingfan1990.sinaapp.com/javacript/dargimg/5.jpg" /></div>
  <div><img src="http://pingfan1990.sinaapp.com/javacript/dargimg/6.jpg" /></div>
  <div><img src="http://pingfan1990.sinaapp.com/javacript/dargimg/7.jpg" /></div>
  <div><img src="http://pingfan1990.sinaapp.com/javacript/dargimg/8.jpg" /></div>
  <div><img src="http://pingfan1990.sinaapp.com/javacript/dargimg/9.jpg" /></div>
</div>
<script type="text/javascript">
var o=document.getElementById("wrap");
var arr=o.getElementsByTagName("div");
var ind=2;
for(var i=arr.length-1;i>=0;i--){
    arr[i].style.left=arr[i].offsetLeft+"px";
    arr[i].style.top=arr[i].offsetTop+"px";    
    arr[i].style.position="absolute";
    arr[i].style.margin=0;
    m(arr[i])    
}

//拖动和各种判断
function m(obj){
    var tar=null;
    obj.onmousedown=function(e){
        var e=e||event;
        ind++;
        var aa=[obj.offsetLeft,obj.offsetTop];
        var disX=e.clientX-obj.offsetLeft;
        var disY=e.clientY-obj.offsetTop;
        this.style.zIndex=ind;
        
        document.onmousemove=function(e){
            var e=e||event;
            obj.style.left=e.clientX-disX+"px";
            obj.style.top=e.clientY-disY+"px";
            
            
            var s=siblings(obj);
            var mind=9999999;
            var num=-1;
            for(var i=0;i<s.length;i++){
                s[i].className='';
                if(c(obj,s[i])){
                    var dis=distance(obj,s[i]);
                    if(mind>dis){
                        mind=dis;
                        num=i;
                        for(j=0;j<siblings(obj).length;j++){
                            siblings(obj)[j].className='';    
                        }
                        s[num].className="active";
                    }
                }
                tar=s[num]
            }
            
        }
        
        document.onmouseup=function(){
            if(tar){
                tar.className='';
            }
            exchangePosition(obj,tar,aa);
       tar=null; document.onmousemove
=null; document.onmouseup=null; } return false; } } function exchangePosition(a,b,x){ if(b){ a.style.left=b.offsetLeft+"px"; a.style.top=b.offsetTop+"px"; b.style.left=x[0]+"px"; b.style.top=x[1]+"px"; }else{ a.style.left=x[0]+"px"; a.style.top=x[1]+"px"; } b=null; } //求两个Div之间的距离 function distance(x,y){ var l=x.offsetLeft; var t=x.offsetTop; var ll=y.offsetLeft; var tt=y.offsetTop; var dis=Math.sqrt((l-ll)*(l-ll)+(t-tt)*(t-tt)); return dis } //碰撞检测方法 function c(x,y){ var l=x.offsetLeft; var r=l+x.offsetWidth; var t=x.offsetTop; var b=t+x.offsetHeight; var ll=y.offsetLeft; var rr=ll+y.offsetWidth; var tt=y.offsetTop; var bb=tt+y.offsetHeight; if(r<ll || b<tt || l>rr || t>bb){ return false; }else{ return true; } } function siblings(obj){ return preall(obj).concat(nextall(obj)) } function preall(obj){ var arr=[]; var o=obj.previousSibling; while(o){ if(o.nodeType==1){ arr.unshift(o); } o=o.previousSibling; } return arr; } function nextall(obj){ var arr=[]; var o=obj.nextSibling; while(o){ if(o.nodeType==1){ arr.push(o); } o=o.nextSibling; } return arr; } </script>

 ie6-8还没有搞定,主要是在拖动的时候首先动的是图片,需要事件捕获,正好又趁这个机会仔仔细细的研究一下js的冒泡的时间捕获,完整的做一个效果确实可以学习很多的知识。

加了一个运动效果

低级浏览器下面还是没有搞定,一点一点的添加一点一点的完善吧

<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title>可拖拽的照片墙</title>
<style type="text/css">
html body {
    margin:0;
}
#wrap {
    list-style:none;
    padding:0;
    margin:30px auto;
    width:670px;
    position:relative;
    zoom:1;
}
.clearfix:after {
    content:'';
    height:0;
    clear:both;
    display:block;
    visibility:hidden;
}
#wrap div{
    float:left;
    margin:10px;
    z-index:1;
    border:1px solid #fff;
    _display:inline;
}
#wrap div img{
    width:200px;
    height:150px;
    vertical-align:bottom;
}
#wrap div.active {
    border:1px dashed red;
}
</style>
</head>
<body>
<div id="wrap" class='clearfix'>
  <div><img src="http://pingfan1990.sinaapp.com/javacript/dargimg/1.jpg" /></div>
  <div><img src="http://pingfan1990.sinaapp.com/javacript/dargimg/2.jpg" /></div>
  <div><img src="http://pingfan1990.sinaapp.com/javacript/dargimg/3.jpg" /></div>
  <div><img src="http://pingfan1990.sinaapp.com/javacript/dargimg/4.jpg" /></div>
  <div><img src="http://pingfan1990.sinaapp.com/javacript/dargimg/5.jpg" /></div>
  <div><img src="http://pingfan1990.sinaapp.com/javacript/dargimg/6.jpg" /></div>
  <div><img src="http://pingfan1990.sinaapp.com/javacript/dargimg/7.jpg" /></div>
  <div><img src="http://pingfan1990.sinaapp.com/javacript/dargimg/8.jpg" /></div>
  <div><img src="http://pingfan1990.sinaapp.com/javacript/dargimg/9.jpg" /></div>
</div>
<script type="text/javascript">
var o=document.getElementById("wrap");
var arr=o.getElementsByTagName("div");
var ind=2;
for(var i=arr.length-1;i>=0;i--){
    arr[i].style.left=arr[i].offsetLeft+"px";
    arr[i].style.top=arr[i].offsetTop+"px";    
    arr[i].style.position="absolute";
    arr[i].style.margin=0;
    m(arr[i])
}

//拖动和各种判断
function m(obj){
    var tar=null;
    obj.onmousedown=function(e){
        var e=e||event;
        ind++;
        var aa=[obj.offsetLeft,obj.offsetTop];
        var disX=e.clientX-obj.offsetLeft;
        var disY=e.clientY-obj.offsetTop;
        this.style.zIndex=ind;
    if(e.stopPropagation) {
        e.stopPropagation();  
    }else{  
        e.cancelBubble = true;
    }
        
        document.onmousemove=function(e){
            var e=e||event;
            obj.style.left=e.clientX-disX+"px";
            obj.style.top=e.clientY-disY+"px";
            
            
            var s=siblings(obj);
            var mind=9999999;
            var num=-1;
            for(var i=0;i<s.length;i++){
                s[i].className='';
                if(c(obj,s[i])){
                    var dis=distance(obj,s[i]);
                    if(mind>dis){
                        mind=dis;
                        num=i;
                        for(j=0;j<siblings(obj).length;j++){
                            siblings(obj)[j].className='';    
                        }
                        s[num].className="active";
                    }
                }
                tar=s[num]
            }
    if(e.stopPropagation) {
        e.stopPropagation();  
    }else{  
        e.cancelBubble = true;
    }
        }
        
        document.onmouseup=function(){
            if(tar){
                tar.className='';
            }
            exchangePosition(obj,tar,aa);
            tar=null;
            document.onmousemove=null;
            document.onmouseup=null;
            }
        
        return false;
    }
}

function exchangePosition(a,b,x){
    if(b){
        //a.style.left=b.offsetLeft+"px";
        //a.style.top=b.offsetTop+"px";
        //b.style.left=x[0]+"px";
        //b.style.top=x[1]+"px";
        move(a,{left:b.offsetLeft,top:b.offsetTop});
        move(b,{left:x[0],top:x[1]});
    }else{
        move(a,{left:x[0],top:x[1]})
    }
}

//求两个Div之间的距离
function distance(x,y){
        var l=x.offsetLeft;
        var t=x.offsetTop;
        
        var ll=y.offsetLeft;
        var tt=y.offsetTop;
        
        var dis=Math.sqrt((l-ll)*(l-ll)+(t-tt)*(t-tt));
        return dis
}

//碰撞检测方法
function c(x,y){
    var l=x.offsetLeft;
    var r=l+x.offsetWidth;
    var t=x.offsetTop;
    var b=t+x.offsetHeight;
    
    var ll=y.offsetLeft;
    var rr=ll+y.offsetWidth;
    var tt=y.offsetTop;
    var bb=tt+y.offsetHeight;

    if(r<ll || b<tt || l>rr || t>bb){
        return false;
    }else{
        return true;
    }    
}


function siblings(obj){
    return preall(obj).concat(nextall(obj))
}

function preall(obj){
    var arr=[];
    var o=obj.previousSibling;
    while(o){
        if(o.nodeType==1){
            arr.unshift(o);
        }
        o=o.previousSibling;
    }
    return arr;
}

function nextall(obj){
    var arr=[];
    var o=obj.nextSibling;
    while(o){
        if(o.nodeType==1){
            arr.push(o);
        }
        o=o.nextSibling;
    }
    return arr;    
}

function move(obj,json,fn){    
    clearInterval(this.timer)
    obj.timer=setInterval(function(){
        obj.bstop=true;
        for(i in json){
            var pos=parseInt(getcss(obj,i));
            var speed=pos>json[i]?Math.floor(((json[i]-pos)/8)): Math.ceil(((json[i]-pos)/8));
            obj.style[i]=speed+pos+"px";
            if(parseInt(getcss(obj,i))!=json[i]){
                obj.bstop=false;
            }
        }
        if(obj.bstop){
            clearInterval(obj.timer);
            fn && fn();
        }
    },30)
}

function getcss(obj,attr){
    return getComputedStyle(obj,null)[attr]||obj.currentStyle()[attr];
}

</script>
原文地址:https://www.cnblogs.com/busicu/p/3972123.html