<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style>
div{
display: flex;
justify-content: center;
align-items: center;
font-size: 36px;
color: #fff;
cursor: pointer;
position: absolute;
width: 120px;
height: 120px;
border-radius: 20px;
}
#wrap{
display: flex;
justify-content: space-between;
flex-wrap: wrap;
position:relative;
}
</style>
</head>
<body>
<!--九宫格-->
<div id="wrap"></div>
<script>
var outer=document.getElementById("wrap");
var mg_top=10;
var mg_left=10;
for(var i=0;i<3;i++){//九宫格行数
for(var j=0;j<3;j++){//九宫格列数
var str = "1234567890abcdefABCDEF";//产生随机颜色
var diffColor = "#";
for(var k=0;k<6;k++){
var diffnum = Math.floor(Math.random()*12);
diffColor += str[diffnum];
}
var oDiv=document.createElement("div");//创建div元素
outer.appendChild(oDiv);
oDiv.style.background = diffColor;
oDiv.style.top = i*(oDiv.offsetHeight+mg_top)+"px";//每行div的定位top值
oDiv.style.left = j*(oDiv.offsetWidth+mg_left)+"px";//每列div的定位left值
}
}
//向每个div中添加序号
var str2 = "ABCDEFGHI";
var mDiv = outer.getElementsByTagName("div");
for(var m=0;m<str2.length;m++){
mDiv[m].innerHTML = str2[m];
}
for(var n=0;n<mDiv.length;n++){
mDiv[n].onmousedown = function(e){
var evt = e || event;
//克隆节点
//用克隆的把原来的替换掉,再把替换掉的加到外层父级div中,防止div消失
var movenum = this;
var clone = movenum.cloneNode();
outer.replaceChild(clone,movenum);
outer.appendChild(movenum);
//获取事件对象位置
var mouse_left = evt.offsetX;
var mouse_top = evt.offsetY;
document.onmousemove = function(e){
var evt = e || event;
//避免移动块div会以左上角为移动点使left值和top值变大
var x = evt.clientX-mouse_left;
var y = evt.clientY-mouse_top;
movenum.style.left = x+"px";
movenum.style.top = y+"px";
}
document.onmouseup = function(){
document.onmousemove = null;
//替换位置
//两个数组,都存放移动块距离每个固定块的距离,然后一个从小到大排序,获取数组0位置是最小值,然后用indexOf在没有排序的数组中找到这个距离是与那个固定div之间的
var arr1 = [];
var arr2 = [];
for(var d=0;d<mDiv.length-1;d++){
var disX = mDiv[d].offsetLeft-movenum.offsetLeft;
var disY = mDiv[d].offsetTop-movenum.offsetTop;
var distance = Math.sqrt(Math.pow(disX,2)+Math.pow(disY,2));
arr1.push(distance);
arr2.push(distance);
}
//距离从小到大排序
arr1.sort(function(a,b){
return a-b;
})
//得到最小距离后在未经过排序的arr2中找这个距离对应的索引值,就能找到距离移动块距离最小的那个div
var minDis = arr1[0];
var minIndex = arr2.indexOf(minDis);
//将距离移动块距离小的div的left和top给移动块,移动块占据这个div的位置
//移动块占据div块位置后,把克隆的移动块的位置给被占据位置的div
movenum.style.left = mDiv[minIndex].style.left;
movenum.style.top = mDiv[minIndex].style.top;
mDiv[minIndex].style.left = clone.style.left;
mDiv[minIndex].style.top = clone.style.top;
//把克隆块删除,结束鼠标松开事件
outer.removeChild(clone);
document.onmouseup = null;
}
}
}
</script>
</body>
</html>
源生JS写九宫格
猜你喜欢
转载自blog.csdn.net/qq_42758038/article/details/81942149
今日推荐
周排行