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

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

完整代码:演示

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. jQuery菜单示例(全选,反选,取消)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. java调取数据库

    import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.S ...

  3. C#输出杨辉三角形

    话不多说直接上代码: class Program { static void Main(string[] args) { ;//杨辉三角形的长度 Console.Write("输入杨辉三角长 ...

  4. ajax请求成功前loading

    1.jquery方式 <!DOCTYPE html><html lang="en"><head> <meta charset=" ...

  5. JSON、数组、时间戳

    // on removeClass addClass slice $('.pic-subgroup').on('click',function(){ $('.pic_div.active').remo ...

  6. new和newInstance区别

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp55     在初始化一个类,生成一个实例的时候:newInstance() ...

  7. Spring集成RabbitMQ-连接和消息模板

    ConnectionFactory ConnectionFactory是RabbitMQ服务掌握连接Connection生杀大权的重要组件 有了它,就可以创建Connection(org.spring ...

  8. 英语学习案例分析APP 201421123108 王坤彬

    第一部分.调研,测评 1.第一次使用经验. 我使用的时候苹果手机下载的必应软件.第一次使用感觉还好,但是知名度比较低,比不上喜马拉雅听书软件,这里我就做两者的对比.首先界面以及种类明显逼格更差点.必应 ...

  9. Beta版本冲刺前准备

    Beta版本冲刺 经过紧张的Alpha阶段,很多组已经从完全不熟悉语言和环境,到现在能够实现初步的功能.下一阶段即将加快编码进度,完成系统功能.强化软件工程的体会. 1.凡事预则立,在Beta开始前, ...

  10. 201521123001《Java程序设计》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...