代码如下:
首先声明一下,判断是否交换位置的代码可以写在两个地方分别是:onmouseup和onmousemove。但写在两个地方的效果不同。假如写在onmousemove里,那么随着鼠标移动li,后松开鼠标左键回触发多个li的推动;但写在onmouseup不会,当松开鼠标左键,只有当前li和目标li 进行交换。看自己的喜好,写在哪都可以,我这里是写在了onmouseup里
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>九宫格完整版</title>
<style type="text/css">
*{
margin: 0;
padding: 0;
}
#box{
width: 600px;
height: 600px;
border: 1px solid #FFC0CB;
list-style: none;
margin: 10px auto;
position: relative;
}
#box li{
width: 200px;
height: 200px;
text-align: center;
line-height: 200px;
font-size: 50px;
background: pink;
position: absolute;
}
#box .active{
z-index: 1;
color: #ac0;
background: yellow;
}
</style>
</head>
<body>
<ul id="box">
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
</ul>
</body>
</html>
<script type="text/javascript">
var oBox=document.getElementById('box');
var aLi=oBox.children;
for(var i=0;i<aLi.length;i++){
//布局
aLi[i].style.left=(i%3)*200+'px';
aLi[i].style.top=Math.floor(i/3)*200+'px';
//记录顺序
aLi[i].index=i;
//拖拽
aLi[i].οnmοusedοwn=function(ev){
var e=ev || window.event;
var iX=e.clientX-this.offsetLeft;
var iY=e.clientY-this.offsetTop;
//针对低版本ie,建立透明层
if(this.setCapture){
this.setCapture();
}
//添加样式
this.className='active';
var that=this;
document.οnmοusemοve=function(ev){
var e=ev || window.event;
var iL=e.clientX-iX;
var iT=e.clientY-iY;
that.style.left=iL+'px';
that.style.top=iT+'px';
};
document.οnmοuseup=function(){
document.οnmοusemοve=null;
document.οnmοuseup=null;
//针对低版本ie,建立透明层
if(this.releaseCapture){
this.releaseCapture();
}
//判断是否交换位置
for(var j=0;j<aLi.length;j++){
if(
aLi[j]!=that//排除自己
&& that.offsetLeft+that.offsetWidth>aLi[j].offsetLeft+aLi[j].offsetWidth/2
&& that.offsetTop+that.offsetHeight>aLi[j].offsetTop+aLi[j].offsetHeight/2
&& that.offsetLeft<aLi[j].offsetLeft+aLi[j].offsetWidth/2
&& that.offsetTop<aLi[j].offsetTop+aLi[j].offsetHeight/2
){
//交换顺序
var temp=aLi[j].index;
aLi[j].index=that.index;
that.index=temp;
//交换位置
aLi[j].style.left=(aLi[j].index%3)*200+'px';
aLi[j].style.top=Math.floor(aLi[j].index/3)*200+'px';
break;
}
}
//去掉样式
that.className='';
//还原位置
that.style.left=(that.index % 3)*200+'px';
that.style.top=Math.floor(that.index / 3)*200+'px';
};
//阻止浏览器的默认行为
return false;
}
}
</script>
愿你,看清生活的真相后,还能拥抱生活。
。