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 一个帮助开发人员处理拖拽和滑动删除的实现类,它能够让你非常容易实现侧滑删除.拖拽的 ...
随机推荐
- Markdown最佳实践
Markdown 最佳实践 结合目前看到的信息,总结使用Markdown的最方便的方式. 我的需求是: 能够配合各种笔记软件使用,目前主要使用的是为知笔记和有道笔记.笔记的内容需要记录代码及数学公式, ...
- 拨开字符编码的迷雾--MySQL数据库字符编码
拨开字符编码迷雾系列文章链接: 拨开字符编码的迷雾--字符编码概述 拨开字符编码的迷雾--编译器如何处理文件编码 拨开字符编码的迷雾--字符编码转换 拨开字符编码的迷雾--MySQL数据库字符编码 1 ...
- idea 远程调试
Idea 远程在线测试 描述:在window下开发,部署到Linux服务器上,往往会遇到在windows下正常运行,在Linux服务器下异常,这是需要本地调试远程代码: 操作步骤: 一.代码已知 保证 ...
- Cognos报表调度与作业管理
本文针对Cognos的报表调度和作业管理做案例分析.为了测试报表定时调度功能,本文将报表定时输出到指定的归档目录. 1. 测试环境 Cognos V11.0 2. 设置档案文件根目录 Cognos报 ...
- javascript创建数组的所有方式【Array老师】
1.采用直接量创建 var arr = [];//创建一个空数组 var arr2 = [1,2,3];//创建一个有三个元素的数组 2.采用构造函数创建 a.var arr1 = new Array ...
- 两台主机之间单向Ping不通的问题
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px ".PingFang SC"; color: #454545 } p.p2 ...
- Porita详解----Items
Items(项目) 一个item是指从目标网站上爬取的一条单独的数据.例如从京东网站上爬取的一款小米6手机的信息.大家应该对 item (项目)和 item definition(项目定义)做一个区分 ...
- Windows下Docker承载ASP.NET Core 应用
基本配置: Win7 64系统,Docker Toolbox, 主要步骤: [1]发布ASP.NET Core MVC应用,CD到项目根目录,执行dontnet publish [2]新建一个Dock ...
- h5video标签
在video标签中,我们可以使用属性:videoWidth & videoHeight,它获取的是video的宽度和高度(媒体本身).虽然不能直接使用,但是可以通过计算宽高比得到 video ...
- Java Spring的简单见解
Spring的注解特性,IOC控制反转 首先了解依赖注入是什么,就是在实例化对象的时候并不需要每次都new对象出来,spring管理对象,在你配置been或者@service时候 Spring会自动帮 ...