1. 程式人生 > >源生JS寫九宮格

源生JS寫九宮格

<!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>