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

news2024/9/24 5:28:22

文章目录

  • 一、实现效果①
    • 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://www.coloradmin.cn/o/1019761.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Matlab中关于 : 的使用

设&#xff0c;mat 这个矩阵的规格是 n*m&#xff0c;temp mat( i , j ) 矩阵的行和列的下标从1开始 在这个矩阵中&#xff0c;a:b 代表的含义是范围是从 a--b 则&#xff0c;当 a 和 b 被省略时&#xff0c;代表的范围就是最大范围&#xff08;1--n&#xff09; or &#…

卡奥斯第二届1024程序员节重磅预告!

一场属于程序员的狂欢! 第二届卡奥斯1024程序员节重磅来袭。 提前做好活动攻略&#xff0c;欢欢喜喜大奖抱回家&#xff01; 本次活动设置4个活动分会场: 低代码分会场、开源分会场、知识分会场和产品分会场&#xff0c;共12个奖项&#xff0c;1100多个奖品&#xff0c;雷神9…

IP归属地在金融行业的应用场景

IP归属地查询在各大行业当中的利用率可以说非常的高了&#xff0c;提供了各种的保障&#xff0c;比如安全保障、数据保障、性能保障等等。今天我就来详细说一说IP归属地在金融行业的应用场景有哪些&#xff1f; 用途一&#xff1a;通过解析用户IP地址所处的区县位置与表单填写位…

Re-Learn Linux Part1

1. Linux的目录结构 在Linux文件系统中有两个特殊的目录&#xff1a; 一个用户所在的工作目录&#xff0c;也叫当前目录&#xff0c;可以使用一个点 . 来表示&#xff1b;另一个是当前目录的上一级目录&#xff0c;也叫父目录&#xff0c;可以使用两个点 .. 来表示。 . &#…

关于激光探测器光斑质心算法在FPGA硬件的设计

目录 0引言 1CCD采集图像质心算法 2基于FPGA的图像质心算法 3仿真结果与分析 4结论 0引言 在一些姿态检测的实际应用中&#xff0c;需要在被测对象上安装激光探测器[1]&#xff0c;利用CCD相机捕捉激光光斑来检测观测对象的实际情况&#xff0c;光斑图像质心坐标的提取是图…

机器学习——SVM(支持向量机)

0、前言&#xff1a; SVM应用&#xff1a;主要针对小样本数据进行学习、分类和回归&#xff08;预测&#xff09;&#xff0c;能解决神经网络不能解决的过学习问题&#xff0c;有很好的泛化能力。&#xff08;注意&#xff1a;SVM算法的数学原理涉及知识点比较多&#xff0c;所…

grep多行匹配以及一些问题

测试文本, a.txt 123 456789这里是简单的文本 使用grep多行匹配 grep -Pzo "123\s456" a.txt-P: 启用Perl正则表达式模式。 -z: 允许多行匹配&#xff0c;即使匹配跨越了换行符的行。 -o: 只输出匹配的部分。 这里能匹配到 123 456但是有的时候也匹配不到&#…

表演复读生的王炸班型——薪火表演·独角兽班开课介绍

我们拥有同样的目标——大院名校 薪火独角兽班计划 最懂复读生的地方 不想上大课&#xff0c;只想1对1? 录制费用高&#xff0c;不愿增加父母经济压力? 稿件烂大街? 专业没人管? 这些都不是问题! 一站式解决复读生难题 选薪火独角兽班&#xff01; ---------ifire.ar…

利用前端和后端技术,海豚物流实现高效物流管理系统

随着信息技术的快速发展&#xff0c;前端和后端技术在物流行业中扮演着越来越重要的角色。海豚物流充分利用前后端技术&#xff0c;实现了物流管理的无缝协作&#xff0c;大大提升了运输效率和客户满意度。 前端技术在物流管理中扮演着用户界面的角色。通过优化用户界面&#x…

【产品运营】你真的懂B端大客户吗?来试试这8个棘手的需求问题

在与B端客户交流的过程中&#xff0c;有很多需要注意的问题&#xff0c;在产品的不同风格阶段&#xff0c;客户都会提出很多需求&#xff0c;而对于客户的需求产品经理需要有判断以及解决的能力&#xff1b; 本文主要讨论做需求时的棘手问题&#xff0c;在职责上与项目经理有些…

crypto++下载、安装(VS2017)及加解密使用

crpto 下载按个人喜好下载&#xff0c;我使用了图中框选的8.8.0 Release.解压 安装打开修改以适应本机配置整理至标准库 调用加解密使用 Crypto&#xff08;也称为Crypto Library或Crypto STL&#xff09;是一个C密码学库&#xff0c;它提供了各种密码学算法和安全编程工具&…

20230917后台面经总结

1.ping底层原理 Ping 是 ICMP 的一个重要应用&#xff0c;主要用来测试两台主机之间的连通性。Ping 的原理是通过向目的主机发送 ICMP Echo 请求报文&#xff0c;目的主机收到之后会发送 Echo 回答报文。Ping 会根据时间和成功响应的次数估算出数据包往返时间以及丢包率。 基…

vue项目 高德地图搜索带关键字效果demo(整理)

<!-- 高德地图引入 --> <script type"text/javascript">window._AMapSecurityConfig {securityJsCode: be00dfb4bcd4b18dd7760486c40aa1ed, //秘钥} </script> <!-- <script type"text/javascript" src"./qrcode.js"&g…

如何解决 503 Service Temporarily Unavailable?

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

Prompt-To-Prompt——仅通过文本进行图像编辑

文章目录 1.摘要2.算法2.1 Cross-attention in text-conditioned Diffusion Models2.2 Controlling the Cross-attentionWord SwapAdding a New PhraseAttention Re–weighting 3.应用Text-Only Localized EditingGlobal editingFader Control using Attention Re-weightingRea…

【QT5-解决不同分辨率屏幕-进行匹配大小-适应屏幕大小-基础样例】

【QT5-解决不同分辨率屏幕-进行匹配大小-适应屏幕大小】 1、前言2、实验环境3-1、问题说明-屏幕视频3-2、解决方式-个人总结解决思路&#xff1a;我们在软件启动的时候&#xff0c;先获取屏幕大小&#xff0c;然后根据长宽&#xff0c;按照一定比例&#xff0c;重新设置大小。并…

如何用思维导图做备考计划

大学除了上课&#xff0c;还有很多事情需要我们去做&#xff0c;比如说期末考试、考证等。思维导图作为一种高效的思维工具&#xff0c;可以帮助我们整理和规划备考内容。今天我们就将探讨如何用思维导图做备考计划&#xff0c;并提供一些实用的建议。甘特图&#xff08;Gantt …

flutter开发实战-自定义长按TextField输入框剪切、复制、选择全部菜单AdaptiveTextSelectionToolba样式UI效果

flutter开发实战-自定义长按TextField输入框剪切、复制、选择全部菜单样式UI效果 在开发过程中&#xff0c;需要长按TextField输入框cut、copy设置为中文“复制、粘贴”&#xff0c;我首先查看了TextField中的源码&#xff0c;看到了ToolbarOptions、AdaptiveTextSelectionToo…

工作5年,没用过分布式锁,正常吗?

公司想招聘一个5年开发经验的后端程序员&#xff0c;看了很多简历&#xff0c;发现一个共性问题&#xff0c;普遍都没用过分布式锁&#xff0c;这正常吗&#xff1f; 下面是已经入职的一位小伙伴的个人技能包&#xff0c;乍一看&#xff0c;还行&#xff0c;也没用过分布式锁。…

基于Java的新能源充电系统的设计与实现(亮点:完整合理的充电流程,举报反馈机制、余额充值、在线支付、在线聊天)

新能源充电系统 一、前言二、我的优势2.1 自己的网站2.2 自己的小程序&#xff08;小蔡coding&#xff09;2.3 有保障的售后2.4 福利 三、开发环境与技术3.1 MySQL数据库3.2 Vue前端技术3.3 Spring Boot框架3.4 微信小程序 四、功能设计4.1 主要功能描述 五、系统实现5.1 完整充…