html元素拖动互换位置原理,jQuery 实现DOM元素拖拽交换位置

实现步骤

html + bootstrap布局画3个面板。

注:面板样式 position 属性必须是绝对位置或者相对位置。

监听面板的的 mousedown事件。

记录当前对应面板的位置target_index,设置面板透明拖动。

监听当前被拖动的面板的mousemove事件。

根据鼠标移动的位置和面板的相对位置计算出面板应该出现的新位置,就将面板位置设置为新位置。

监听当前被拖动的面板的mouseup事件。

当松开鼠标时,查看当前鼠标所在位置对应的面板的位置exchange_index。对比两个位置,若不一样,说明需要交换这两个位置对应的面板内容,否则直接使被拖动面板回原位即可。

源码

html 代码:

jQuery 拖拽交换元素的位置

Panel title

Panel content

Panel title

Panel content

Panel title

Panel content

css 代码:

#panelsBox>div>.panel{

position: relative;

}

js 代码:

/**

* 拖拽面板 到某个面板的位置,交换两个面板位置

* 若没有到任意一个面板位置,则被拖拽面板回原位置

*/

$(function(){

//1.监听 mousedown 事件

$("#panelsBox").on('mousedown','.panel',function(e){

var target_index = $(this).parent().attr("data-index");//被拖动面板元素位置

var targetX = e.pageX - parseInt($(this).css("left"));

var targetY = e.pageY - parseInt($(this).css("top"));

$(this).fadeTo(20, 0.5);//点击后开始拖动并透明

$(this).css("z-index",100);//设置优先展示

//2.监听当前被拖拽的面板的移动事件:鼠标移动到何处,相应面板的css控制显示到何处

$(this).mousemove(function(e){

var x = e.pageX - targetX;//移动时根据鼠标位置计算面板元素左上角的相对位置

var y = e.pageY - targetY;

$(this).css({top:y,left:x});//设置面板元素新位置

}).mouseup(function(e){

//3.监听鼠标松开事件:交换面板元素,并将父级data-index换为原来的值

$(this).fadeTo("fast", 1);//停止移动并恢复成不透明

$(this).css("z-index",0);//展示优先级降低

//鼠标松开对应的面板元素的父div对应data-index

var exchangeElem = $(document.elementFromPoint(e.pageX,e.pageY)).parents(".panel");

if(exchangeElem.length > 0){

var exchange_index = $(exchangeElem[0]).parent("div").attr("data-index");

var device_id_target = $(exchangeElem[0]).parent("div").attr("data-device-id");

device_id_target = device_id_target == undefined?"":device_id_target;

if(target_index != exchange_index){

//交换面板元素

$("#panelsBox").children("div[data-index=" + target_index + "]").empty().append(exchangeElem[0]);

$("#panelsBox").children("div[data-index=" + exchange_index + "]").empty().append(this);

$("#panelsBox").children("div[data-index=" + exchange_index + "]").children(".panel").css({'top':"0px",'left':"0px",'z-index':0});

//交换data-index

$("#deviceList").children("div[data-index=" + target_index + "]")

attr("data-index",exchange_index);

$(document.elementFromPoint(e.pageX,e.pageY)).parents(".panel").parent()

.attr("data-index",target_index);

}else{

//返回原位置

$(this).css({'top':"0px",'left':"0px",'z-index':0});

}

}else{

//返回原位置

$(this).css({'top':"0px",'left':"0px",'z-index':0});

}

});

});

});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值