JS實(shí)現(xiàn)元素的拖動(dòng)與占位功能
這篇博客,是博主這幾天剛做的一個(gè)項(xiàng)目遇到的一個(gè)難點(diǎn),學(xué)會(huì)了這個(gè),你就能輕松實(shí)現(xiàn)頁面元素的移動(dòng)啦,再配合一些條件,就可以做出一個(gè)任務(wù)完成進(jìn)度的頁面了!
先來看看效果:
實(shí)現(xiàn)功能:
拖動(dòng)元素從一個(gè)板塊移動(dòng)到另一個(gè)板塊的某個(gè)位置, 博主根據(jù)自己的需求做的這個(gè)是點(diǎn)擊的元素 只能移動(dòng)到它所在模塊的下一個(gè)模塊,如果移動(dòng)到別的模塊就會(huì)回到原來位置,而且當(dāng)你拖動(dòng)的 元素位置沒有超過某個(gè)距離也會(huì)自動(dòng)彈回到原來位置
案例分析:
關(guān)鍵一步就在于!當(dāng)你鼠標(biāo)按下的時(shí)候,不僅要獲取到當(dāng)前的元素還要獲取到當(dāng)前所在的模塊(所以在一開始就要先給每個(gè)模塊設(shè)置一個(gè)index屬性,屬性值就是每個(gè)模塊本身的索引號(hào)),這一步是為了當(dāng)鼠標(biāo)放開的時(shí)候進(jìn)行判斷所要移動(dòng)到的模塊是否是當(dāng)前模塊的下一個(gè)模塊(可能有點(diǎn)繞,仔細(xì)讀仔細(xì)品),如果條件成立,那么就要開始和所要移動(dòng)到的模塊中的元素一一比較位置了(這里是為了確定元素要移動(dòng)到的具體位置),確定好后就要在具體位置新建一個(gè)空的元素,把移動(dòng)元素的內(nèi)容添加到這個(gè)空的元素中,最后最后一步!不要忘記把原先的那個(gè)元素移除噢~
代碼呈現(xiàn):
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./js/jQuery.min.js"></script> <style> * { margin: 0; left: 0; list-style: none; box-sizing: border-box; } .container { display: flex; justify-content: space-around; width: 1000px; height: 600px; margin: 100px auto; padding: 0; } .container li { width: 180px; height: 100%; background-color: plum; border-radius: 10px; padding: 5px; } .item { width: 170px; height: 100px; background-color: salmon; margin: 5px 0; border-radius: 10px; cursor: pointer; } </style> </head> <body> <ul class="container"> <li> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> </li> <li> <div class="item">4</div> <div class="item">5</div> <div class="item">6</div> </li> <li> <div class="item">7</div> <div class="item">8</div> <div class="item">9</div> </li> <li></li> <li></li> </ul> <script> $(function(){ for (var i = 0; i < 5; i++) { $(".container li")[i].setAttribute('index', i); } $('.item').on('mousedown',function(e){ var index = Number($(this).parent()[0].getAttribute('index')); //獲取當(dāng)前所選任務(wù)的左邊距和上邊距 startLeft = $(this).offset().left; startTop = $(this).offset().top; //求鼠標(biāo)在所選任務(wù)里的位置 mouseX = e.pageX - startLeft; mouseY = e.pageY - startTop; $(this).on('mousemove',function(e){ $(this).offset({ left: e.pageX - mouseX, top: e.pageY - mouseY }) }) $(this).on('mouseup',function(){ //用來記錄item移動(dòng)到那個(gè)位置 k = -1; $(this).off('mousemove'); //獲取所選 模塊 的下一個(gè) 模塊索引 if (index >= 4) { index = 3; } var next = $('.container li').eq(index + 1); //如果鼠標(biāo)放開時(shí),所移動(dòng)到的距離正好位于所選模塊的下一個(gè)模塊的區(qū)間內(nèi),就執(zhí)行 if ($(this).offset().left >= next.offset().left&&$(this).offset().left <= next.offset().left + next[0].offsetWidth) { //獲取到所選的item中的內(nèi)容 var text = $(this).html(); //在最終所要放置的位置新建一個(gè)空任務(wù),再把所獲取到的內(nèi)容添加進(jìn)去 var father = document.createElement('div'); father.className = 'item'; $(father).append(text); //把點(diǎn)擊的當(dāng)前元素獲取過來 var ele = $(this); //如果當(dāng)前模塊沒有item,則直接添加到第一個(gè)位置,如果有,則比較看它的top比哪個(gè) 大就放在哪個(gè)的后面 if (next.children().length == 0) { next.append(father); } else { $.each(next.children(), function (i,item) { if ( ele.offset().top > $(item).offset().top) { k = i; } }) //如果 k == -1 說明 要把任務(wù)放在該模塊的第一個(gè)位置 if (k == -1) { next.children().eq(0).before(father); } else { next.children().eq(k).after(father); } } //解綁移動(dòng)事件,清空原來位置的item $(this).off("mousemove"); $(this).remove(); $(this).empty(); } else { //這里就是移動(dòng)不成功,回到原來位置 $(this).offset({ left: startLeft, top: startTop }) $(this).off("mousemove"); } }) }) }) </script> </body> </html>
擴(kuò)展:
這個(gè)案例再結(jié)合后臺(tái)數(shù)據(jù),就可以實(shí)現(xiàn)多個(gè)任務(wù)不同進(jìn)度的顯示和拖動(dòng)效果了,如下圖所示:
還不快快卷起來~
到此這篇關(guān)于JS實(shí)現(xiàn)元素的拖動(dòng)與占位功能的文章就介紹到這了,更多相關(guān)js元素拖動(dòng)占位內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
教你一步步實(shí)現(xiàn)一個(gè)簡(jiǎn)易promise
Promise是異步編程的一種解決方案,比傳統(tǒng)的解決方案回調(diào)函數(shù)和事件更合理且更強(qiáng)大,這篇文章主要給大家介紹了關(guān)于如何一步步實(shí)現(xiàn)一個(gè)簡(jiǎn)易promise的相關(guān)資料,需要的朋友可以參考下2021-11-11JavaScript實(shí)現(xiàn)簡(jiǎn)單的二級(jí)導(dǎo)航菜單實(shí)例
這篇文章主要介紹了JavaScript實(shí)現(xiàn)簡(jiǎn)單的二級(jí)導(dǎo)航菜單,設(shè)計(jì)javascript動(dòng)態(tài)操作頁面元素的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04use jscript Create a SQL Server database
use jscript Create a SQL Server database...2007-06-06JS實(shí)現(xiàn)進(jìn)度條動(dòng)態(tài)加載特效
這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)進(jìn)度條動(dòng)態(tài)加載特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03JS實(shí)現(xiàn)自動(dòng)變化的導(dǎo)航菜單效果代碼
這篇文章主要介紹了JS實(shí)現(xiàn)自動(dòng)變化的導(dǎo)航菜單效果代碼,涉及JavaScript基于定時(shí)函數(shù)觸發(fā)頁面元素屬性動(dòng)態(tài)變換的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09javascript+mapbar實(shí)現(xiàn)地圖定位
地圖定位 圖吧地圖定位 附j(luò)avascript源碼每行都有注釋2010-04-04JavaScript 中的12種循環(huán)遍歷方法【總結(jié)】
本文給大家總結(jié)了12種JavaScript 中的1循環(huán)遍歷方法,每種方法通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-05-05