原生js实现拖拽改变元素顺序

news2024/11/25 11:58:30

代码展示如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box{
            border: 10px solid #000;
        }
        .item{
            margin: 10px 10px 0 10px;
            background-color: aquamarine;
            padding: 10px;
            text-align: center;
        }
        .item:nth-last-child(1){
            margin-bottom: 10px;
        }
    </style>
</head>
<body>
    <div class="box">
    </div>
    <h1></h1>
    <script>
        class Demo {
            constructor(data,box,showResBox){
                this.data = data
                this.box = box
                this.showResBox = showResBox
                this.init(data,box,showResBox)
            }
            init (data,box) {
                let fragment = document.createDocumentFragment();
                for (let i = 0; i < data.length; i++) {
                    let div = document.createElement("div")
                    div.setAttribute("class","item")
                    div.setAttribute("draggable",true)
                    div.innerText = data[i]
                    fragment.appendChild(div)
                }
                box.appendChild(fragment)
                this.showResBox.innerHTML = `最终的结果:${data.join('-')}`
                this.handledragstart(box)
                this.handledragover(box)
                this.handledragend(box)
                fragment = null
            }
            changeElemPosition(source,target,parentNode) {
                let sourceNext = source.nextSibling;
                let targetNext = target.nextSibling;
                parentNode.insertBefore(target,sourceNext)
                parentNode.insertBefore(source,targetNext)
            }
            eventFn(e) {
                let that = this
                switch (e.type) {
                    case 'dragstart':
                        if (e.target.className=="item") {
                            that.sourceElem = e.target
                        }
                        return
                    case 'dragover':
                        e.preventDefault()
                        if (e.target.className=="item") {
                            that.targetElem = e.target
                        }
                        return
                    case 'dragend':
                        let temp = []
                        that.changeElemPosition(that.sourceElem,that.targetElem,e.currentTarget)
                        Array.from(e.currentTarget.children).forEach(elem=>{
                            temp.push(Number(elem.innerText)) 
                        })
                        that.data = [...temp]
                        that.showResBox.innerHTML = `最终的结果:${that.data.join('-')}`
                        that.removeEventAndObj(that.eventFn)
                        return
                }
            }
            handledragstart (box) {
                box.addEventListener('dragstart',(e)=>{this.eventFn(e)})
            }
            handledragover (box) {
                box.addEventListener('dragover',(e)=>{this.eventFn(e)})
            }
            handledragend (box) {
                box.addEventListener('dragend',(e)=>{this.eventFn(e)})
            }
            removeEventAndObj(eventFn) {
              this.targetElem = null
              this.sourceElem = null
              this.box.removeEventListener('dragstart',eventFn)
              this.box.removeEventListener('dragover',eventFn)
              this.box.removeEventListener('dragend',eventFn)
            }

        }
        let d = new Demo([1,2,3,4,6],document.querySelector('.box'),document.querySelector('h1'))
    </script>
</body>
</html>

效果展示如下:

在这里插入图片描述

知识点须知:【详情请参考:insertBefore】

Node.insertBefore(newNode,referenceNode)

如果给定的节点(newNode)是对文档中现有节点的引用,insertBefore方法会将其从当前位置移动到新位置将节点附加到其他节点之前的操作,不需要从其父节点删除该节点)。

用法:

parentNode.insertBefore(newNode, referenceNode);

需要注意的是:html5 draggable属性在移动端不生效

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1694163.html

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

相关文章

基于HTML5和CSS3搭建一个Web网页(二)

倘若代码中有任何问题或疑问&#xff0c;欢迎留言交流~ 网页描述 创建一个包含导航栏、主内容区域和页脚的响应式网页。 需求: 导航栏: 在页面顶部创建一个导航栏&#xff0c;包含首页、关于我们、服务和联系我们等链接。 设置导航栏样式&#xff0c;包括字体、颜色和背景颜…

2024年上半年软件系统架构师论文【回忆版】

文章目录 考试时间考试地点案例分析1、微服务架构的优点和缺点2、质量属性的6个元素3、分布式锁 Redis的缺点4、MongoDB 存储矢量图的优势 论文回忆版论文一、论单元测试的设计与应用论文二、论大数据模型的设计与应用论文三、论模型驱动的架构设计及应用论文四、论云原生运维的…

第十节 SpringBoot Starter 实战之 redis 滑动窗口

使用 redis 实现滑动窗口&#xff0c;我们会基于这个场景&#xff0c;建立一个 Starter&#xff0c;在这之前&#xff0c;我们需要先。理解这个场景。 关键字&#xff1a;滑动窗口、流式计算、lua脚本、redis、zset、starter 概要&#xff1a;本文封装 redis 的API&#xff0c…

内网渗透(不出网上线CS)

目录 CS的概述 实验&#xff1a;不出网上线CS实验 一&#xff1a;给PC1种马 二&#xff1a;使用Beacon SMB去控制PC2。 三&#xff1a;将CS权限传递给MSF 四&#xff1a;将msf权限传递给CS CS的概述 cs是一款强大的控制windows木马的工具。是目前渗透中常使用的一个工具…

Pandas高效数据清洗与转换技巧指南【数据预处理】

三、数据处理 1.合并数据&#xff08;join、merge、concat函数&#xff0c;append函数&#xff09; Concat()函数使用 1.concat操作可以将两个pandas表在垂直方向上进行粘合或者堆叠。 join属性为outer&#xff0c;或默认时&#xff0c;返回列名并集&#xff0c;如&#xff…

Leetcode - 398周赛

目录 一&#xff0c;3151. 特殊数组 I 二&#xff0c;3152. 特殊数组 II 三&#xff0c;3153. 所有数对中数位不同之和 四&#xff0c;3154. 到达第 K 级台阶的方案数 一&#xff0c;3151. 特殊数组 I 本题就是判断一个数组是否是奇偶相间的&#xff0c;如果是&#xff0c;…

开源的在线JSON数据可视化编辑器jsoncrack本地部署与远程访问

文章目录 1. 在Linux上使用Docker安装JSONCrack2. 安装Cpolar内网穿透工具3. 配置JSON Crack界面公网地址4. 远程访问 JSONCrack 界面5. 固定 JSONCrack公网地址 JSON Crack 是一款免费的开源数据可视化应用程序&#xff0c;能够将 JSON、YAML、XML、CSV 等数据格式可视化为交互…

一篇文章讲透排序算法之希尔排序

希尔排序是对插入排序的优化&#xff0c;如果你不了解插入排序的话&#xff0c;可以先阅读这篇文章&#xff1a;插入排序 目录 1.插入排序的问题 2.希尔排序的思路 3.希尔排序的实现 4.希尔排序的优化 5.希尔排序的时间复杂度 1.插入排序的问题 如果用插入排序对一个逆序…

结构体;结构成员访问操作符

结构体&#xff1a; 虽然c语言已经提供了内置类型&#xff0c;比如&#xff1a;char、short、int、long等&#xff0c;但还是不够用&#xff0c;就好比我描述一个人&#xff0c;我需要描述他的身高&#xff0c;体重&#xff0c;年龄&#xff0c;名字等信息&#xff0c…

手把手一起学习Python NumPy

NumPy 是用于处理数组的 python 库&#xff0c;NumPy 中的数组对象称为 ndarray&#xff0c;它提供了许多支持函数&#xff0c;使得利用 ndarray 非常容易。Numpy官方网址 NumPy 安装 使用pip安装NumPy 模块&#xff1a; pip install numpyNumPy 入门 创建numpy数组&#x…

python-绘制五星红旗(非标准)

完整代码如下&#xff1a; #五星红旗&#xff08;非标准版&#xff09; from turtle import* import math from random import* tracer(0) penup() goto(-640,220) pendown() color(gold,gold) begin_fill() for i in range(5): fd(150) right(144) # 大五角星 penup(…

【Redis】 关于 Redis 哈希类型

文章目录 &#x1f343;前言&#x1f38b;命令介绍&#x1f6a9;hset&#x1f6a9;hget&#x1f6a9;hexists&#x1f6a9;hdel&#x1f6a9;hkeys&#x1f6a9;hvals&#x1f6a9;hgetall&#x1f6a9;hmget&#x1f6a9;hlen&#x1f6a9;hsetnx&#x1f6a9;hincrby&#x1…

C++面向对象程序设计-北京大学-郭炜【课程笔记(十一)】

C面向对象程序设计-北京大学-郭炜【课程笔记&#xff08;十一&#xff09;】 1、string&#xff08;重要知识点&#xff09;1.2、string的赋值和链接1.3、比较string1.4、子串1.5、交换string1.6、寻找string中的字符1.7、删除string中的字符1.8、替换string中的字符1.9、在str…

java项目之图书管理系统源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的图书管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 系统主要分为管理员角色和用…

宝塔PHP环境安装配置Xdebug

宝塔PHP环境安装配置Xdebug 安装XdebugVSCode安装插件编辑配置文件编辑配置运行调试断点快捷键其他 安装Xdebug 在宝塔中&#xff0c;找到PHP&#xff0c;打开管理页面&#xff0c;选择xdebug扩展&#xff0c;点击操作栏中的安装按钮&#xff08;这里已经安装过了&#xff0c;…

JavaFX学习教程二

一、JavaFX 体系结构 JavaFX 场景图(Scene Graph)是构建 JavaFX 应用程序的起点&#xff0c;一种树状数据结构&#xff0c;用于排列&#xff08;和分组&#xff09;图形对象&#xff0c;以便于逻辑表示。 stage:舞台&#xff0c;操作系统窗口的 JavaFX 表示&#xff0c;是所有…

【Python】 掌握 Flask 请求数据获取的艺术

基本原理 在Web开发中&#xff0c;Flask是一个用Python编写的轻量级Web应用框架。它被广泛用于快速开发简单的Web应用。当用户通过浏览器或其他客户端向服务器发送请求时&#xff0c;Flask需要能够接收和解析这些请求中的数据。这些数据可以是GET请求的查询字符串、POST请求的…

方言和大语言模型

方言多样性及其对语言模型的影响 语言的演变是不可避免的&#xff0c;反映并推动了重大的社会变革和传统。语言接触往往会推动我们说话方式的创新&#xff0c;在美国全球文化的影响下&#xff0c;一种新的叙事正在其语言织锦中展开。 例如&#xff0c;在佛罗里达州南部&#…

springboot2.x3.x的A项目(作为sdk)集成到启动B项目调用2

一 概述 1.1 说明 本博客记录的案例&#xff0c;逻辑是&#xff1a; 项目A读取配置文件&#xff0c;并在service类的方法进行打印输出。项目A作为sdk被项目B进行依赖&#xff0c; 在项目B启动后&#xff0c;进行调用&#xff0c;并且在B进行参数的配置&#xff0c;能够覆盖…