1. 程式人生 > >原生javascript製作拼圖遊戲

原生javascript製作拼圖遊戲

實現方法

 

//1、讓所有的li(在ul裡)可以拖拽

//2、交換li的位置  計算背景圖位置

//1、讓所有的li(在ul裡)可以拖拽
//根據滑鼠的位置,計算目標li的序號

//根據行號和列號計算下標
//行號*3+列號
//2、歸位

此處沒有背景圖  請自行新增 css樣式

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			html,body{
				margin:0;
				padding:0;
			}
			#box{
				list-style:none;
				position:relative;
				width:600px;
				height:600px;
				box-sizing:border-box;
				margin:10px auto;
			}
			li{
				position:absolute;
				width:200px;
				height:200px;
				border:1px solid white;
				background-image:url(img/b1.jpg);
				background-size:600px 600px;
			}
			#box li:nth-child(1){
				left:0px;
				top:0px;
				background-position:0px 0px;
			}
			#box li:nth-child(2){
				left:200px;
				top:0px;
				background-position:-200px 0px;
			}
			#box li:nth-child(3){
				left:400px;
				top:0px;
				background-position:-400px 0px;
			}
			
			#box li:nth-child(4){
				left:0px;
				top:200px;
				background-position:0px -200px;
			}
			#box li:nth-child(5){
				left:200px;
				top:200px;
				background-position:-200px -200px;
			}
			#box li:nth-child(6){
				left:400px;
				top:200px;
				background-position:-400px -200px;
			}
			
			#box li:nth-child(7){
				left:0px;
				top:400px;
				background-position:0px -400px;
			}
			#box li:nth-child(8){
				left:200px;
				top:400px;
				background-position:-200px -400px;
			}
			#box li:nth-child(9){
				left:400px;
				top:400px;
				background-position:-400px -400px;
			}
			
		</style>
	</head>
	<body>
		<ul id="box">
			<li></li>
			<li></li>
			<li></li>
			<li></li>
			<li></li>
			<li></li>
			<li></li>
			<li></li>
			<li></li>
		</ul>
	</body>
</html>

<script type="text/javascript" src="js/cssTools.js"></script>
<script type="text/javascript" src="js/eventTools.js"></script>

這個是這連個js連線的程式碼

 

//csstools
//功能:獲取某個DOM元素的樣式屬性的相容性寫法
//引數:dom元素,樣式屬性名
//返回值:樣式屬性的值

function getStyle(domObj,attr){
	if(domObj.currentStyle){//domObj.currentStyle如果能夠正確獲取到,那就真
		return domObj.currentStyle[attr];//當物件的屬性名是變數時,用方括號而不是點。
	}else{
		return window.getComputedStyle(domObj)[attr];
	}	
}
//eventTools

//功能:阻止瀏覽器預設行為的封裝
//引數:事件物件
//返回值:無

function preventDefault1809(evt) {
	if(evt.returnValue){
		evt.returnValue = false;
	}else{
		evt.preventDefault();
	}
}

//功能:繫結事件
//引數:
	//事件源
	//事件型別名,不帶on
	//事件處理函式,
	//是否冒泡
//返回值:無

function addEvent1809(domObj,eventType,func,isBubble){
	if(domObj.addEventListener){
		domObj.addEventListener(eventType,func,isBubble);
	}else if(domObj.attachEvent){
		domObj.attachEvent('on'+eventType,func);
	}else{
		domObj['on'+eventType] = func;
	}
}

//當物件的屬性是變數時,不能用點,只能用方括號
/*
var obj = {
	id:'007'
}
obj.id;
var temp = "id";
obj[temp]
*/

js部分

<script type="text/javascript">


function $(id){
	return document.getElementById(id);
}

window.onload = function(){	
	drag();
}

//1、讓所有的li(在ul裡)可以拖拽
function drag(){
	var lis = $("box").children;
	var currIndex = -1;//記錄被按下的那個li
	var targetIndex = -1;
	for(var i=0;i<lis.length;i++){
		lis[i].setAttribute("index",i);
		lis[i].onmousedown = function(event){
			currIndex = this.getAttribute("index");
			var evt = event || window.event;
			var offsetX = evt.offsetX;
			var offsetY = evt.offsetY;
			this.style.zIndex = 1;
			var liDom = this;
			$("box").onmousemove = function(event){
				var evt = event || window.event;

				//1、資料距離大盒子左上角的距離
				var mouseX = evt.pageX-$("box").offsetLeft; 
				var mouseY = evt.pageY-$("box").offsetTop; 

				//滑鼠距離頁面左邊的距離- 大盒子距離頁面左邊的距離-滑鼠距離事件源的左邊距離
				var left1 = mouseX-offsetX;
				var top1 = mouseY-offsetY;
				//li不能拖拽到界外(大盒子外面)
				if(left1<0 || left1>600-200 || top1<0 || top1>600-200 ){
					return;
				}
				
				liDom.style.left = left1+"px";
				liDom.style.top = top1+"px";

				targetIndex = getTargetIndex(mouseX,mouseY);
				console.log(targetIndex);
			}
		}

		document.body.onmouseup = function(){
			$("box").onmousemove = null;
			if(currIndex>-1){
				lis[currIndex].style.zIndex = 0;
				exchangeLi(currIndex,targetIndex);
			}
		}
	}
}

//根據滑鼠的位置,計算目標li的序號
function getTargetIndex(x,y){
	//計算行號
	var rowIndex = parseInt(y/200);//

	//計算列號
	var colIndex = parseInt(x/200);//

	//根據行號和列號計算下標
	//行號*3+列號
	return rowIndex*3+colIndex;
}


function exchangeLi(sourceIndex,targetIndex){
	// var lis = $("box").children;
	// if(sourceIndex<-1 || sourceIndex>lis.length-1 || targetIndex<-1 || targetIndex>lis.length-1){
	// 	return;
	// }
	if(sourceIndex!=targetIndex){
		 var lis = $("box").children;
		 //1、交換backgroundPosition
		 var temp =getStyle(lis[sourceIndex],"backgroundPosition");
		 lis[sourceIndex].style.backgroundPosition = getStyle(lis[targetIndex],"backgroundPosition");
		 lis[targetIndex].style.backgroundPosition = temp;
	}

	 //2、歸位
	 rowIndex = parseInt(sourceIndex/3);
	 colIndex = sourceIndex%3;
	 lis[sourceIndex].style.left = colIndex*200+"px";
	 lis[sourceIndex].style.top = rowIndex*200+"px";

}

</script>