简单的拖拽交换
实现列表拖拽排序,最简单的方法就是将想要拖拽的元素设置为dragable=“true”,然后利用drag事件处理元素位置变换。
拖拽的时候主要有以下几个事件
- ondragstart 事件:当拖拽元素开始被拖拽的时候触发的事件,此事件作用在被拖曳元素上
- ondragenter 事件:当拖曳元素进入目标元素的时候触发的事件,此事件作用在目标元素上
- ondragover 事件:拖拽元素在目标元素上移动的时候触发的事件,此事件作用在目标元素上
- ondrop 事件:被拖拽的元素在目标元素上同时鼠标放开触发的事件,此事件作用在目标元素上
- ondragend 事件:当拖拽完成后触发的事件,此事件作用在被拖曳元素上
实现一个最简单的拖拽交换顺序,可以通过以下步骤来实现
- ondragstart 记录初始拖拽元素,需要注意的是在Firefox浏览器中必须调用
dataTransfer.setData()
设置拖拽的值否则无法拖拽 - ondragover e.preventDefault() 阻止ondragover可能导致ondrop无法触发
- ondrop 记录目标元素,并交换初始元素与目标元素
Sortable用法
实现更顺滑的拖拽排序可以通过Sortable 来实现。
Sortable采用的是MIT协议,不依赖任何其它的库,使用原生html5 DnD来实现,并且只有1500行。
查看Demo
用法:
1 | Sortable.create(document.getElementById('foo'), { |
Sortable在React中的用法示例
React中的示例:1
2
3
4
5
6
7
8
9Sortable.create(document.getElementsByClassName('ul-container')[0], {
animation: 150,
onSort: evt => {
let newOrderItem = this.state.orderItem;
let dragedItem = newOrderItem.splice(evt.oldIndex, 1)[0];
newOrderItem.splice(evt.newIndex, 0, dragedItem);
this.setState({ orderItem: newOrderItem });
}
});
通常,还需要将拖拽的item的样式设置为不可见1
2
3
4
5
6ul li {
cursor: move;
}
.sortable-ghost {
opacity: 0;
}
其它版本的Sortable
Sortable由于只采用了原生的HTML5来实现拖拽,所以可以被轻松地移植到几乎所有的框架中,例如Vue版本的Sortable,Angular2版本的Sortable.