JavaScript實現(xiàn)九宮格拖拽效果
本文實例為大家分享了JavaScript實現(xiàn)九宮格拖拽效果的具體代碼,供大家參考,具體內(nèi)容如下
關(guān)于一些拼圖游戲什么的,見人家效果做的不錯,參考下別人寫的代碼,我也嘗試著做了個。
<!DOCTYPE html> <html> ?? ?<head> ?? ??? ?<meta charset="UTF-8"> ?? ??? ?<title></title> ?? ??? ?<style type="text/css"> ?? ??? ??? ?body{ ?? ??? ??? ??? ?margin: 0; ?? ??? ??? ??? ?padding: 0; ?? ??? ??? ?} ?? ??? ??? ?#wrap{ ?? ??? ??? ??? ?position: relative; ?? ??? ??? ?} ?? ??? ??? ?#wrap div{ ?? ??? ??? ??? ?position: absolute; ?? ??? ??? ??? ?width: 100px; ?? ??? ??? ??? ?height: 100px; ?? ??? ??? ??? ?font-size: 50px; ?? ??? ??? ??? ?text-align: center; ?? ??? ??? ??? ?line-height: 100px; ?? ??? ??? ??? ?border-radius: 10px; ?? ??? ??? ?} ?? ??? ?</style> ?? ?</head> ?? ?<body> ?? ??? ?<div id="wrap"></div> ?? ??? ?<script type="text/javascript"> ?? ??? ??? ?//生成結(jié)構(gòu) ?? ??? ??? ?var oWrap = document.getElementById("wrap"); ?? ??? ??? ?var mt = ml = 10; ?? ??? ??? ?for(var i = 0; i < 3; i++){ ?? ??? ??? ??? ?for(var j = 0; j < 3; j++){ ?? ??? ??? ??? ??? ?var oDiv = document.createElement("div"); ?? ??? ??? ??? ??? ?oWrap.appendChild(oDiv); ?? ??? ??? ??? ??? ?oDiv.style.top = i*(oDiv.offsetHeight + mt) + "px"; ?? ??? ??? ??? ??? ?oDiv.style.left = j*(oDiv.offsetWidth + ml) + "px"; ?? ??? ??? ??? ??? ?oDiv.style.backgroundColor = "rgb("+Math.floor(Math.random()*256)+","+Math.floor(Math.random()*256)+","+Math.floor(Math.random()*256)+")" ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ??? ? ?? ??? ??? ?var arr = "ABCDEFGHI"; ?? ??? ??? ? ?? ??? ??? ?var aItems = oWrap.children; ?? ??? ??? ?var len = aItems.length; ?? ??? ??? ? ?? ??? ??? ?for(var i = 0; i < aItems.length; i++){ ?? ??? ??? ??? ?aItems[i].innerHTML = arr[i]; ?? ??? ??? ?} ?? ??? ??? ?//拖拽及交換位置 ?? ??? ??? ? ?? ??? ??? ?for(var i = 0; i < aItems.length; i++){ ?? ??? ??? ??? ?aItems[i].onmousedown = function(e){ ?? ??? ??? ??? ??? ?var evt = e || event; ?? ??? ??? ??? ??? ?var x = evt.offsetX; ?? ??? ??? ??? ??? ?var y = evt.offsetY; ?? ??? ??? ??? ??? ?/*var x = evt.clientX - this.offsetLeft - oWrap.offsetLeft; ?? ??? ??? ??? ??? ?var y = evt.clientY - this.offsetTop - oWrap.offsetTop;*/ ?? ??? ??? ??? ??? ?var _this = this; ?? ??? ??? ??? ??? ? ?? ??? ??? ??? ??? ?var cloneNode = this.cloneNode(); ?? ??? ??? ??? ??? ?cloneNode.style.border = '1px dashed #cecece'; ?? ??? ??? ??? ??? ?this.style.zIndex = 1; ?? ??? ??? ??? ??? ?oWrap.replaceChild(cloneNode,this); ?? ??? ??? ??? ??? ?oWrap.appendChild(this); ?? ??? ??? ??? ??? ? ?? ??? ??? ??? ??? ?document.onmousemove = function(e){ ?? ??? ??? ??? ??? ??? ?var evt = e || event; ?? ??? ??? ??? ??? ??? ?var _left = evt.clientX - x - oWrap.offsetLeft; ?? ??? ??? ??? ??? ??? ?var _top = evt.clientY - y - oWrap.offsetTop; ?? ??? ??? ??? ??? ??? ?_this.style.left = _left + "px"; ?? ??? ??? ??? ??? ??? ?_this.style.top = _top + "px"; ?? ??? ??? ??? ??? ??? ? ?? ??? ??? ??? ??? ??? ?return false; ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ??? ? ?? ??? ??? ??? ??? ?document.onmouseup = function(){ ?? ??? ??? ??? ??? ??? ? ?? ??? ??? ??? ??? ??? ?//交換位置 ?? ??? ??? ??? ??? ??? ?var disArr = []; ?? ??? ??? ??? ??? ??? ?var newArr = []; ?? ??? ??? ??? ??? ??? ?console.log(aItems.length); ?? ??? ??? ??? ??? ??? ?for(var i = 0; i < len; i++){ ?? ??? ??? ??? ??? ??? ??? ?var disX = _this.offsetLeft - aItems[i].offsetLeft; ?? ??? ??? ??? ??? ??? ??? ?var disY = _this.offsetTop - aItems[i].offsetTop; ?? ??? ??? ??? ??? ??? ??? ?var dis = Math.sqrt(Math.pow(disX,2)+Math.pow(disY,2)); ?? ??? ??? ??? ??? ??? ??? ?disArr.push(dis); ?? ??? ??? ??? ??? ??? ??? ?newArr.push(dis); ?? ??? ??? ??? ??? ??? ?} ?? ??? ??? ??? ??? ??? ?disArr.sort(function(a,b){ ?? ??? ??? ??? ??? ??? ??? ?return a-b; ?? ??? ??? ??? ??? ??? ?}) ?? ??? ??? ??? ??? ??? ?var minIndex = newArr.indexOf(disArr[0]); ?? ??? ??? ??? ??? ??? ? ?? ??? ??? ??? ??? ??? ?_this.style.left = aItems[minIndex].style.left; ?? ??? ??? ??? ??? ??? ?_this.style.top = aItems[minIndex].style.top; ?? ??? ??? ??? ??? ??? ?aItems[minIndex].style.left = cloneNode.style.left; ?? ??? ??? ??? ??? ??? ?aItems[minIndex].style.top = cloneNode.style.top; ?? ??? ??? ??? ??? ??? ?oWrap.removeChild(cloneNode); ?? ??? ??? ??? ??? ??? ?document.onmousemove = null; ?? ??? ??? ??? ??? ??? ?document.onmouseup = null; ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ??? ?/*var arr = [45,32,11,90]; ?? ??? ??? ?var minVal = Math.min.apply(null,arr); ?? ??? ??? ?var minIndex = arr.indexOf(minVal); ?? ??? ??? ?console.log(minVal,arr,minIndex);*/ ?? ??? ?</script> ?? ?</body> </html>
這是效果圖
雖說實現(xiàn)了效果,但我寫的還是不太嚴(yán)謹(jǐn),還有諸多bug,比如上邊做邊沒距離,實際寫的話還要加上這個距離,即使距離為0,還有就是我發(fā)現(xiàn)拖拽的時候,如果使用qq截圖的話,克隆的那個小方塊沒辦法消失,只得重新刷新頁面,有沒有大佬解決下。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于在Typescript中做錯誤處理的方式詳解
錯誤處理是軟件工程重要的一部分,如果處理得當(dāng),它可以為你節(jié)省數(shù)小時的調(diào)試和故障排除時間,我發(fā)現(xiàn)了與錯誤處理相關(guān)的三大疑難雜癥:TypeScript的錯誤類型,變量范圍和嵌套,讓我們逐一深入了解它們帶來的撓頭問題,感興趣的朋友可以參考下2023-09-09《JavaScript高級程序設(shè)計》閱讀筆記(二) ECMAScript中的原始類型
ECMAScript有5種原始類型(primitive type),即Undefined、Null、Boolean、Number和String。ECMAScript提供了typeof來判斷值的類型2012-02-02仿iPhone通訊錄制作小程序自定義選擇組件的實現(xiàn)
這篇文章主要介紹了仿iPhone通訊錄制作小程序自定義選擇組件的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05