JavaScript實(shí)現(xiàn)九宮格拖拽效果
本文實(shí)例為大家分享了JavaScript實(shí)現(xiàn)九宮格拖拽效果的具體代碼,供大家參考,具體內(nèi)容如下
關(guān)于一些拼圖游戲什么的,見人家效果做的不錯(cuò),參考下別人寫的代碼,我也嘗試著做了個(gè)。
<!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>這是效果圖

雖說實(shí)現(xiàn)了效果,但我寫的還是不太嚴(yán)謹(jǐn),還有諸多bug,比如上邊做邊沒距離,實(shí)際寫的話還要加上這個(gè)距離,即使距離為0,還有就是我發(fā)現(xiàn)拖拽的時(shí)候,如果使用qq截圖的話,克隆的那個(gè)小方塊沒辦法消失,只得重新刷新頁面,有沒有大佬解決下。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 原生js實(shí)現(xiàn)九宮格拖拽換位
- JQuery Dialog(JS 模態(tài)窗口,可拖拽的DIV)
- Sortable.js拖拽排序使用方法解析
- js實(shí)現(xiàn)拖拽效果
- javascript實(shí)現(xiàn)移動(dòng)端上的觸屏拖拽功能
- 使用js實(shí)現(xiàn)的簡(jiǎn)單拖拽效果
- JS實(shí)現(xiàn)的文件拖拽上傳功能示例
- JS實(shí)現(xiàn)漂亮的窗口拖拽效果(可改變大小、最大化、最小化、關(guān)閉)
- 使用javaScript實(shí)現(xiàn)鼠標(biāo)拖拽事件
- JavaScript實(shí)現(xiàn)圖片的放大縮小及拖拽功能示例
相關(guān)文章
js實(shí)現(xiàn)帶緩沖效果的仿QQ面板折疊菜單代碼
這篇文章主要介紹了js實(shí)現(xiàn)帶緩沖效果的仿QQ面板折疊菜單代碼,通過JavaScript定時(shí)函數(shù)遞歸調(diào)用實(shí)現(xiàn)折疊菜單的緩沖效果,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09
關(guān)于在Typescript中做錯(cuò)誤處理的方式詳解
錯(cuò)誤處理是軟件工程重要的一部分,如果處理得當(dāng),它可以為你節(jié)省數(shù)小時(shí)的調(diào)試和故障排除時(shí)間,我發(fā)現(xiàn)了與錯(cuò)誤處理相關(guān)的三大疑難雜癥:TypeScript的錯(cuò)誤類型,變量范圍和嵌套,讓我們逐一深入了解它們帶來的撓頭問題,感興趣的朋友可以參考下2023-09-09
《JavaScript高級(jí)程序設(shè)計(jì)》閱讀筆記(二) ECMAScript中的原始類型
ECMAScript有5種原始類型(primitive type),即Undefined、Null、Boolean、Number和String。ECMAScript提供了typeof來判斷值的類型2012-02-02
如何利用JS實(shí)現(xiàn)時(shí)間軸動(dòng)畫效果
時(shí)間軸動(dòng)畫和幀式動(dòng)畫有很大不同,但相比之下時(shí)間軸方式來的更直觀和簡(jiǎn)便,下面這篇文章主要給大家介紹了關(guān)于如何利用JS實(shí)現(xiàn)時(shí)間軸動(dòng)畫效果的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06
仿iPhone通訊錄制作小程序自定義選擇組件的實(shí)現(xiàn)
這篇文章主要介紹了仿iPhone通訊錄制作小程序自定義選擇組件的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05

