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 EasyUI $.Parser
Jun 02 jQuery
jQuery.form.js的使用详解
Jun 14 jQuery
jQuery选取所有复选框被选中的值并用Ajax异步提交数据的实例
Aug 04 jQuery
jquery动态赋值id与动态取id方法示例
Aug 21 jQuery
jQuery选择器中的特殊符号处理方法
Sep 08 jQuery
20个最常见的jQuery面试问题及答案
May 23 jQuery
jQuery基于Ajax实现读取XML数据功能示例
May 31 jQuery
用jQuery将JavaScript对象转换为querystring查询字符串的方法
Nov 12 jQuery
javascript/jquery实现点击触发事件的方法分析
Nov 11 jQuery
jQuery实现的图片点击放大缩小功能案例
Jan 02 jQuery
jQuery+ThinkPHP实现图片上传
Jul 23 jQuery
jQuery zTree如何改变指定节点文本样式
Oct 16 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 echo()和print()、require()和include()函数区别说明
2010/03/27 PHP
php中__destruct与register_shutdown_function执行的先后顺序问题
2014/10/17 PHP
php获取数组元素中头一个数组元素值的实现方法
2014/12/20 PHP
PHP编程实现多维数组按照某个键值排序的方法小结【2种方法】
2017/04/27 PHP
PHP7实现和CryptoJS的AES加密方式互通示例【AES-128-ECB加密】
2019/06/08 PHP
用javascript实现在小方框中浏览大图的代码
2007/08/14 Javascript
JavaScript DOM 学习第五章 表单简介
2010/02/19 Javascript
js获取ajax返回值代码
2014/04/30 Javascript
javascript跨域的方法汇总
2015/10/23 Javascript
详解页面滚动值scrollTop在FireFox与Chrome浏览器间的兼容问题
2015/12/03 Javascript
jQuery图片轮播实现并封装(一)
2016/12/03 Javascript
NodeJs安装npm包一直失败的解决方法
2017/04/28 NodeJs
js定时器+简单的动画效果实例
2017/11/10 Javascript
bootstrap里bootstrap动态加载下拉框的实例讲解
2018/08/10 Javascript
基于纯JS实现多张图片的懒加载Lazy过程解析
2019/10/14 Javascript
解决elementUI 切换tab后 el_table 固定列下方多了一条线问题
2020/07/19 Javascript
用python 制作图片转pdf工具
2015/01/30 Python
Python编写一个闹钟功能
2017/07/11 Python
Python数据结构之栈、队列的实现代码分享
2017/12/04 Python
python的pip安装以及使用教程
2018/09/18 Python
Python求两点之间的直线距离(2种实现方法)
2019/07/07 Python
使用python将excel数据导入数据库过程详解
2019/08/27 Python
Python在OpenCV里实现极坐标变换功能
2019/09/02 Python
详解python statistics模块及函数用法
2019/10/27 Python
Python实现名片管理系统
2020/02/14 Python
Pycharm常用快捷键总结及配置方法
2020/11/14 Python
一款基于css3和jquery实现的动画显示弹出层按钮教程
2015/01/04 HTML / CSS
生日寿宴答谢词
2014/01/19 职场文书
GMP办公室主任岗位职责
2014/03/14 职场文书
厉行勤俭节约倡议书
2014/05/16 职场文书
涨价通知
2015/04/23 职场文书
具结保证书范本
2015/05/11 职场文书
2015年妇女工作总结
2015/05/14 职场文书
Python爬虫之自动爬取某车之家各车销售数据
2021/06/02 Python
解决SpringBoot文件上传临时目录找不到的问题
2021/07/01 Java/Android
MySQL学习之基础操作总结
2022/03/19 MySQL