js实现使用drag实现元素拖拽排序

本文介绍了如何使用JavaScript实现HTML元素的拖拽排序功能。通过获取拖拽目标和被替换元素的索引,对数组进行操作,重新排序并合并,从而实现元素的动态排序。文中提供了一个代码实例来详细说明这一过程。

思路:

1.获取到拖拽目标和被替换的目标索引值。

2.数组截取2个索引值之间的数组 dealArr ,数组第一部分resetArr1 ,第二部分resetArr2。

3.比较拖拽元素的索引值和被替换元素的索引值,根据值的大小对dealArr重新排序

4.将 resetArr1、 dealArr、 resetArr2重新合并即为排序后的数组

下面是代码实例,


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        *{margin: 0;padding: 0;}
        div{margin: 30px;}
        .clearfix{ *zoom:1;}
        .clearfix:after{
            content: '';
            display: block;
            visibility: hidden;
            clear: both;
            height: 0px;
        }
        span{
            height: 20px;
            width: auto;
            padding: 0 5px;
            margin: 2px 10px;
            line-height: 20px;
            text-align: center;
            border: 1px solid gold;
            cursor: pointer;
        }
    </style>
</head>
<body>
<div class="clearfix" id="content"></div>
<script>
    let allarr = ['a','b','c','d','e','f','g','h']
    let query = document.getElementById('content');
    let str='',dragItem,overItem;
    for (let i=0;i<allarr.length;i++){
        str +=`<span class="drapEle" draggable="true" >${allarr[i]}</span>`
    }
    query.innerHTML = str;
    document.addEventListener("drag", function(e) {
        dragItem = e.target.innerText;
    });
    document.addEventListener("dragover", function(e) {
        if(dragItem !== overItem){
            overItem = e.target.innerText;
        }else {
            overItem = '';
        }
    });
    document.addEventListener("dragend", function(e) {
        let orArr = [...allarr];
        let dragindex = orArr.findIndex(item => item == dragItem);
        let overindex = orArr.findIndex(item => item == overItem);
        let reset1=[],reset2 = [];
        if(dragindex!=-1 && overindex !=-1){
            let dealArr = [];
            if(dragindex > overindex){
                dealArr = orArr.slice(overindex,dragindex+1);
                let lastitem = dealArr.pop();
                dealArr = [...[lastitem],...dealArr];
                reset1 = orArr.slice(0,overindex);
                reset2 = orArr.slice(dragindex+1)
            };
            if(dragindex < overindex){
                dealArr = orArr.slice(dragindex,overindex+1);
                let [fisrtitem,...resetarr] = dealArr;
                dealArr = [...resetarr,...[fisrtitem]];
                reset1 = orArr.slice(0,dragindex);
                reset2 = orArr.slice(overindex+1)
            };
            allarr = [...reset1,...dealArr,...reset2];
            str = '';
            for (let i=0;i<allarr.length;i++){
                str +=`<span class="drapEle" draggable="true" >${allarr[i]}</span>`
            }
            query.innerHTML = str;
        }
    });


</script>
</body>
</html>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值