使用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. mysql default unix_timestamp_mysql中的unix_timestamp函数
  2. 微软发布预览版SQL Server跨平台开发工具
  3. asp.net C# 将数据导出到Execl汇总
  4. Struts 2的基石——拦截器(Interceptor)
  5. MySQL中的条件赋值
  6. harmonyOS智慧屏,在鸿蒙HarmonyOS智慧屏上实现一款粗糙的计算器
  7. CentOS基础操作指令(磁盘分区和挂载)
  8. ​微信Android版支持改微信号,淘宝硬核拒绝改名要求;5G 套餐价格松动;Kotlin 1.4 第二个预览版发布|极客头条...
  9. android 安全的未来(II)
  10. linux新手入门学习 - linux目录结构
  11. 树算法系列之四:XGBoost
  12. webpack5+vue3搭建h5项目模板-(二)-eslint代码规范化
  13. markdown 转 pdf
  14. 3D打印路径填充算法 -- Connected Fermat Spirals for Layered Fabrication
  15. C# 透明窗体制作方法
  16. wxwidgets自定义事件+调试
  17. java 暴露接口_Java基于spring暴露接口供外部调用
  18. csv是什么意思中文_CSV文件是什么意思?
  19. 两台codesys设备之间通过modbus TCP通讯案例
  20. 光遇服务器维护要多久,光遇:你玩游戏多久了?半年以上的老玩家,是如何坚持下去的?...

热门文章

  1. nbu备份恢复catalog
  2. BIOS 常用网站 (持续更新中)
  3. Python攻防-暴力破解ZIP加密文件的密码
  4. 阿里巴巴《Java开发手册》2019最新版下载!
  5. 【知识图谱】知识图谱构建技术一览
  6. win2012 安装华为U2000 U2000V200R018C60SPC200 解决”使用isql命令连接SQL Server服务失败
  7. Cewl命令学习Hydra学习---Hydra windows破解实战各个协议演示
  8. CSS常用字体名列表
  9. Python3 基础语法介绍
  10. arcgis操作不响应