自己常试写了一个可拖拽进行自定义排序的列表,可能写的不太好,欢迎提供意见。

我的思路是将列表中的所有项都放进一个包裹层,将该包裹层设为相对定位,每当点击一个项时,将该项脱离文档并克隆一份重新添加到文档末尾并通过设置绝对定位让它出现在同样的位置,而原本在它后面的项则会因为它脱离文档而自动填充空位,当鼠标松开时通过鼠标的位置计算出当前位置处于列表的第几项,让后再将克隆项插入到该项之前。

完整代码:演示

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写的一个可拖拽排序的列表的更多相关文章

  1. 原生js通过prottype写的一个简单拖拽

    <!DOCTYPE html> <head> <meta charset="utf-8"/> <title></title&g ...

  2. jQuery可拖拽排序列表jquery-sortable-lists

    jquery-sortable-lists可以通过鼠标进行拖动排列树型菜单,可以定义某个列表元素是否拖动,拖动后回调,点击可以折叠树型结点,可以用来在后台模仿wordpress后台拖动菜单,实现多级菜 ...

  3. (Demo分享)利用JavaScript(JS)实现一个九宫格拖拽功能

    利用JavaScript(JS)实现一个九宫格拖拽功能   Demo实现了对任意方格进行拖拽,可以交换位置,其中Demo-1利用了勾股定理判断距离! Demo-1整体思路: 1.首先div实现自由移动 ...

  4. zTree的拖拽排序

    ztree本身是可以支持拖拽的,但是却没有找到明确的支持拖拽的排序,也就是说,在拖拽过程中,需要自定义维护拖拽后的顺序并保存至后台. 在这样一个比较常规的需求情况下,网上也有朋友给出了一些解决方案,比 ...

  5. html5 Sortable.js 拖拽排序源码分析

    最近公司项目经常用到一个拖拽 Sortable.js插件,所以有空的时候看了 Sortable.js 源码,总共1300多行这样,写的挺完美的.   本帖属于原创,转载请出名出处. 官网http:// ...

  6. React造轮子:拖拽排序组件「Dragact」

    先来一张图看看: 项目地址:Github地址 (无耻求星!) 在线观看(第一次加载需要等几秒):预览地址 说起来不容易,人在国外没有过年一说,但是毕竟也是中国年,虽然不放假,但是家里总会主内一顿丰盛的 ...

  7. dropzonejs中文翻译手册 DropzoneJS是一个提供文件拖拽上传并且提供图片预览的开源类库.

    http://wxb.github.io/dropzonejs.com.zh-CN/dropzonezh-CN/ 由于项目需要,完成一个web的图片拖拽上传,也就顺便学习和了解了一下前端的比较新的技术 ...

  8. dragsort html拖拽排序

    一.Jquery List DragSort 对于有些页面,如首页的定制,需要进行动态的拖拽排序.由于自己实现比较困难,我们一般会使用一些js插件来实现.dragsort 就是帮助我们完成这一需求.通 ...

  9. RecyclerView拖拽排序和滑动删除实现

    效果图 如何实现 那么是如何实现的呢?主要就要使用到ItemTouchHelper ,ItemTouchHelper 一个帮助开发人员处理拖拽和滑动删除的实现类,它能够让你非常容易实现侧滑删除.拖拽的 ...

随机推荐

  1. java多线程sleep和wait方法的区别

    分别创建了三个类,一个测试类,两个线程类实现Runnable接口. 当有notify()唤醒线程时,执行的结果如下: 当把TestSleepaWait.class.notify();语句注释后,即没有 ...

  2. SpringMVC知识点小结

    SpringMVC: 1.SpringMVC和Spring的关系: 软件开发的三层架构: web层[表示层.表现层]---->Service层---->Dao[DataBase Acces ...

  3. 在Windows上使用Ubuntu共享的打印机

    Ubuntu下使用cups共享打印机, 是一种简单易用的方法.CUPS(Common UNIX Printing System,通用Unix打印系统)是Fedora Core3中支持的打印系统,它主要 ...

  4. spring boot / cloud (十六) 分布式ID生成服务

    spring boot / cloud (十六) 分布式ID生成服务 在几乎所有的分布式系统或者采用了分库/分表设计的系统中,几乎都会需要生成数据的唯一标识ID的需求, 常规做法,是使用数据库中的自动 ...

  5. CPU和GPU的差别

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt317 首先需要解释CPU和GPU这两个缩写分别代表什么.CPU即中央处理器, ...

  6. Centos6.6下安装Python3.5

    centos6.6自带的Python2.6,如果想要安装新版本的Python例如Python2.7+或者Python3.5,不能够用yum安装,那么只能从源码编译安装. Step 1: 安装依赖库和编 ...

  7. ln命令详解

    ln命令 (全称:link) ln命令用来为文件创建一个连接,类似于Windows的快捷方式,连接类型分为硬连接和软连接(符号连接)两种,默认的连接类型是硬连接.如果要创建符号连接必须使用" ...

  8. Entity Framework Core 2.0 数据库迁移

    看见过几篇其他大神写的关于EFCore2.0的文章.本人有点小白,一开始看文档的时候除了一些基本操作外其他部分几乎没有读懂,我估计会有一部分人跟我一样,因为人家读懂了的早就懂了. 在这里我写一下我自己 ...

  9. Calico 的网络结构是什么?- 每天5分钟玩转 Docker 容器技术(68)

    上一节我们部署了 Calico 网络,今天将运行容器并分析 Calico 的网络结构. 在 host1 中运行容器 bbox1 并连接到 cal_net1: docker container run ...

  10. JavaScript中你所不知道的Object(一)

    Object实在是JavaScript中很基础的东西了,在工作中,它只有那么贫瘠的几个用法,让人感觉不过尔尔,但是我们真的了解它吗? 1. 当我们习惯用 var a = { name: 'tarol' ...