首页 > 其他分享 >【JS】拖动排序

【JS】拖动排序

时间:2024-04-04 22:58:35浏览次数:21  
标签:target dom 拖动 list JS 排序 children sourceNode

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .box {
      width: 200px;
      height: 40px;
      margin-bottom: 20px;
      background-color: palegoldenrod;
      cursor: pointer;
    }

    .moving {
      background-color: transparent;
      border: 1px solid #333;
    }
  </style>
</head>

<body>
  <div class="list">
    <div class="box" draggable="true">111</div>
    <div class="box" draggable="true">222</div>
    <div class="box" draggable="true">333</div>
    <div class="box" draggable="true">444</div>
    <div class="box" draggable="true">555</div>
  </div>
  <script>
    const list_dom = document.querySelector(".list")
    let sourceNode
    list_dom.ondragstart = e => {
      setTimeout(() => {
        e.target.classList.add('moving')
      }, 0);
      e.dataTransfer.effectAllowed = "move" // 取消拖拽时光标自带的绿色加号
      sourceNode = e.target
    }
    list_dom.ondragover = e => {
      e.preventDefault() // 拖动元素默认会回到其初始位置,需要阻止默认行为
    }
    list_dom.ondragenter = e => {
      // e.preventDefault()

      // 如果拖动到本身,或者最大父元素中,不做处理
      if (e.target === list_dom || e.target === sourceNode) {
        return
      }
      const children = [...list_dom.children]
      const sourceIndex = children.indexOf(sourceNode)
      const targetIndex = children.indexOf(e.target)
      if (sourceIndex < targetIndex) {
        // 向下拖动
        list_dom.insertBefore(sourceNode, e.target.nextElementSibling)
      } else {
        // 向上拖动
        list_dom.insertBefore(sourceNode, e.target)
      }
    }
    list_dom.ondragend = e => {
      e.target.classList.remove('moving')

    }
  </script>
</body>

</html>

在这里插入图片描述

标签:target,dom,拖动,list,JS,排序,children,sourceNode
From: https://blog.csdn.net/owo_ovo/article/details/137139256

相关文章

  • 【JS】手写Promise.all
    注意判断参数是否为空时,不能只根据length判断,因为只要是可迭代对象都可以用length。js有哪些内置可迭代对象可以看另一篇文章:JS内置可迭代对象。如何变为可迭代对象可以看其他两篇文章:Object.definePropery和使如下代码成立:var[a,b]={a:1,b:2}防止用户传入非P......
  • 多表的联合查询以及分组排序与HAVING筛选
    DDL【创建数据库】——学生表——成绩表CREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEFAULTNULL,`pwd`varchar(36)DEFAULTNULL,`phone`varchar(11)DEFAU......
  • nodejs中使用Nunjucks 模板引擎
    要在Koa2中使用Nunjucks模板引擎,你需要进行一些额外的设置。以下是一个示例代码,演示了如何在Koa2中集成Nunjucks:首先,确保已经安装了Koa和Nunjucks:npminstallkoanunjucks然后,在项目中创建一个名为app.js的文件,并添加以下代码:constKoa=require('koa');con......
  • (谷歌浏览器)如何在vscode中搭建vue.js devtools的环境
    搭建过程中明明所有操作步骤都做了,却还是出现下面这种情况: 以下是正确的搭建操作步骤:根据一下图片在vscode中创建文件夹;将以下代码写入; <scripttype="text/javascript"src="../js/vue.js"></script>接下来就是我们需要点击https://vuejs.zcopy.site/,进入到网站后,......
  • 算法绘本-选择排序
    选择排序也是一种比较简单的排序方式,其原理是在给定的一系列值中,首先找出最小的值放在第一位,然后在剩下的值中找出最小的值放在第二位,以此类推,直到剩下的值只有一个的时候,则完成了排序。下面看一个例子,假设给定一组数字3,2,8,2,4,9,1首先是第一轮,假设第一个数字3为最小值,记录下......
  • 基于ssm网上医院预约挂号系统+jsp论文
    摘要如今的信息时代,对信息的共享性,信息的流通性有着较高要求,因此传统管理方式就不适合。为了让医院预约挂号信息的管理模式进行升级,也为了更好的维护医院预约挂号信息,网上医院预约挂号系统的开发运用就显得很有必要。并且通过开发网上医院预约挂号系统,不仅可以让所学的SSM......
  • 【算法】BFS、并查集和拓扑排序
    最近刷到了两道关于图论很有意思的题目()。做法颇有相似之处,因此记录一下吧AcWing2069.网络分析标签:dfs、并查集题目描述题目大意是,有一个\(n\)个顶点的网络,初始状态图中没有边。有两种操作:操作1将节点\(a\)和节点\(b\)连接起来;操作2使节点\(p\)的值加\(t\),\(t\)值会沿着网......
  • 解决 WebStorm 粘贴 JSX 时自动将 class 改为 className 的问题
    参考:解决复制时class自动改为className的问题将该选项取消勾选:File=>Settings=>Editor=>General=>SmartKeys=>JavaScript=>ConvertHTMLwhenpastingintoJSXfiles。......
  • node.js启动文件服务器 并自动查询index.html等默认文件
    方法1'usestrict';consthttp=require('http'),fs=require('fs'),url=require('url'),path=require('path');//从命令行参数获取root目录,默认是当前目录varroot=path.resolve(process.argv[2]||'.&......
  • 坐标排序
    题目描述输入 n 个不同的坐标,按 x 轴的值从小到大排序,如果 x 相同,则按照 y 排序。输入格式第 1 行是一个整数 n ( n <=10000 )。接下来有 n 行,每行有 2 个整数,代表了 1 个点的坐标。输出格式输出 n 行,每行有 2 个整数,输出排序后的 n 个坐标。......