当前位置:首页 » 《随便一记》 » 正文

前端使用H5中draggable实现拖拽排序效果 两种实现效果

29 人参与  2024年03月02日 19:16  分类 : 《随便一记》  评论

点击全文阅读


文章目录

一、实现效果①1、实现代码2、效果演示 二、实现效果②1.实现代码2.效果演示

一、实现效果①

将一个节点拖到另一个节点之前或之后

1、实现代码

<!DOCTYPE html><style>    * {        padding: 0;        margin: 0;    }    body {        display: flex;        width: 100%;        height: 100vh;        justify-content: center;        align-items: center;    }    .list {        display: flex;        width: 336px;        flex-wrap: wrap    }    .list-item {        width: 100px;        height: 50px;        margin-top: 10px;        border: 1px solid gray;        margin-right: 10px;        background-color: gray;        color: #fff;    }    /*list-item 和 moving 同时在一个元素时生效*/    .list-item.moving {        color: transparent;        background-color: transparent;        border: 1px dashed gray !important;    }</style><body><div class="list">    <div draggable="true" class="list-item">1</div>    <div draggable="true" class="list-item">2</div>    <div draggable="true" class="list-item">3</div>    <div draggable="true" class="list-item">4</div>    <div draggable="true" class="list-item">5</div>    <div draggable="true" class="list-item">6</div>    <div draggable="true" class="list-item">7</div>    <div draggable="true" class="list-item">8</div>    <div draggable="true" class="list-item">9</div></div></body><script type="text/javascript">    let sourceNode;    const list = document.querySelector(".list");    // 当拖拽开始的时候    list.ondragstart = (e) => {        console.log("当前拖动的节点:");        console.log(e.target);        e.target.classList.add("moving");        sourceNode = e.target;    };    // 当拖拽进入某个节点时候    list.ondragenter = (e) => {        if(e.target === list || e.target === sourceNode) {            return;        }        console.log("拖拽到节点:");        console.log(e.target);        // Array.from ES6:将类数组对象 转成真正的数组  就可以使用数组自带的方法indexOf了        const children = Array.from(list.children);        const sourceIndex = children.indexOf(sourceNode);        const targetIndex = children.indexOf(e.target);        // insertBefore 插入的节点如果在list中存在,那么则会删除,再插入新的位置        if(sourceIndex < targetIndex) {            // 拖拽节点下标小于目标节点的下标            // 在目标节点的下一个元素之前插入拖拽的节点            list.insertBefore(sourceNode, e.target.nextElementSibling);        } else {            // 拖拽节点下标大于目标节点的下标            // 在目标节点之前插入拖拽的节点            list.insertBefore(sourceNode, e.target);        }    };    // 当前拖拽节点拖拽结束    list.ondragend = (e) => {        e.target.classList.remove('moving');    }    // 381 245 976</script></html>

2、效果演示

在这里插入图片描述

二、实现效果②

两个节点单纯的进行互换位置操作

1.实现代码

<!DOCTYPE html><style>    * {        padding: 0;        margin: 0;    }    body {        display: flex;        width: 100%;        height: 100vh;        justify-content: center;        align-items: center;    }    .list {        display: flex;        width: 336px;        flex-wrap: wrap    }    .list-item {        width: 100px;        height: 50px;        margin-top: 10px;        border: 1px solid gray;        margin-right: 10px;        background-color: gray;        color: #fff;    }    /*list-item 和 moving 同时在一个元素时生效*/    .list-item.moving {        color: transparent;        background-color: transparent;        border: 1px dashed gray !important;    }</style><body><div class="list">    <div draggable="true" class="list-item">1</div>    <div draggable="true" class="list-item">2</div>    <div draggable="true" class="list-item">3</div>    <div draggable="true" class="list-item">4</div>    <div draggable="true" class="list-item">5</div>    <div draggable="true" class="list-item">6</div>    <div draggable="true" class="list-item">7</div>    <div draggable="true" class="list-item">8</div>    <div draggable="true" class="list-item">9</div></div></body><script type="text/javascript">    let sourceNode;    const list = document.querySelector(".list");    // 当拖拽开始的时候    list.ondragstart = (e) => {        console.log("当前拖动的节点:");        console.log(e.target);        e.target.classList.add("moving");        sourceNode = e.target;    };    list.ondragover = (e) => {        e.preventDefault();    };    // 当拖拽放入某个目标节点后    list.ondrop = (e) => {        if(e.target === list || e.target === sourceNode) {            return;        }        console.log("拖拽到节点:");        console.log(e.target);        // Array.from ES6:将类数组对象 转成真正的数组  就可以使用数组自带的方法indexOf了        let targetSbin = e.target.nextElementSibling;        let sourceSbin = sourceNode.nextElementSibling;        // 在目标节点的下一个节点之前插入拖动节点        list.insertBefore(sourceNode, targetSbin);        // 在拖动节点的下一个节点之前插入目标节点        list.insertBefore(e.target, sourceSbin);    };    // 当前拖拽节点拖拽结束    list.ondragend = (e) => {        e.target.classList.remove('moving');    }    // 381 245 976</script></html>

2.效果演示

在这里插入图片描述


点击全文阅读


本文链接:http://zhangshiyu.com/post/72833.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1