前端的拖拽序列(drag)

html和css代码如下

<style>.item {width: 200px;height: 50px;background: rgb(15, 226, 219);margin: 10px 0;padding-left: 20px;border-radius: 10px;line-height: 50px;}.item.move {background: transparent;color: transparent;border: 1px dashed #ccc;}</style>
</head><body><div class="list"><div draggable="true" class="item">1</div><div draggable="true" class="item">2</div><div draggable="true" class="item">3</div><div draggable="true" class="item">4</div><div draggable="true" class="item">5</div><div draggable="true" class="item">6</div><div draggable="true" class="item">7</div><div draggable="true" class="item">8</div></div>

这是每一个序列,定义好样式后,通过监听dragstart事件,开始拖动事件,给他加上拖拽后的虚线样式,也就是这样

但此时,拖住的元素也是虚线的,因为拖住的时候,原始的元素就改变了,拖住的元素的样式是根据原来的样式来决定的,所以我们可以放入一个异步里,也就是setTimeout中(用了事件委托)

但为啥原来的位置也变成异步了?????

    // 利用了事件委托list.addEventListener("dragstart", function (e) {// 使用setTimeout让他拖拽的元素不要变成虚线,还是原来的样式,放入一个异步任务里就行setTimeout(() => {e.target.classList.add('move')}, 0)sourceDiv = e.targete.dataTransfer.effectAllowed = 'move'})

 e.dataTransfer.effectAllowed = 'move'是设置鼠标样式为move的样式

如果拖进的元素是父容器或者他自身则不拖进

   if (e.target == list || e.target == sourceDiv) {return}

通过扩展运算符,将伪数组转换为数组

 const children = [...list.children]

这样就可以通过indexOf获取对应元素的索引,比如拖住的元素的索引,和进入元素的索引

我们通过判断是上移还是下移来决定元素的排序,如果是上移,那么拖住的元素要插入进入的元素之前,如果是下移,那么拖住的元素要插入拖入元素的下一个同类元素的前面,这是上移和下移的区别

    // 上移if (sourceIndex > targetIndex) {list.insertBefore(sourceDiv, e.target)} else {// 下移list.insertBefore(sourceDiv, e.target.nextElementSibling)}})

拖拽结束后要把之前添加的move类,也就是虚线透明样式给删除

    // 拖拽结束后,最后将虚线方框移除list.addEventListener("dragend", function (e) {e.target.classList.remove('move')})

还有dragenter和dragover事件的默认行为是拒绝接受任何被拖放的元素。因此,我们必须阻止浏览器这种默认行为。

这样就完成了拖拽序列

全部代码如下

<!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>.item {width: 200px;height: 50px;background: rgb(15, 226, 219);margin: 10px 0;padding-left: 20px;border-radius: 10px;line-height: 50px;}.item.move {background: transparent;color: transparent;border: 1px dashed #ccc;}</style>
</head><body><div class="list"><div draggable="true" class="item">1</div><div draggable="true" class="item">2</div><div draggable="true" class="item">3</div><div draggable="true" class="item">4</div><div draggable="true" class="item">5</div><div draggable="true" class="item">6</div><div draggable="true" class="item">7</div><div draggable="true" class="item">8</div></div><script>const list = document.querySelector('.list')let sourceDiv// 利用了事件委托list.addEventListener("dragstart", function (e) {// 使用setTimeout让他拖拽的元素不要变成虚线,还是原来的样式,放入一个异步任务里就行setTimeout(() => {e.target.classList.add('move')}, 0)sourceDiv = e.targete.dataTransfer.effectAllowed = 'move'})// 阻止拖拽的默认行为list.addEventListener('dragover', function (e) {e.preventDefault()})list.addEventListener("dragenter", function (e) {//拖动API----- 阻止浏览器默认事件,因为会出现元素回到原始自身上的位置e.preventDefault()// 如果拖进的元素是父容器或者他自身则不拖进if (e.target == list || e.target == sourceDiv) {return}const children = [...list.children]const sourceIndex = children.indexOf(sourceDiv)const targetIndex = children.indexOf(e.target)// 上移if (sourceIndex > targetIndex) {list.insertBefore(sourceDiv, e.target)} else {// 下移list.insertBefore(sourceDiv, e.target.nextElementSibling)}})// 拖拽结束后,最后将虚线方框移除list.addEventListener("dragend", function (e) {e.target.classList.remove('move')})</script>
</body></html>

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

201基于matlab的成绩管理系统

基于matlab的成绩管理系统。自带的GUI界面设计了一个成绩管理界面&#xff0c;可进行成绩的载入、查询、绘图、求平均分。可更改自己的数据进行录入。包含作业文档。程序已调通&#xff0c;可直接运行。 201 matlab 成绩管理系统 GUI - 小红书 (xiaohongshu.com)

JAVA面试八股文之集合

JAVA集合相关 集合&#xff1f;说一说Java提供的常见集合&#xff1f;hashmap的key可以为null嘛&#xff1f;hashMap线程是否安全, 如果不安全, 如何解决&#xff1f;HashSet和TreeSet&#xff1f;ArrayList底层是如何实现的&#xff1f;ArrayList listnew ArrayList(10)中的li…

常用的8个应用和中间件的Docker运行示例

文章目录 1、Docker Web 管理工具 portainer2、在线代码编辑器 Code Server3、MySQL4、Redis5、Nginx6、PostgreSQL7、媒体管理工具 Dim8、Gitlab 1、Docker Web 管理工具 portainer Portainer 是一个轻量级的管理 UI &#xff0c;可让你轻松管理不同的 Docker 环境&#xff0…

平台介绍-搭建赛事运营平台(3)

上文介绍了品牌隔离的基本原理&#xff0c;就是通过不同的前端和微服务来实现。但是确实很多功能是类似的&#xff0c;所以从编程角度还是有些管理手段的。 前端部分&#xff1a;前端部分没有什么特别手段&#xff0c;就是两个独立的项目工程&#xff0c;分别维护。相同的部分复…

EfficientSAM 项目排坑

EfficientSAM 项目排坑 任务过程记录创建环境运行示例 任务 跑通这个项目代码 过程记录 创建环境 readme里没有说具体怎么配置环境&#xff0c;所以可能对我来说还挺困难的。 现把项目git下来&#xff1a; git clone https://github.com/yformer/EfficientSAM.git cd Effi…

【超图 SuperMap3D】【基础API使用示例】54、超图SuperMap3D -鼠标左键拖拽绘制圆

前言 引擎下载地址&#xff1a;[添加链接描述](http://support.supermap.com.cn/DownloadCenter/DownloadPage.aspx?id2524) 通过左键按下拖拽的方式在地图上进行贴地的圆绘制 完整代码拷贝直接本地运行即可查看效果效果 核心代码 // 绘制圆形 function startDrawCircleHand…

探析Zoho Projects项目管理系统功能优势

世上万物&#xff0c;都是有难有易&#xff0c;有简单&#xff0c;也有复杂&#xff0c;项目也不例外。面对复杂的项目&#xff0c;应该如何有效管理呢&#xff1f;答案无疑是项目管理系统&#xff0c;项目管理系统有哪些强大的功能&#xff1f;Zoho Projects项目管理系统的功能…

Kafka重要配置参数全面解读(重要)

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Kafka重要配置参数全面解读(重要 前言auto.create.topics.enableauto.leader.rebalance.enablelog.retention.{hour|minutes|ms}offsets.topic.num.partitions 和 offsets.topic.replication.factorlo…

Mapper4一键生成

新建一个Maven工程作为父工程 1、新建一个Maven项目 JDK版本&#xff1a;17 Maven版本&#xff1a;3.6.3 2、总父工程 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"…

免费翻译pdf格式论文

进入谷歌翻译网址https://translate.google.com/?slauto&tlzh-CN&opdocs 将需要全文翻译的pdf放进去 选择英文到中文&#xff0c;然后点击翻译 可以选择打开译文或者下载译文&#xff0c;下载译文会下载到电脑上&#xff0c;打开译文会在浏览器打开。

docker部署ubuntu

仓库&#xff1a; https://hub.docker.com/search?qUbuntu 拉一个Ubuntu镜像 docker pull ubuntu:18.04 查看本地镜像&#xff1a; docker images 运行容器 docker run -itd --name ubuntu-18-001 ubuntu:18.04 通过ps命令可以查看正在运行的容器信息 docker ps 进入容器 最…

Redis中的事件(一)

事件 概述 Redis服务器是一个事件驱动程序:服务器需要处理以下两类事件: 1.文件事件(file event):Redis服务器通过套接字与客户端(或者其他Redis服务器)进行连接&#xff0c;而文件事件就是服务器对套接字操作的抽象。服务器与客户端(或者其他服务器)的通信会产生相应的文件…

【VMware Workstation】公司所有主机和虚拟机ip互通,以及虚拟机目录迁移

文章目录 1、场景2、环境3、实战3.1、所有主机和虚拟机ip互通Stage 1 : 【虚拟机】设置为桥接模式Stage 2 : 【虚拟机】设置ipStage 3 : 【路由器】ARP 静态绑定MACStage 3-1 ping 路由器 ipStage 3-2 【静态绑定】虚拟机查看mac地址Stage 3-3 【静态绑定】路由器ARP 静态绑定 …

Apache HBase(二)

目录 一、Apache HBase 1、HBase Shell操作 1.1、DDL创建修改表格 1、创建命名空间和表格 2、查看表格 3、修改表 4、删除表 1.2、DML写入读取数据 1、写入数据 2、读取数据 3、删除数据 2、大数据软件启动 一、Apache HBase 1、HBase Shell操作 先启动HBase。再…

buy me a btc 使用数字货币进行打赏赞助

最近在调研使用加密货币打赏的平台&#xff0c;发现idatariver平台 https://idatariver.com 推出的buymeabtc功能刚好符合使用场景&#xff0c;下图为平台的演示项目, 演示项目入口 https://buymeabtc.com/idatariver 特点 不少人都听说过buymeacoffee&#xff0c;可以在上面发…

跑通飞浆平台的MTMCT 跨镜跟踪示例

想跑通飞浆平台的MTMCT跨镜跟踪示例&#xff0c;真的是难上加难啊&#xff01; 改了几处代码&#xff0c;可以顺利跑通了&#xff0c;特此记录&#xff1a; 第一处&#xff1a;不要拉主线的代码&#xff0c;改成 !git clone https://gitee.com/paddlepaddle/PaddleDetection…

【1】网络协议基础概念

【1】网络协议基础知识 1、互联网2、为什么要学习网络协议3、学习中需要搭建的环境4、客户端-服务器5、Java 的跨平台原理6、C/C的跨平台原理7、一个简单的SpringBoot项目(1) pom.xml(2) application.yml(3) NetworkStudyApp.java(4) SwaggerConfig.java(5) HelloWorldControll…

PythonGUI应用:模拟航空订票小程序

在本教程中&#xff0c;我们将创建一个基本的航空订票管理系统GUI应用&#xff0c;用户可以通过图形界面执行各种操作。我们将使用Python编程语言和Tkinter库来实现此应用。 功能概述&#xff1a; 航班管理&#xff1a; 用户可以添加新的航班&#xff0c;输入航班号、起始地、目…

x86架构中的寄存器和常用指令

寄存器 这些寄存器可以用于多种操作&#xff0c;如算术运算、数据传输等。在 x86 架构中&#xff0c;这些包括&#xff1a; 通用 这些寄存器可以用于多种操作&#xff0c;如算术运算、数据传输等 AX/EAX/RAX&#xff1a;累加器&#xff0c;用于算术运算。通常用于存储函数调…

Java中有哪些容器(集合类)?

Java中的集合类主要由Collection和Map这两个接口派生而出&#xff0c;其中Collection接口又派生出三个子接 口&#xff0c;分别是Set、List、Queue。所有的Java集合类&#xff0c;都是Set、List、Queue、Map这四个接口的实现 类&#xff0c;这四个接口将集合分成了四大类&#…