js拖拽排序

10 篇文章 0 订阅
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style>
			*{
				margin: 0;
				padding: 0;
			}
			ul {
		        list-style: none;
		        margin: 200px;
		        font-size: 0;
		    }
		    .ele {
		        font-size: 16px;
		        width: 100px;
		        height: 40px;
		        border: 1px solid #999;
		        background: #EA6E59;
		        margin: 2px 0;
		        border-radius: 10px;
		        padding-left: 10px;
		        color: white;
		        cursor: move;
		    }
		</style>
	</head>
	<body>
		<ul id="container">
	        <li class="ele" draggable="true">1</li>
	        <li class="ele" draggable="true">2</li>
	        <li class="ele" draggable="true">3</li>
	        <li class="ele" draggable="true">4</li>
	        <li class="ele" draggable="true">5</li>
	        <li class="ele" draggable="true">6</li>
	        <li class="ele" draggable="true">7</li>
	        <li class="ele" draggable="true">8</li>
	    </ul>
	<script>
		var node=document.querySelector('#container');
		var dragging=null;
		var prevNext=null;
		var timer=null;
		//使用事件委托
		node.ondragstart=function(event){
			//兼容火狐
			event.dataTransfer.setData('te',event.target.innerText);
			dragging=event.target;
			prevNext=dragging.nextElementSibling;
		}
		node.ondragover=function(event){
			event.preventDefault();
			var target=event.target;
			if(target.nodeName=='LI'&&target!=dragging){
				if (target.animated) {
                    return;
                }
				//添加动画
				//思路:我们可以记录1和2交换之前的位置,然后获取交换之后的位置,然后让元素从原位置慢慢移动到目标位置。
				 clearTimeout(timer)
				 timer=setTimeout(function(){
					var targetRect = target.getBoundingClientRect();
					var dragingRect = dragging.getBoundingClientRect();
					//拖拽排序
					if(_index(dragging)<_index(target)){
	//					console.log(prevNext)
	//					console.log(prevNext)
	//					target.parentNode.insertBefore(target.nextSibling,prevNext);
						target.parentNode.insertBefore(dragging,target.nextSibling);
						target.parentNode.insertBefore(target,prevNext);
					}
					else{
						target.parentNode.insertBefore(dragging,target);
						target.parentNode.insertBefore(target,prevNext);
					}
					//然后在交换位置之后再次获取元素位置
					_animate(targetRect,target);
					_animate(dragingRect,dragging);
				},300)
				
				
			}
		}
		node.ondragend=function(event){
			console.log(1)
		}
		//当前li的index大于容器li时就插入在容器的前面,反之插入在容器的后面
		function _index(el){
			var index=0;
			if(!el||!el.parentNode){
				return -1;
			}
			while(el&&(el=el.previousElementSibling)){
				index++;
			}
			return index;
		}
		//动画方法
		function _animate(preventRect,target){
			var ms=300;
			if(ms){
				var currentRect=target.getBoundingClientRect();
				if(preventRect.nodeType===1){
					preventRect=preventRect.getBoundingClientRect();
				}
				target.style.transition='none';
				target.style.transform='translate3d(' +
				                (preventRect.left - currentRect.left) + 'px,' +
				                (preventRect.top - currentRect.top) + 'px,0)'
            	//触发重绘
            	target.offsetWidth;
            	target.style.transition='all 300ms';
				target.style.transform='translate3d(0,0,0)';
				clearTimeout(target.animated);
	            target.animated = setTimeout(function() {
	                target.style.transition='';
					target.style.transform='';
	                target.animated = false;
	            }, ms);
			}
		}
		
	</script>
	</body>
</html>

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值