HTML拖拽功能(纯html5+JS实现)

news2025/1/15 17:47:58

1、HTML拖拽--单元行拖动

<!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>
    .list {
      padding: 0;
      margin: 0;
      padding-top: 10px;
      width: 500px;
      border: 1px solid;
      display: flex;
      flex-flow: column;
      align-items: center;
      justify-content: center;
      margin: 0 auto;
      list-style: none;
      /* 去除ul小点 */
    }

    .list-item {
      user-select: none;
      width: 400px;
      height: 45px;
      line-height: 45px;
      text-align: center;
      border: 1px solid;
      margin-bottom: 10px;
      /* 渐变背景 */
      background: linear-gradient(to right, #e9afaa, #51b9ff);
      cursor: move;
      color: #fff;
      border-radius: 5px;
    }

    /*移动中样式*/
    .list-item.moving {
      background: transparent;
      color: transparent;
      border: 1px dashed #ccc;
    }
  </style>
</head>

<body>
  <ul class="list">
    <li draggable="true" class="list-item">1</li>
    <li draggable="true" class="list-item">2</li>
    <li draggable="true" class="list-item">3</li>
    <li draggable="true" class="list-item">4</li>
    <li draggable="true" class="list-item">5</li>
    <li draggable="true" class="list-item">6</li>
    <li draggable="true" class="list-item">7</li>
    <li draggable="true" class="list-item">8</li>
  </ul>
  <script>

    /*(1)获取父元素dom*/
    const list = document.querySelector('.list');
    let sourceNode; //当前在拖动的节点

    /*拖动开始-- 当前选中节点增加样式*/
    list.ondragstart = e => {
      setTimeout(() => {
        e.target.classList.add('moving')//给当前选中增加样式
      }, 0);
      sourceNode = e.target 
      e.dataTransfer.effectAllowed = 'move';//允许移动操作
    }

    /*拖动在目标区域移动*/
    list.ondragover = e => {
      e.preventDefault() // 允许放置
    }

    /*拖动进入目标区域 */
    list.ondragenter = e => {
      e.preventDefault(); // 允许放置
      if (e.target === list || e.target === sourceNode) {
        return
      }
      const children = Array.from(list.children) //创建新数组进行操作
      const sourceIndex = children.indexOf(sourceNode) //获取拖动开始下标
      const targetIndex = children.indexOf(e.target)   //获取当前下标
      /*位置挪动*/
      if (sourceIndex < targetIndex) {
        list.insertBefore(sourceNode, e.target.nextElementSibling)
      } else {
        list.insertBefore(sourceNode, e.target)
      }
    }

    /*拖动结束-- 重置拖动样式状态*/
    list.ondragend = e => {
      e.target.classList.remove('moving')
    }


  </script>
</body>

</html>

2、HTML拖拽--九宫格拖动

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

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>html_拖动-九宫格</title>
  <style>
    .list {
      padding: 0;
      margin: 0;
      padding-top: 10px;
      width: 660px;
      border: 1px solid;
      display: flex;
      flex-wrap: wrap;
      margin: 0 auto;
      list-style: none;
      /* 去除ul小点 */
    }

    .list-item {
      box-sizing: border-box;
      cursor: move;
      display: inline-block;
      user-select: none;
      width: 200px;
      height: 200px;
      margin-bottom: 10px;
      /* 渐变背景 */
      background: linear-gradient(to right, #e9afaa, #51b9ff);
      border: 1px solid;
      color: #fff;
      border-radius: 10px;
      margin:10px 10px;
      display: flex;
      align-items: center;
      justify-content: center;
    }

    /*移动中样式*/
    .list-item.moving {
      opacity: 0.5;
      /* background: transparent; */
      /* color: transparent; */
      border: 1px dashed #ccc;
    }
  </style>
</head>

<body>
  <ul class="list">
    <li draggable="true" class="list-item">1</li>
    <li draggable="true" class="list-item">2</li>
    <li draggable="true" class="list-item">3</li>
    <li draggable="true" class="list-item">4</li>
    <li draggable="true" class="list-item">5</li>
    <li draggable="true" class="list-item">6</li>
    <li draggable="true" class="list-item">7</li>
    <li draggable="true" class="list-item">8</li>
    <li draggable="true" class="list-item">9</li>
  </ul>
  <script>

    /*(1)获取父元素dom*/
    const list = document.querySelector('.list');
    let sourceNode; //当前在拖动的节点

    /*拖动开始-- 当前选中节点增加样式*/
    list.ondragstart = e => {
      setTimeout(() => {
        e.target.classList.add('moving')//给当前选中增加样式
      }, 0);
      sourceNode = e.target
      e.dataTransfer.effectAllowed = 'move';//允许移动操作
    }

    /*拖动在目标区域移动*/
    list.ondragover = e => {
      e.preventDefault() // 允许放置
    }

    /*拖动进入目标区域 */
    list.ondragenter = e => {
      e.preventDefault(); // 允许放置
      if (e.target === list || e.target === sourceNode) {
        return
      }
      const children = Array.from(list.children) //创建新数组进行操作
      const sourceIndex = children.indexOf(sourceNode) //获取拖动开始下标
      const targetIndex = children.indexOf(e.target)   //获取当前下标
      /*位置挪动*/
      if (sourceIndex < targetIndex) {
        list.insertBefore(sourceNode, e.target.nextElementSibling)
      } else {
        list.insertBefore(sourceNode, e.target)
      }
    }

    /*拖动结束-- 重置拖动样式状态*/
    list.ondragend = e => {
      e.target.classList.remove('moving')
    }

  </script>
</body>

</html>

3、html拖拽事件

 在HTML和JavaScript中,拖放操作涉及多个事件,这些事件可以让你在不同的阶段处理拖放行为。ondragenter 是其中一个事件,它在拖动元素进入目标元素的边界时触发。以下是拖放操作中常用的事件及其用途:

1、dragstart

  • 触发时机拖动操作开始时触发
  • 用途:可以用来设置拖动数据和拖动效果。
  • 示例
javascript

element.ondragstart = function(event) {
  event.dataTransfer.setData("text/plain", event.target.id);
};

2. drag

  • 触发时机拖动过程中不断触发
  • 用途:可以用来提供拖动过程中的反馈,例如更新拖动图标或状态。
  • 示例
javascript

element.ondrag = function(event) {
  // 更新拖动状态
};

3. dragenter

  • 触发时机拖动元素进入目标元素的边界时触发
  • 用途:可以用来设置目标元素的样式,表示可以放置。
  • 示例
javascript

targetElement.ondragenter = function(event) {
  event.target.style.border = "2px dashed #000";
};

4. dragover

  • 触发时机拖动元素在目标元素上移动时触发
  • 用途:可以用来设置放置效果,例如允许或禁止放置。
  • 示例
javascript

targetElement.ondragover = function(event) {
  event.preventDefault(); // 允许放置
};

5. dragleave

  • 触发时机拖动元素离开目标元素的边界时触发
  • 用途:可以用来重置目标元素的样式。
  • 示例
javascript

targetElement.ondragleave = function(event) {
  event.target.style.border = "none";
};

6. drop

  • 触发时机在目标元素上释放拖动元素时触发
  • 用途:可以用来处理放置操作,例如获取拖动数据并进行处理。
  • 示例
javascript

targetElement.ondrop = function(event) {
  event.preventDefault();
  const data = event.dataTransfer.getData("text/plain");
  const draggedElement = document.getElementById(data);
  // 处理放置操作
};

7. dragend

  • 触发时机拖动操作结束时触发,无论是在目标元素上释放还是取消拖动
  • 用途:可以用来重置拖动状态和样式。
  • 示例
javascript

element.ondragend = function(event) {
  // 重置拖动状态
};

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

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

相关文章

初识算法和数据结构P1:保姆级图文详解

文章目录 前言1、算法例子1.1、查字典&#xff08;二分查找算法&#xff09;1.2、整理扑克&#xff08;插入排序算法&#xff09;1.3、货币找零&#xff08;贪心算法&#xff09; 2、算法与数据结构2.1、算法定义2.2、数据结构定义2.3、数据结构与算法的关系2.4、独立于编程语言…

Linux 多路径Multipath学习

文章目录 Linux 多路径Multipath学习1. 简介1.1 Multipath I/O 技术 2. Multipath安装与使用2.1 安装2.2 启动 3. scsi设备模拟器scsi_debug3.1 简介3.2 加载 scsi_debug3.3 查看 scsi_id3.4 配置多个模拟设备3.5 聚合多路径 4. 删除聚合和单设备4.1 删除mpath4.2 删除 scsi 设…

浅谈云计算06 | 云管理系统架构

云管理系统架构 一、云管理系统架构&#xff08;一&#xff09;远程管理系统&#xff08;二&#xff09;资源管理系统&#xff08;三&#xff09;SLA 管理系统&#xff08;四&#xff09;计费管理系统 二、安全与可靠性保障&#xff08;一&#xff09;数据安全防线&#xff08;…

Observability:利用 GCP Vertex AI 集成提升 LLM 可观察性

作者&#xff1a;来自 Elastic Ishleen Kaur•Muthukumar Paramasivam 随着组织越来越多地将 LLM 用于内容创建、检索增强生成 (Retrieval-Augmented Generation - RAG) 和数据分析等 AI 应用&#xff0c;SRE 和开发人员面临着新的挑战。监控工作流、分析输入和输出、管理查询延…

Node.js - Express框架

1. 介绍 Express 是一个基于 Node.js 的 Web 应用程序框架&#xff0c;主要用于快速、简便地构建 Web 应用程序 和 API。它是目前最流行的 Node.js Web 框架之一&#xff0c;具有轻量级、灵活和功能丰富的特点。 核心概念包括路由&#xff0c;中间件&#xff0c;请求与响应&a…

Linux Top 命令 load average 指标解读

前言 作为平台开发的同学&#xff0c;维护平台稳定性是我们最基本的工作职责&#xff0c;下面主要介绍下top 命令里 &#xff0c;load average 这个指标如何去衡量机器负载程度。 概念介绍 load average 是系统在过去 1 分钟、5 分钟、15 分钟 的平均负载&#xff0c;它表示运…

【大数据】机器学习------神经网络模型

一、神经网络模型 1. 基本概念 神经网络是一种模拟人类大脑神经元结构的计算模型&#xff0c;由多个神经元&#xff08;节点&#xff09;组成&#xff0c;这些节点按照不同层次排列&#xff0c;通常包括输入层、一个或多个隐藏层和输出层。每个神经元接收来自上一层神经元的输…

【day5】Redis持久化之AOF + Redis事务_锁机制

AOF是什么 以日志的形式来记录每个写操作(增量保存)&#xff0c;将 Redis 执行过的所有写指令记录下来(比 如 set/del 操作会记录, 读操作 get 不记录 只许追加文件但不可以改写文件 redis 启动之初会读取该文件重新构建数据 redis 重启的话就根据日志文件的内容将写指令从前到…

【Python】Python之locust压测教程+从0到1demo:基础轻量级压测实战(1)

文章目录 一、什么是Locust二、Locust 架构组成三、实战 Demo准备一个可调用的接口编写一个接口测试用例编写一个性能测试用例执行性能测试用例代码1、通过 Web UI 执行&#xff08;GUI模式&#xff09;2、通过命令行执行&#xff08;非GUI模式&#xff09; 小知识&#xff1a;…

Jaeger UI使用、采集应用API排除特定路径

Jaeger使用 注&#xff1a; Jaeger服务端版本为&#xff1a;jaegertracing/all-in-one-1.6.0 OpenTracing版本为&#xff1a;0.33.0&#xff0c;最后一个版本&#xff0c;停留在May 06, 2019。最好升级到OpenTelemetry。 Jaeger客户端版本为&#xff1a;jaeger-client-1.3.2。…

基于Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用-以ENSO预测为例讲解

1. 背景与目标 ENSO&#xff08;El Nio-Southern Oscillation&#xff09;是全球气候系统中最显著的年际变率现象之一&#xff0c;对全球气候、农业、渔业等有着深远的影响。准确预测ENSO事件的发生和发展对于减灾防灾具有重要意义。近年来&#xff0c;深度学习技术在气象领域…

【IDEA 2024】学习笔记--文件选项卡

在我们项目的开发过程中&#xff0c;由于项目涉及的类过多&#xff0c;以至于我们会打开很多的窗口。使用IDEA默认的配置&#xff0c;个人觉得十分不便。 目录 一、设置多个文件选项卡按照文件字母顺序排列 二、设置多个文件选项卡分行显示 一、设置多个文件选项卡按照文件字…

nginx的可视化配置工具nginxWebUI的使用

文章目录 1、nginx简介2、nginxWebUI2.1、技术解读2.2、开源版和专业版之间的区别2.3、功能解读 3、安装与使用3.1、下载镜像3.2、查看镜像3.3、启动容器3.4、使用 4、总结 1、nginx简介 Nginx 是一个高效的 HTTP 服务器和反向代理&#xff0c;它擅长处理静态资源、负载均衡和…

qt vs ios开发应用环境搭建和上架商店的记录

qt 下载链接如下 https://download.qt.io/new_archive/qt/5.14/5.14.2/qt-opensource-mac-x64-5.14.2.dmg 安装选项全勾选就行&#xff0c;这里特别说明下qt5.14.2/qml qt5.14.2对qml支持还算成熟&#xff0c;但很多特性还得qt6才行&#xff0c;这里用qt5.14.2主要是考虑到服…

系统思考—全局思维

在一个复杂的企业中&#xff0c;无论是生产、营销、研发、产品还是采购&#xff0c;作为核心团队&#xff0c;大家不只关注单一的问题——需要从整体出发。企业是一个有机的整体&#xff0c;每一个环节都息息相关。如果只解决一个问题&#xff0c;却忽视了其他部分的相互作用&a…

软件设计师 - 第10章 网络与信息安全基础知识

网络概述 功能:数据通信,资源共享,管理集中化,实现分布式处理,负载均衡 分类:局域网,城域网,广域网 拓扑结构:总线型,星型,环型,树型,分布式 ISO/OSI七层模型: 应用层:提供与用户交互的界面,并支持特定应用程序的服务,FTP、Telnet、SMTP、NFS、SNMP、HTTP、…

记录一次Android Studio的下载、安装、配置

目录 一、下载和安装 Android Studio 1、搜索下载Android studio ​2、下载成功后点击安装包进行安装&#xff1a; 3、这里不用打勾&#xff0c;直接点击安装 &#xff1a; 4、完成安装&#xff1a; 5、这里点击Cancel就可以了 6、接下来 7、点击自定义安装&#xff1a…

自定义注解使用AspectJ切面和SpringBoot的Even事件优雅记录业务接口及第三方接口调用日志实现思路

自定义注解使用AspectJ切面和SpringBoot的Even事件优雅记录业务接口及第三方接口调用日志实现思路 文章目录 1.前言2.思路2.1使用ELK收集日志2.1.1ELK搭建2.1.2项目中集成ELK日志收集2.1.2.1 引入依赖2.1.2.2 logback-xxx.xml配置2.1.2.3 yaml配置 2.2本文思路2.2.1书接上文--自…

Windows 正确配置android adb调试的方法

下载适用于 Windows 的 SDK Platform-Tools https://developer.android.google.cn/tools/releases/platform-tools?hlzh-cn 设置系统变量&#xff0c;路径为platform-tools文件夹的绝对路径 点击Path添加环境变量 %adb%打开终端输入adb shell 这就成功了&#xff01;

保姆级图文详解:Linux和Docker常用终端命令

文章目录 前言1、Docker 常用命令1.1、镜像管理1.2、容器管理1.3、网络管理1.4、数据卷管理1.5、监控和性能管理 2、Linux 常用命令分类2.1、文件和目录管理2.2、用户管理2.3、系统监控和性能2.4、软件包管理2.5、网络管理 前言 亲爱的家人们&#xff0c;技术图文创作很不容易…