九宫格,换位置

先布局好,布局不同,js就会不同

 

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
        <style type="text/css">
        body{
            margin:0;
            padding:0;
        }
        #wrap{
            position: relative;
        }
        #wrap div{
            position: absolute;
            width: 100px;
            height: 100px;
            text-align: center;
            line-height: 100px;
            border-radius: 10px;
            font-size: 18px;
        }
    </style>
</head>
<body>
    <div id="wrap"></div>
    <script>
        var oWrap = document.getElementById("wrap");
        var mt = ml = 10;
        //创建三行三列结构的div;
        for(var i = 0;i<3;i++){//行
            for(var j=0;j<3;j++){//列
                var oDiv = document.createElement("div");
                oWrap.appendChild(oDiv);
                oDiv.style.left = j*(oDiv.offsetWidth+ml)+"px";
                oDiv.style.top = i*(oDiv.offsetHeight+mt)+"px";
                oDiv.style.background = "rgb("+Math.floor(Math.random()*256)+","+
                Math.floor(Math.random()*256)+","+
                Math.floor(Math.random()*256)+")";         
            }
        }
        //在div里 放置内容
        var str = "ABCDEFGHI";
        var aItem = oWrap.children;//div
        for(var i = 0;i<str.length;i++){
            aItem[i].innerHTML = str[i]//字符串里面的索引所对应的内容赋值给对应的div
        }

        //拖拽
        for(var i = 0;i<aItem.length;i++){
            aItem[i].onmousedown = function(e){
                var evt = e|| event;
                //鼠标点下去时候相对于事件源的坐标
                var x = evt.offsetX;
                var y = evt.offsetY;
                var  dragNode = this;//保存鼠标原来的坐标
                //克隆一个被拖拽的那个div
                var cloneNode = dragNode.cloneNode();
                oWrap.replaceChild(cloneNode,dragNode);//替换
                //被替换后,拖拽的那个消失,所以再加一个拖拽的
                oWrap.appendChild(dragNode);
                cloneNode.style.border = "1px dashed red";

                document.onmousemove =function(e){
                    var evt = e|| event;
                    //evt.clientX鼠标移动后距left的可视距离
                    var _left  = evt.clientX-x;
                    var _top  = evt.clientY-y;
                    //拖拽后的坐标
                    dragNode.style.left = _left + "px";
                    dragNode.style.top = _top + "px";
                    return false//阻止鼠标移动的默事件
                }
                document.onmouseup = function(){
                    var disArr = [];//存储所求距离的
                    var newArr = [];
                    for(var i =0;i<aItem.length-1;i++){
                        //
                        var disX = dragNode.offsetLeft - 
                        aItem[i].offsetLeft;
                        var disY = dragNode.offsetTop - 
                        aItem[i].offsetTop;
                        //勾股定理求距离
                        var dis  = Math.sqrt(Math.pow(disX,2)+ Math.pow(disY,2),2)
                        disArr.push(dis);//把求的距离放到disArr中
                       newArr.push(dis);//把求的距离放到disArr中,新增一个一样的数组是为了拖出来的那个和原来的比较                    
                    }
                    //console.log(disArr)

                    disArr.sort(function(a,b){
                        return a-b//从小到大排列
                    })
                    var minNum = disArr[0];
                    var minIndex = newArr.indexOf(minNum)//在没有改变位置的数组中找到最小值的索引;
                   // console.log(minIndex)
                    
                    //交换位置
                    dragNode.style.left = aItem[minIndex].style.left;
                    dragNode.style.top = aItem[minIndex].style.top;
                    aItem[minIndex].style.left= cloneNode.style.left;
                    aItem[minIndex].style.top=cloneNode.style.top;
                    oWrap.removeChild(cloneNode)//移除克隆

                   document.onmousemove = null;//取消鼠标移动
                   document.onmouseup = null;//取消鼠标抬起
                }
             return false
            }
        }
    </script>
</body>
</html>

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值