jQuery 实现DOM元素拖拽交换位置的实例代码


Posted in jQuery onJuly 14, 2020

实现步骤

1.html + bootstrap 布局画3个面板。

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

2.监听面板的的 mousedown事件。

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

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

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

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

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

源码

html 代码:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>jQuery 拖拽交换元素的位置</title>
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<!-- 引入 Bootstrap -->
	<!-- 新 Bootstrap 核心 CSS 文件 -->
	<link href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="external nofollow" rel="stylesheet">
	<link rel="stylesheet" type="text/css" href="../css/exchange-position.css" rel="external nofollow" />
	<!-- Jquery 3.5 -->
	<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
	<script src="../js/exchange-position.js" type="text/javascript" charset="utf-8"></script>
	<!-- HTML5 Shiv 和 Respond.js 用于让 IE8 支持 HTML5元素和媒体查询 -->
	<!-- 注意: 如果通过 file:// 引入 Respond.js 文件,则该文件无法起效果 -->
	<!--[if lt IE 9]>
		<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
		<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
	<![endif]-->
	
</head>
<body>
	<div class="container" style="padding-top: 20px;">
		<div class="row" id="panelsBox">
			<div class="col-md-4 column" data-index="1">
				<div class="panel panel-success">
					<div class="panel-heading">
						<h3 class="panel-title">
							Panel title
						</h3>
					</div>
					<div class="panel-body">
						Panel content
					</div>
					<div class="panel-footer">
						Panel footer
					</div>
				</div>
			</div>
			<div class="col-md-4 column" data-index="2">
				<div class="panel panel-info">
					<div class="panel-heading">
						<h3 class="panel-title">
							Panel title
						</h3>
					</div>
					<div class="panel-body">
						Panel content
					</div>
					<div class="panel-footer">
						Panel footer
					</div>
				</div>
			</div>
			<div class="col-md-4 column" data-index="3">
				<div class="panel panel-danger">
					<div class="panel-heading">
						<h3 class="panel-title">
							Panel title
						</h3>
					</div>
					<div class="panel-body">
						Panel content
					</div>
					<div class="panel-footer">
						Panel footer
					</div>
				</div>
			</div>
		</div>
		
	</div>
</body>
</html>

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});
			}
		});
	});
});

总结

到此这篇关于jQuery 实现DOM元素拖拽交换位置的文章就介绍到这了,更多相关jquery 拖拽交换位置内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

jQuery 相关文章推荐
jQuery插件HighCharts绘制2D饼图效果示例【附demo源码下载】
Mar 21 jQuery
jQuery获取table下某一行某一列的值实现代码
Apr 07 jQuery
jQuery常用选择器详解
Jul 17 jQuery
jQuery条件分页 代替离线查询(附代码)
Aug 17 jQuery
jquery实现回车键触发事件(实例讲解)
Nov 21 jQuery
jquery 获取索引值在一定范围的列表方法
Jan 25 jQuery
jQuery实现每隔一段时间自动更换样式的方法分析
May 03 jQuery
webpack里使用jquery.mCustomScrollbar插件的方法
May 30 jQuery
jQuery实现轮播图及其原理详解
Apr 12 jQuery
jQuery实现动态添加和删除input框实例代码
Mar 26 jQuery
Jquery实现获取子元素的方法分析
Aug 24 jQuery
jquery实现垂直手风琴菜单
Mar 04 jQuery
jQuery开发仿QQ版音乐播放器
Jul 10 #jQuery
jQuery实现B2B网站后台管理系统侧导航
Jul 08 #jQuery
jQuery使用jsonp实现百度搜索的示例代码
Jul 08 #jQuery
jQuery 实现扁平式小清新导航
Jul 07 #jQuery
jQuery 动态粒子效果示例代码
Jul 07 #jQuery
jQuery实现简单飞机大战
Jul 05 #jQuery
jQuery实现简单日历效果
Jul 05 #jQuery
You might like
PHP的autoload机制的实现解析
2012/09/15 PHP
PHP漏洞全解(详细介绍)
2012/11/13 PHP
php获取指定数量随机字符串的方法
2017/02/06 PHP
非阻塞动态加载javascript广告实现代码
2010/11/17 Javascript
javascript showModalDialog 内跳转页面的问题
2010/11/25 Javascript
Array, Array Constructor, for in loop, typeof, instanceOf
2011/09/13 Javascript
Javascript中引用示例介绍
2014/02/21 Javascript
javascript操作excel生成报表示例
2014/05/08 Javascript
用原生JS获取CLASS对象(很简单实用)
2014/10/15 Javascript
js创建对象的方法汇总
2016/01/07 Javascript
分享12个实用的jQuery代码片段
2016/03/09 Javascript
BootStrap3学习笔记(一)之网格系统
2016/05/20 Javascript
Bootstrap 布局组件(全)
2016/07/18 Javascript
JavaScript实现邮箱地址自动匹配功能代码
2016/11/28 Javascript
vue+webpack实现异步加载三种用法示例详解
2018/04/24 Javascript
微信小程序自定义键盘 内部虚拟支付
2018/12/20 Javascript
jQuery事件委托代码实践详解
2019/06/21 jQuery
JavaScript浅层克隆与深度克隆示例详解
2020/09/01 Javascript
用smtplib和email封装python发送邮件模块类分享
2014/02/17 Python
Python获取脚本所在目录的正确方法
2014/04/15 Python
Python程序设计入门(5)类的使用简介
2014/06/16 Python
如何安装2019Pycharm最新版本(详细教程)
2019/09/26 Python
Python如何使用BeautifulSoup爬取网页信息
2019/11/26 Python
Python vtk读取并显示dicom文件示例
2020/01/13 Python
python多进程 主进程和子进程间共享和不共享全局变量实例
2020/04/25 Python
微软加拿大官方网站:Microsoft Canada
2019/04/28 全球购物
精伦电子Java笔试题
2013/01/16 面试题
网络工程师面试(三木通信技术有限公司)
2013/06/05 面试题
大三毕业自我鉴定
2014/01/15 职场文书
《彩色世界》教学反思
2014/04/12 职场文书
高等教育学专业自荐书
2014/06/17 职场文书
机电专业毕业生自我鉴定2014
2014/10/04 职场文书
2014年个人委托书范本
2014/10/13 职场文书
交警正风肃纪剖析材料
2014/10/29 职场文书
幼儿体育课教学反思
2016/02/16 职场文书
聊聊基于pytorch实现Resnet对本地数据集的训练问题
2022/03/25 Python