jQuery图片列表拖拽排序布局插件DEMO演示

HTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">    
<html xmlns="http://www.w3.org/1999/xhtml">    
<head>    
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />    
<title>jQuery图片列表拖拽排序布局插件DEMO演示</title>    
<style>    
* {margin:0; padding:0;list-style: none}    
#ul1 {width:660px; position:relative; margin:10px auto;}    
#ul1 li {width:200px; height:150px; float:left; list-style:none; margin:10px;}    
#ul1 li:hover{ border-color: #9a9fa4; box-shadow: 0 0 6px 0 rgba(0, 0, 0, 0.85);}    
#ul1 .active{ border:1px dashed red;}    
</style>    
<script type="text/javascript" src="move.js"></script>    
<script>    
window.onload = function() {    
		var oUl= document.getElementById("ul1");    
		var aLi = oUl.getElementsByTagName("li");    
		var disX = 0;    
		var disY = 0;    
		var minZindex = 1;    
		var aPos =[];    
		for(var i=0;i<aLi.length;i++){    
			var t = aLi[i].offsetTop;    
			var l = aLi[i].offsetLeft;    
			aLi[i].style.top = t+"px";    
			aLi[i].style.left = l+"px";    
			aPos[i] = {left:l,top:t};    
			aLi[i].index = i;    
		}    
		for(var i=0;i<aLi.length;i++){    
			aLi[i].style.position = "absolute";    
			aLi[i].style.margin = 0;    
			setDrag(aLi[i]);    
		}    
		//拖拽    
		function setDrag(obj){    
			obj.onmouseover = function(){    
				obj.style.cursor = "move";    
			}    
			obj.onmousedown = function(event){    
				var scrollTop = document.documentElement.scrollTop||document.body.scrollTop;    
				var scrollLeft = document.documentElement.scrollLeft||document.body.scrollLeft;    
				obj.style.zIndex = minZindex++;    
				//当鼠标按下时计算鼠标与拖拽对象的距离    
				disX = event.clientX +scrollLeft-obj.offsetLeft;    
				disY = event.clientY +scrollTop-obj.offsetTop;    
				document.onmousemove=function(event){    
					//当鼠标拖动时计算div的位置    
					var l = event.clientX -disX +scrollLeft;    
					var t = event.clientY -disY + scrollTop;    
					obj.style.left = l + "px";    
					obj.style.top = t + "px";    
					/*for(var i=0;i<aLi.length;i++){    
						aLi[i].className = "";    
						if(obj==aLi[i])continue;//如果是自己则跳过自己不加红色虚线    
						if(colTest(obj,aLi[i])){    
							aLi[i].className = "active";    
						}    
					}*/    
					for(var i=0;i<aLi.length;i++){    
						aLi[i].className = "";    
					}    
					var oNear = findMin(obj);    
					if(oNear){    
						oNear.className = "active";    
					}    
				}    
				document.onmouseup = function(){    
					document.onmousemove = null;//当鼠标弹起时移出移动事件    
					document.onmouseup = null;//移出up事件,清空内存    
					//检测是否普碰上,在交换位置    
					var oNear = findMin(obj);    
					if(oNear){    
						oNear.className = "";    
						oNear.style.zIndex = minZindex++;    
						obj.style.zIndex = minZindex++;    
						startMove(oNear,aPos[obj.index]);    
						startMove(obj,aPos[oNear.index]);    
						//交换index    
						oNear.index += obj.index;    
						obj.index = oNear.index - obj.index;    
						oNear.index = oNear.index - obj.index;    
					}else{    
						startMove(obj,aPos[obj.index]);    
					}    
				}    
				clearInterval(obj.timer);    
				return false;//低版本出现禁止符号    
			}    
		}    
		//碰撞检测    
		function colTest(obj1,obj2){    
			var t1 = obj1.offsetTop;    
			var r1 = obj1.offsetWidth+obj1.offsetLeft;    
			var b1 = obj1.offsetHeight+obj1.offsetTop;    
			var l1 = obj1.offsetLeft;    
			var t2 = obj2.offsetTop;    
			var r2 = obj2.offsetWidth+obj2.offsetLeft;    
			var b2 = obj2.offsetHeight+obj2.offsetTop;    
			var l2 = obj2.offsetLeft;    
			if(t1>b2||r1<l2||b1<t2||l1>r2){    
				return false;    
			}else{    
				return true;    
			}    
		}    
		//勾股定理求距离    
		function getDis(obj1,obj2){    
			var a = obj1.offsetLeft-obj2.offsetLeft;    
			var b = obj1.offsetTop-obj2.offsetTop;    
			return Math.sqrt(Math.pow(a,2)+Math.pow(b,2));    
		}    
		//找到距离最近的    
		function findMin(obj){    
			var minDis = 999999999;    
			var minIndex = -1;    
			for(var i=0;i<aLi.length;i++){    
				if(obj==aLi[i])continue;    
				if(colTest(obj,aLi[i])){    
					var dis = getDis(obj,aLi[i]);    
					if(dis<minDis){    
						minDis = dis;    
						minIndex = i;    
					}    
				}    
			}    
			if(minIndex==-1){    
				return null;    
			}else{    
				return aLi[minIndex];    
			}    
		}	
    
	}    
</script>    
</head>    
<body>    
<ul id="ul1">    
<li><img src="images/1.png" width="200" height="150" /></li>    
<li><img src="images/2.png" width="200" height="150" /></li>    
<li><img src="images/3.png" width="200" height="150" /></li>    
<li><img src="images/4.png" width="200" height="150" /></li>    
<li><img src="images/5.png" width="200" height="150" /></li>    
<li><img src="images/6.png" width="200" height="150" /></li>    
</ul>    
</body>    
</html>


move.js

;function getClass(cls){var ret=[];var els=document.getElementsByTagName("*");for(var i=0;i<els.length;i++){if(els[i].className===cls||els[i].className.indexOf("cls")>=0||els[i].className.indexOf(" cls")>=0||els[i].className.indexOf(" cls ")>0){ret.push(els[i]);}}
return ret;}
function getStyle(obj,attr){return obj.currentStyle?obj.currentStyle[attr]:getComputedStyle(obj,false)[attr];}
function startMove(obj,json,fun){clearInterval(obj.timer);obj.timer=setInterval(function(){var isStop=true;for(var attr in json){var iCur=0;if(attr=="opacity"){iCur=parseInt(parseFloat(getStyle(obj,attr))*100);}else{iCur=parseInt(getStyle(obj,attr));}
var ispeed=(json[attr]-iCur)/8;ispeed=ispeed>0?Math.ceil(ispeed):Math.floor(ispeed);if(iCur!=json[attr]){isStop=false;}
if(attr=="opacity"){obj.style.filter="alpha:(opacity:"+(json[attr]+ispeed)+")";obj.style.opacity=(json[attr]+ispeed)/100;}else{obj.style[attr]=iCur+ispeed+"px";}}
if(isStop){clearInterval(obj.timer);if(fun){fun();}}},30);}