jQuery实现容器间的元素拖拽功能


Posted in jQuery onDecember 01, 2020

本文实例为大家分享了jQuery实现容器间的元素拖拽,供大家参考,具体内容如下

在html中准备三个容器

<div class="container">
 <ul>
 <li>A</li>
 <li>B</li>
 <li>C</li>
 <li>e</li>
 <li>f</li>
 <li>g</li>
 </ul>
 <ul></ul>
 <ul></ul>
</div>

在css中,给容器写上样式相应的样式

.container ul{
 width: 350px;
 padding: 15px;
 min-height:300px;
 background-color:#FFFFF0;
 margin:20px;
 display: inline-block;
 border-radius: 5px;
 border: 1px solid #C6C8CA;
 }
 .container ul li{
 display: block;
 float: left;
 width: 350px;
 height: 35px;
 line-height: 35px;
 border-radius: 4px;
 margin: 0;
 padding: 0;
 list-style: none;
 background-color:yellow;
 margin-bottom:10px;
 -moz-user-select: none;
 user-select: none;
 text-indent: 10px;
 color: #555;
}

js代码

首先引用jquery的js文件

<script src="js/jquery.js" type="text/javascript" charset="utf-8"></script>

在script的标签中,开始写js代码。

<script type="text/javascript">
 $(function() {
 // 初始化容器
 drag.init('container');
 });

 //拖拽
 var drag = {
 class_name: null, //允许放置的容器
 permitDrag: false, //是否允许移动标识
 _x: 0, //节点x坐标
 _y: 0, //节点y坐标
 _left: 0, //光标与节点坐标的距离
 _top: 0, //光标与节点坐标的距离
 old_elm: null, //拖拽原节点
 tmp_elm: null, //跟随光标移动的临时节点
 new_elm: null, //拖拽完成后添加的新节点
 //初始化
 init: function(className) {
  //允许拖拽节点的父容器的classname(可按照需要,修改为id或其他)
  drag.class_name = className;
  //监听鼠标按下事件,动态绑定要拖拽的节点(因为节点可能是动态添加的)
  $('.' + drag.class_name).on('mousedown', 'ul li', function(event) {
  //当在允许拖拽的节点上监听到点击事件,将标识设置为可以拖拽
  drag.permitDrag = true;
  //获取到拖拽的原节点对象
  drag.old_elm = $(this);
  //执行开始拖拽的操作
  drag.mousedown(event);
  return false;
  });

  //监听鼠标移动
  $(document).mousemove(function(event) {
  //判断拖拽标识是否为允许,否则不进行操作
  if (!drag.permitDrag) return false;
  //执行移动的操作
  drag.mousemove(event);
  return false;
  });

  //监听鼠标放开
  $(document).mouseup(function(event) {
  //判断拖拽标识是否为允许,否则不进行操作
  if (!drag.permitDrag) return false;
  //拖拽结束后恢复标识到初始状态
  drag.permitDrag = false;
  //执行拖拽结束后的操作
  drag.mouseup(event);
  return false;
  });
 },

 //按下鼠标 执行的操作
 mousedown: function(event) {

  //1.克隆临时节点,跟随鼠标进行移动
  drag.tmp_elm = $(drag.old_elm).clone();

  //2.计算 节点 和 光标 的坐标
  drag._x = $(drag.old_elm).offset().left;
  drag._y = $(drag.old_elm).offset().top;

  var e = event || window.event;
  drag._left = e.pageX - drag._x;
  drag._top = e.pageY - drag._y;

  //3.修改克隆节点的坐标,实现跟随鼠标进行移动的效果
  $(drag.tmp_elm).css({
  'position': 'absolute',
  'background-color': '#FF8C69',
  'left': drag._x,
  'top': drag._y,
  });

  //4.添加临时节点
  tmp = $(drag.old_elm).parent().append(drag.tmp_elm);
  drag.tmp_elm = $(tmp).find(drag.tmp_elm);
  $(drag.tmp_elm).css('cursor', 'move');

 },

 //移动鼠标 执行的操作
 mousemove: function(event) {

  //2.计算坐标
  var e = event || window.event;
  var x = e.pageX - drag._left;
  var y = e.pageY - drag._top;
  var maxL = $(document).width() - $(drag.old_elm).outerWidth();
  var maxT = $(document).height() - $(drag.old_elm).outerHeight();
  //不允许超出浏览器范围
  x = x < 0 ? 0 : x;
  x = x > maxL ? maxL : x;
  y = y < 0 ? 0 : y;
  y = y > maxT ? maxT : y;

  //3.修改克隆节点的坐标
  $(drag.tmp_elm).css({
  'left': x,
  'top': y,
  });

  //判断当前容器是否允许放置节点
  $.each($('.' + drag.class_name + ' ul'), function(index, value) {

  //获取容器的坐标范围 (区域)
  var box_x = $(value).offset().left; //容器左上角x坐标
  var box_y = $(value).offset().top; //容器左上角y坐标
  var box_width = $(value).outerWidth(); //容器宽
  var box_height = $(value).outerHeight(); //容器高

  //给可以放置的容器加背景色
  if (e.pageX > box_x && e.pageX < box_x + box_width && e.pageY > box_y && e.pageY < box_y + box_height) {
  //判断是否不在原来的容器下(使用坐标进行判断:x、y任意一个坐标不等于原坐标,则表示不是原来的容器)
  if ($(value).offset().left !== drag.old_elm.parent().offset().left ||
  $(value).offset().top !== drag.old_elm.parent().offset().top) {

  $(value).css('background-color', '#FFEFD5');
  }
  } else {
  //恢复容器原背景色
  $(value).css('background-color', '#FFFFF0');
  }
  });
 },
 //放开鼠标 执行的操作
 mouseup: function(event) {
  //移除临时节点
  $(drag.tmp_elm).remove();
  //判断所在区域是否允许放置节点
  var e = event || window.event;
  $.each($('.' + drag.class_name + ' ul'), function(index, value) {
  //获取容器的坐标范围 (区域)
  var box_x = $(value).offset().left; //容器左上角x坐标
  var box_y = $(value).offset().top; //容器左上角y坐标
  var box_width = $(value).outerWidth(); //容器宽
  var box_height = $(value).outerHeight(); //容器高
  //判断放开鼠标位置是否想允许放置的容器范围内
  if (e.pageX > box_x && e.pageX < box_x - 0 + box_width && e.pageY > box_y && e.pageY < box_y - 0 + box_height) {
  //判断是否不在原来的容器下(使用坐标进行判断:x、y任意一个坐标不等于原坐标,则表示不是原来的容器)
  if ($(value).offset().left !== drag.old_elm.parent().offset().left ||
  $(value).offset().top !== drag.old_elm.parent().offset().top) {
  //向目标容器添加节点并删除原节点
  tmp = $(drag.old_elm).clone();
  var newObj = $(value).append(tmp);
  $(drag.old_elm).remove();
  //获取新添加节点的对象
  drag.new_elm = $(newObj).find(tmp);
  }
  }
  //恢复容器原背景色
  $(value).css('background-color', '#FFFFF0');
  });

 },

 };
</script>

最后实现的效果如下:

jQuery实现容器间的元素拖拽功能

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

jQuery 相关文章推荐
jQuery ajax请求struts action实现异步刷新
Apr 19 jQuery
jquery实现限制textarea输入字数的方法
Sep 06 jQuery
jQuery实现的简单动态添加、删除表格功能示例
Sep 21 jQuery
jQuery中extend函数简单用法示例
Oct 11 jQuery
jQuery扩展方法实现Form表单与Json互相转换的实例代码
Sep 05 jQuery
jQuery实现当拉动滚动条到底部加载数据的方法分析
Jan 24 jQuery
详解webpack引用jquery(第三方模块)的三种办法
Aug 21 jQuery
jquery将json转为数据字典的实例代码
Oct 11 jQuery
jQuery Raty星级评分插件使用方法实例分析
Nov 25 jQuery
jQuery实现简易QQ聊天框
Feb 10 jQuery
jQuery实现颜色打字机的完整代码
Mar 19 jQuery
jQuery实现简单QQ聊天框
Aug 27 jQuery
jQuery实现查看图片功能
Dec 01 #jQuery
基于jQuery拖拽事件的封装
Nov 29 #jQuery
jQuery实现动态操作table行
Nov 23 #jQuery
jQuery-App输入框实现实时搜索
Nov 19 #jQuery
JQuery+drag.js上传图片并且实现图片拖曳
Nov 18 #jQuery
JavaScript枚举选择jquery插件代码实例
Nov 17 #jQuery
如何在vue 中引入使用jquery
Nov 10 #jQuery
You might like
php发送与接收流文件的方法
2015/02/11 PHP
php将一维数组转换为每3个连续值组成的二维数组
2016/05/06 PHP
javascript 基础篇2 数据类型,语句,函数
2012/03/14 Javascript
jquery getScript动态加载JS方法改进详解
2012/11/15 Javascript
JS OffsetParent属性深入解析
2014/01/13 Javascript
jquery查找父元素、子元素(个人经验总结)
2014/04/09 Javascript
js实现从右向左缓缓浮出网页浮动层广告的方法
2015/05/09 Javascript
JavaScript的9种继承实现方式归纳
2015/05/18 Javascript
FullCalendar日历插件应用之数据展现(一)
2015/12/23 Javascript
js防阻塞加载的实现方法
2016/09/09 Javascript
Javascript函数中的arguments.callee用法实例分析
2016/09/16 Javascript
Bootstrap表格使用方法详解
2017/02/17 Javascript
jQuery插件FusionCharts实现的2D饼状图效果【附demo源码下载】
2017/03/03 Javascript
JavaScript实现移动端页面按手机屏幕分辨率自动缩放的最强代码
2017/08/18 Javascript
老生常谈JavaScript面向对象基础与this指向问题
2017/10/16 Javascript
jQuery实现ajax回调函数带入参数的方法示例
2018/06/26 jQuery
[01:36]DOTA2完美大师赛趣味视频之与队友相处的十万个技巧
2017/11/19 DOTA
[03:01]完美世界DOTA2联赛PWL S2 集锦第二期
2020/12/03 DOTA
Python的Bottle框架中获取制定cookie的教程
2015/04/24 Python
详解Python当中的字符串和编码
2015/04/25 Python
Python中datetime常用时间处理方法
2015/06/15 Python
Python3标准库总结
2019/02/19 Python
Tensorflow 多线程设置方式
2020/02/06 Python
TensorFlow实现模型断点训练,checkpoint模型载入方式
2020/05/26 Python
Python getsizeof()和getsize()区分详解
2020/11/20 Python
应届大专毕业生个人自荐信
2013/09/22 职场文书
小学教师学期末自我评价
2013/09/25 职场文书
交通事故协议书
2014/04/15 职场文书
运动会演讲稿200字
2014/08/25 职场文书
人事专员岗位职责
2015/02/03 职场文书
幼儿园综治宣传月活动总结
2015/05/07 职场文书
焦点访谈观后感
2015/06/11 职场文书
经典祝酒词大全
2015/08/12 职场文书
超市啤酒狂欢夜策划方案范文!
2019/07/03 职场文书
MySQL索引知识的一些小妙招总结
2021/05/10 MySQL
JS前端使用canvas实现物体的点选示例
2022/08/05 Javascript