Javascript写的一个可拖拽排序的列表
自己常试写了一个可拖拽进行自定义排序的列表,可能写的不太好,欢迎提供意见。
我的思路是将列表中的所有项都放进一个包裹层,将该包裹层设为相对定位,每当点击一个项时,将该项脱离文档并克隆一份重新添加到文档末尾并通过设置绝对定位让它出现在同样的位置,而原本在它后面的项则会因为它脱离文档而自动填充空位,当鼠标松开时通过鼠标的位置计算出当前位置处于列表的第几项,让后再将克隆项插入到该项之前。


完整代码:演示
css:
#main {
width: 500px;
margin:;
padding:;
background: blue;
position: relative;
}
div.list{
height: 50px;
text-align: center;
margin-top: 3px;
background: lightblue;
}
div.list:first-child{
margin-top:;
}
div.drag{
position: absolute;
width: 500px;
background: red;
text-align: center;
height: 50px;
opacity: 0.5;
}
样式部分最外层包层main需要将padding设为0并设为相对定位,如果需要有padding可以在main外面再包一层。
html:
<div id="main">
<div class="list">1</div>
<div class="list">2</div>
<div class="list">3</div>
<div class="list">4</div>
<div class="list">5</div>
</div>
js:
var div=g('#main'); //获取包裹层元素
var mTop=div.offsetTop; //包裹层距离顶端的位置
var flag=0; //用于控制是否可拖拽
var drag={ //保存克隆元素的一些信息
curr: null,
tTop: 0,
num: 0
};
div.addEventListener('mousedown',function(e){ //添加mousedown事件
flag=1; //当鼠标按下时,表示为可拖拽状态
var curr=e.target;
var top=(curr.offsetTop - mTop)+'px'; //当前元素相对于父元素的top值
var y=e.pageY-curr.offsetTop; //鼠标在当前项中的位置
drag.tTop=y; //记录y值
console.log(top)
var newDiv=div.removeChild(curr); //克隆当前项并移除
newDiv.setAttribute('class','drag'); //添加样式
newDiv.style.top=top; //将位置定在当前位置
newDiv.style.left=0;
div.appendChild(newDiv);
drag.curr=curr;
});
div.addEventListener('mousemove',function(e){ //利用鼠标移动事件模拟拖拽
if(!flag){ //如果flag=0则不可拖拽
return false;
}else{
var curr=g('.drag')[0]; //获取克隆对象
curr.style.top=(e.pageY-drag.tTop-mTop)+'px'; //通过鼠标位置改变克隆对象位置
var ratio = (e.pageY - drag.tTop-mTop)%53; //每个项的高度是固定的,所以可以通过当前高度除每个项的高度来确定要插入到那个项之前
if(ratio<=5){ //设置偏差
curr.borderTop='2px solid green'; //添加提示
drag.num=Math.floor((e.pageY - drag.tTop - mTop)/53);
console.log(drag.num)
}
}
});
div.addEventListener('mouseup',function(e){ //拖放结束
div.insertBefore(drag.curr,div.children[drag.num]); //插入
drag.curr.setAttribute('class','list'); //添加样式
drag.curr.style=null; //清除样式
flag=0;
})
function g(str){ //用于方便获取元素对象
if(/^#.+/.test(str)){
str=str.slice(1);
return document.getElementById(str);
}else if(/^\..+/.test(str)){
str=str.slice(1);
return document.getElementsByClassName(str);
}else {
return document.getElementsByTagName(str);
}
}
Javascript写的一个可拖拽排序的列表的更多相关文章
- 原生js通过prottype写的一个简单拖拽
<!DOCTYPE html> <head> <meta charset="utf-8"/> <title></title&g ...
- jQuery可拖拽排序列表jquery-sortable-lists
jquery-sortable-lists可以通过鼠标进行拖动排列树型菜单,可以定义某个列表元素是否拖动,拖动后回调,点击可以折叠树型结点,可以用来在后台模仿wordpress后台拖动菜单,实现多级菜 ...
- (Demo分享)利用JavaScript(JS)实现一个九宫格拖拽功能
利用JavaScript(JS)实现一个九宫格拖拽功能 Demo实现了对任意方格进行拖拽,可以交换位置,其中Demo-1利用了勾股定理判断距离! Demo-1整体思路: 1.首先div实现自由移动 ...
- zTree的拖拽排序
ztree本身是可以支持拖拽的,但是却没有找到明确的支持拖拽的排序,也就是说,在拖拽过程中,需要自定义维护拖拽后的顺序并保存至后台. 在这样一个比较常规的需求情况下,网上也有朋友给出了一些解决方案,比 ...
- html5 Sortable.js 拖拽排序源码分析
最近公司项目经常用到一个拖拽 Sortable.js插件,所以有空的时候看了 Sortable.js 源码,总共1300多行这样,写的挺完美的. 本帖属于原创,转载请出名出处. 官网http:// ...
- React造轮子:拖拽排序组件「Dragact」
先来一张图看看: 项目地址:Github地址 (无耻求星!) 在线观看(第一次加载需要等几秒):预览地址 说起来不容易,人在国外没有过年一说,但是毕竟也是中国年,虽然不放假,但是家里总会主内一顿丰盛的 ...
- dropzonejs中文翻译手册 DropzoneJS是一个提供文件拖拽上传并且提供图片预览的开源类库.
http://wxb.github.io/dropzonejs.com.zh-CN/dropzonezh-CN/ 由于项目需要,完成一个web的图片拖拽上传,也就顺便学习和了解了一下前端的比较新的技术 ...
- dragsort html拖拽排序
一.Jquery List DragSort 对于有些页面,如首页的定制,需要进行动态的拖拽排序.由于自己实现比较困难,我们一般会使用一些js插件来实现.dragsort 就是帮助我们完成这一需求.通 ...
- RecyclerView拖拽排序和滑动删除实现
效果图 如何实现 那么是如何实现的呢?主要就要使用到ItemTouchHelper ,ItemTouchHelper 一个帮助开发人员处理拖拽和滑动删除的实现类,它能够让你非常容易实现侧滑删除.拖拽的 ...
随机推荐
- Grails笔记四:Groovy特性小结
在学习Grails的时候与Groovy打交道不可避免,虽然不必太深刻,但多知道一些特性也是很有帮助的~ 1.相除后获取整数 使用intdiv()方法可以获得整数,注意点是这个方法只适用两个整数相除,浮 ...
- [js高手之路]深入浅出webpack教程系列6-插件使用之html-webpack-plugin配置(下)
上文我们对html-webpack-plugin的实例htmlWebpackPlugin进行了遍历分析,讲解了几个常用属性( inject, minify )以及自定义属性的添加,本文,我们继续深入他 ...
- 基于大数据的电影网站项目开发之CentOS的安装(一)
一.下载VMware并安装,至于安装教程从网上搜索进行参考 二.下载系统镜像文件,这里使用的是CentOS-6.5-x86_64-bin-DVD1.iso 三.安装镜像文件 运行VMware work ...
- C#大量数据导出到Excel(转)
工作过程中经常会用到将数据导出到Excel中,一般情况下需要导出的数据都是几百几千条或者上万条,这都没有什么问题,但有时候会遇到特殊的需求,客户要求把几十万条甚至上百万条的数据导出到Excel中,这就 ...
- 规则集Set与线性表List性能分析
前言 本章节将通过实验,测试规则集与线性表的性能.那么如何进行实验呢?针对不同的集合都进行指定数量元素的添加和删除操作,计算耗费时间进行分析. 那么,前两个章节呢,我们分别讲述了什么时候使用Set以及 ...
- WPF-TreeView获取文件夹目录、DataGrid获取目录下文件信息
开发一个WPF桌面应用程序.刚接触WPF编程以及C#语言,这里把一些关键的问题记录下来. 下面是实现将路径的文件夹信息绑定到TreeView及DataGrid上显示. 关键问题是C#数据绑定方式及IE ...
- 02-TypeScript中新的字符串
TypeScript中引入了字符串模板,通过字符串模板可以方便的实现字符串换行的连接.方便变量等. 1.在WebStorm中新建一个文件,后缀名为ts. 在建立ts文件时,WebStorm会问你是否需 ...
- 个人附加作业XD --这门课终于结束了~~
你认为每次项目的评分标准存在哪些问题,你认为的合理评分准则是怎样的(个人/结对/团队算三个) 评分的话我个人觉得是存在一些问题的. 第一,分数差异 问题:一个就是各班的成绩评分有高有低,有的班整体分数 ...
- 英语学习app案列分析
很多同学有误解,软件工程课是否就是理论课?或者是几个牛人拼命写代码,其他人打酱油的课?要不然就是学习一个程序语言,搞一个职业培训的课?都不对,软件工程有理论,有实践,更重要的是分析,思辨,总结.在课程 ...
- 201521123039 《java程序设计》第七周学习总结
1. 本周学习总结 2. 书面作业 ArrayList代码分析 1.1 解释ArrayList的contains源代码 答:ArrayList的Contains的源码如上图所示,如果o为null,那么 ...