原生javascript製作拼圖遊戲
阿新 • • 發佈:2018-12-25
實現方法
//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>