JS實(shí)現(xiàn)元素的拖動(dòng)與占位功能
這篇博客,是博主這幾天剛做的一個(gè)項(xiàng)目遇到的一個(gè)難點(diǎn),學(xué)會(huì)了這個(gè),你就能輕松實(shí)現(xiàn)頁(yè)面元素的移動(dòng)啦,再配合一些條件,就可以做出一個(gè)任務(wù)完成進(jìn)度的頁(yè)面了!

先來(lái)看看效果:

實(shí)現(xiàn)功能:
拖動(dòng)元素從一個(gè)板塊移動(dòng)到另一個(gè)板塊的某個(gè)位置, 博主根據(jù)自己的需求做的這個(gè)是點(diǎn)擊的元素 只能移動(dòng)到它所在模塊的下一個(gè)模塊,如果移動(dòng)到別的模塊就會(huì)回到原來(lái)位置,而且當(dāng)你拖動(dòng)的 元素位置沒(méi)有超過(guò)某個(gè)距離也會(huì)自動(dòng)彈回到原來(lái)位置
案例分析:
關(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(){
//用來(lái)記錄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)前元素獲取過(guò)來(lái)
var ele = $(this);
//如果當(dāng)前模塊沒(méi)有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 說(shuō)明 要把任務(wù)放在該模塊的第一個(gè)位置
if (k == -1) {
next.children().eq(0).before(father);
} else {
next.children().eq(k).after(father);
}
}
//解綁移動(dòng)事件,清空原來(lái)位置的item
$(this).off("mousemove");
$(this).remove();
$(this).empty();
} else {
//這里就是移動(dòng)不成功,回到原來(lái)位置
$(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)效果了,如下圖所示:

還不快快卷起來(lái)~

到此這篇關(guān)于JS實(shí)現(xiàn)元素的拖動(dòng)與占位功能的文章就介紹到這了,更多相關(guān)js元素拖動(dòng)占位內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
微信小程序swiper使用網(wǎng)絡(luò)圖片不顯示問(wèn)題解決
這篇文章主要介紹了微信小程序swiper使用網(wǎng)絡(luò)圖片不顯示問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
JS實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)與刷新的方法匯總
這篇文章主要給大家介紹了關(guān)于JS實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)與刷新的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用JS具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
javascript實(shí)現(xiàn)打磚塊小游戲(附完整源碼)
這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)打磚塊小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09
JavaScript對(duì)象拷貝與賦值操作實(shí)例分析
這篇文章主要介紹了JavaScript對(duì)象拷貝與賦值操作,結(jié)合實(shí)例形式分析了javascript對(duì)象定義、拷貝、賦值等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-12-12
JavaScript調(diào)用堆棧及setTimeout使用方法深入剖析
Javascript中會(huì)經(jīng)常用到setTimeout來(lái)推遲一個(gè)函數(shù)的執(zhí)行并且會(huì)在執(zhí)行到這句話后延遲1秒鐘來(lái)彈出alert窗口,接下來(lái)將介紹一下JavaScript調(diào)用堆棧和setTimeout用法,感興趣的你可不要錯(cuò)過(guò)了哈2013-02-02
JavaScript如何處理移動(dòng)端拍攝圖片旋轉(zhuǎn)問(wèn)題
這篇文章主要告訴大家JavaScript如何處理移動(dòng)端拍攝圖片旋轉(zhuǎn)問(wèn)題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11

