使用jq-ui实现选中多元素进行拖拽操作

开发中为了方便用户想引入拖拽操作,但发现jq只支持单个节点拖拽,google百度了半天只有几个实现了多选拖拽了例子,但感觉不是很好用,所以干脆利用晚上时间自己写了个demo实现此功能。

思路及代码

想要实现多选拖拽功能,首先想到的肯定还是jq-ui,毕竟这有现成的多选功能和 单个拖拽功能。但实现过程中发现 jq-ui的选中功能似乎和拖拽功能有冲突。所以决定舍弃了选中功能,只取它的拖拽功能,选中功能由自己实现。

选择元素功能比较简单,用一个class标识这个元素是否被选中,点击空白处取消所有选中,按ctrl可以多选不连续的元素都很简单。至于同时拖拽多个元素的原理采用的是元素之间的联动,被拖拽的可以是被选中的任意一个元素,拖拽此元素会联动其他选中元素改变位置,具体通过jq-ui拖拽方法内置的事件实现。
在start方法里计算出被拖拽元素和其他选中元素之间的偏差,存储在变量里,这里采用的不是top和left来计算,而是用offsetTop和offsetLeft,这是距离包裹元素的左上角距离。
在拖动过程的事件方法里实时改动其他元素的位置,具体位置为 拖动元素位置+相对偏移位置。 OK到这里大功告成。如果要再完美点,可以在取消选中的时候将存储的偏移量删除。
以下是这次的demo代码。demo由于只是尝试思路比较简陋,勿怪!

demo示例

<!DOCTYPE html>
<html>
<head>
<title>testPolicy.html</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link rel="stylesheet"href="//apps.bdimg.com/libs/jqueryui/1.10.4/css/jquery-ui.min.css">
<script src="//apps.bdimg.com/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="//apps.bdimg.com/libs/jqueryui/1.10.4/jquery-ui.min.js"></script>
<style type="text/css">
#collect {height: 500px;width: 500px;background-color: gray;margin-left: 30%;z-index: 99;
}.ui-selecting {background: #FECA40;
}.ui-selected {background: #F39814;color: white;
}.drag {height: 30px;width: 30px;border: 2px solid;margin: 2px 2px 2px 2px;display: inline-block;z-index: 101;
}.dragg {
margin-left: 30%;position: absolute;height: 500px;width: 500px;border: 1px solid;z-index: 100;
}
</style></head><body><div id="collect"><div id="1" name="a" class="drag">1</div><div id="2" name="a" class="drag">2</div><div id="3" name="a" class="drag">3</div><div id="4" name="a" class="drag">4</div><div id="5" name="a" class="drag">5</div><div id="6" name="a" class="drag">6</div><div id="7" name="a" class="drag">7</div><div id="8" name="a" class="drag">8</div><div id="9" name="a" class="drag">9</div><div id="0" name="a" class="drag">0</div></div></body><script type="text/javascript">// 存放各div相对于被拖拽者的偏差 var topList={};var leftList={};$(function() {//初始化可拖拽$(".drag").draggable({start:function(a,b){//拖拽开始初始化偏移量var t0=$(this).context.offsetTop;var h0=$(this).context.offsetLeft;var arr=$(".ui-selected").toArray();for ( var i = 0; i < arr.length; i++) {$a=$(arr[i]);if($a.context.id==$(this).context.id){continue;}var t1=$a.context.offsetTop;var h1=$a.context.offsetLeft;topList[$a.context.id]=t1-t0;leftList[$a.context.id]=h1-h0;}},drag : function(a,b,c) {//拖拽过程根据偏移量不同分别设置位置var t0=$(this).context.offsetTop;var h0=$(this).context.offsetLeft;var arr=$(".ui-selected").toArray();for ( var i = 0; i < arr.length; i++) {$a=$(arr[i]);if($a.context.id==$(this).context.id){continue;}var t=topList[$a.context.id];var h=leftList[$a.context.id];$a.offset({"top":t0+t,"left":h0+h});}}});//点击加样式 代表被选中$(".drag").bind("click",function(e){var ct=$(this).context;$(this).toggleClass("ui-selected");if(!keepCtrl){$(".ui-selected:not(#"+ct.id+")").removeClass("ui-selected");}})//点击外面清除选中元素 名称a是可拖拽元素的标识 .ui-selected 是选中的样式$(document).bind("click",function(e){var ct=$(e.target).attr("name");if(ct!="a"){$(".ui-selected").removeClass("ui-selected");}})//以下保持按Ctrl时候能多选var keepCtrl=false;$(document).bind("keydown",function(e){if(e.keyCode=17){keepCtrl=true;}});$(document).bind("keyup",function(e){if(e.keyCode=17){keepCtrl=false;}});});
</script>
</html>

使用jq-ui实现选中多元素进行拖拽操作相关推荐

  1. 拖拽删除元素、拖拽排序、拖拽预览图片和拖拽移动元素

    介绍 HTML5 提供了专门的拖拽与拖放的 API,目前各浏览器都已支持,包括 IE.HTML 拖放(Drag and Drop)接口使应用程序能够在浏览器中使用拖放功能.例如,用户可使用鼠标选择可拖 ...

  2. js实现页面元素的拖拽

    平时在我们页面上,经常会悬浮着一些功能按钮,如帮助,联系客服等,按钮的显示比较简单,用定位悬浮在自己需要的位置上就行,比如下面的页面上我们展示一个帮助的按钮,用户点击后可以展示一些帮助的信息: 代码: ...

  3. JavaScript实现网页元素的拖拽效果

    以下的页面中放了两个div,能够通过鼠标拖拽这两个元素到任何位置. 实现该效果的HTML页面代码例如以下所看到的: <!DOCTYPE html> <html> <hea ...

  4. 使用cloneNode函数复制节点元素--svg拖拽复制

    目录 需求 导致问题 寻求解决的过程 解决方案 function selectElement(event){// if(event.button==0){console.log("selec ...

  5. el-tree 拖拽互换位置_那些我们与UI交互的动作(三·拖拽)

    交互动作的直觉形成于『人与实物』的互动中. 在物理世界:接触物体一定有感觉. 在游戏里:与物体交互一定可以看到变化. 拖拽动作 拖拽对应的真实动作就是拖拽,就是『把物体从这里拿到那里』. 多么简单直接 ...

  6. 利用jQuery UI为CMS网站实现拖拽布局效果,秒杀table布局

    1 实现效果 对于使用过CMS系统制作网站的人应该都清楚,制作网站过程有一个重要的步骤就是制作页面布局.目前,实现页面布局有两种方式:table与div.这两种方式各有其优劣之处. Table: 优势 ...

  7. 使用WebGL去实现一个拖拽式UI代码生成App

    前言 ​ UI(User Interface),即用户界面,是软件和用户之间进行交互和信息交换的媒介,实现信息的内部形式与人类可接受形式间的转换.UI开发一般需要经过UI设计.UI实现两个过程.UI设 ...

  8. dom 元素拖拽实现

    文章目录 原生 JS 实现 div 拖拽 HTML 拖拽 API REF   之前找实习的时候,面试官出了道 "原生 JS 实现 div 元素拖拽",当时实现了个大概,不过很多细节 ...

  9. canvas 中的元素拖拽

    实验室要求实现在canvas的元素的拖拽,即在canvas放置一些图标,实现用户拖拽并连线. 需要的知识(1)canvas drawImage方法 function draw(){ var image ...

最新文章

  1. HDU-1459.非常可乐(BFS )
  2. 状态管理框架开发不完全指南
  3. 诗歌rails 之with_options
  4. Spring 2.0.1 与 BEA WebLogic Server 9.2 的集成
  5. unique函数_unique函数使用场景(一)
  6. python入门(七):CGI编程
  7. 08.15 javascript3 分支结构 条件语句 :单向分支 双向分支 嵌套分支 多项分支 循环结构 while dowhile for 跳转语句 其他语句...
  8. 后端根据百度地图真实路径距离_做地图功能的设计,有哪些容易被我们忽略的思考?...
  9. 程序员到CTO必须注意的几个关键点
  10. 第四章需求分析与设计工具
  11. 那四年,我们一起逝去的青春
  12. java怎样编程界面_java程序的界面编程详解
  13. udp端口转发 Linux,Linux下利用iptables快速实现UDP/TCP端口转发
  14. Python统计学11——分位数回归
  15. 重学 Java 设计模式:实战享元模式「基于Redis秒杀,提供活动与库存信息查询场景」
  16. 《科技创业启示录》一第1章 乔斯·怀特
  17. OSPF协议基本原理笔记
  18. 计算机视觉---opencv人脸识别
  19. 【vue】vue + ECharts 实现中国地图
  20. nordic 52832中添加RTT打印

热门文章

  1. 数据库-----(主键约束、唯一约束、默认约束、非空约束、外键约束)
  2. js向一个数组中添加元素
  3. 【BigDecimal.compareTo 遇到的坑】
  4. 记录:element UI table 表格 固定列单元格上下错位
  5. RFID无线射频识别技术基本介绍
  6. 基于LabVIEW和Access数据库的温湿度监测系统上位机程序设计
  7. Docker 快速学习手册及相关笔记 附带一些问题解决方案
  8. 软件行业排名前100名的企业大全
  9. 群联AI云防护的优势所在
  10. 群联金士顿惠普自封颗粒对应ID及相关数据表