一篇文带你使用js实现拖拽排序

先介绍一下html5的drag属性,拖放(Drag 和 drop)是 HTML5 标准的组成部分。想要启用drag,只要给元素加上draggable="true"就行了(Safari 5.1.2除外)。
  实际效果:

拖动事件(了解事件详情)
  事件分为两类,当前拖动的元素上的事件,以及要放置的位置接收到的事件。
  一.发生在拖动元素上的事件:

事件名 触发时机 触发次数
dragstart 当拖动开始时触发一次 1
drag 拖动开始后反复触发 n
dragend 拖动结束后触发一次

 

二.发生在目标元素上的事件

事件名 触发时机 触发次数
dragenter 当拖动元素进入目标时触发一次 1
dragover 当拖动元素在目标元素范围内时反复触发 n
drop 拖动元素在目标元素内释放时(在设置了dropover事件的前提下) 1

  信息传递

在拖动元素时可以设置传递的信息
event.dataTransfer.setData(“te”, “sss);
两个参数,第一个参数key,第二个参数value。
注意只能传递字符串和url,但是在firefox使用text或Text作为key时会打开新的标签页,所以不要用他们作为key。


<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>*{list-style: none;margin: 0;padding: 0;}#container{width: 500px;margin: 100px auto;}.ele {width:100%;height: 40px;border: 1px solid #999;background: cadetblue;margin-top: 2px;border-radius: 10px;padding-left: 10px;color: white;cursor: move;}</style>
</head>
<body>
<ul id="container"><li class="ele" draggable="true">1</li><li class="ele" draggable="true">2</li><li class="ele" draggable="true">3</li><li class="ele" draggable="true">4</li>
</ul>
<script>var node = document.querySelector("#container");var draging = null;//使用事件委托,将li的事件委托给ulnode.ondragstart = function(event) {//console.log("start");//firefox设置了setData后元素才能拖动!!!!//event.target出发事件的元素event.dataTransfer.setData("te", event.target.innerText); //不能使用text,firefox会打开新tab//event.dataTransfer.setData("self", event.target);draging = event.target;}node.ondragover = function(event) {//console.log("onDrop over");//取消默认行为event.preventDefault();var target = event.target;//因为dragover会发生在ul上,所以要判断是不是liif (target.nodeName === "LI") {if (target !== draging) {//getBoundingClientRect()用于获取某个元素相对于视窗的位置集合var targetRect = target.getBoundingClientRect();var dragingRect = draging.getBoundingClientRect();if (target) {if (target.animated) {return;}}if (_index(draging) < _index(target)) {//nextSibling 属性可返回某个元素之后紧跟的节点(处于同一树层级中)。target.parentNode.insertBefore(draging, target.nextSibling);} else {target.parentNode.insertBefore(draging, target);}_animate(dragingRect, draging);_animate(targetRect, target);}}}//获取元素在父元素中的indexfunction _index(el) {var index = 0;if (!el || !el.parentNode) {return -1;}//previousElementSibling属性返回指定元素的前一个兄弟元素(相同节点树层中的前一个元素节点)。while (el && (el = el.previousElementSibling)) {//console.log(el);index++;}return index;}function _animate(prevRect, target) {var ms = 300;if (ms) {var currentRect = target.getBoundingClientRect();//nodeType 属性返回以数字值返回指定节点的节点类型。1=元素节点  2=属性节点if (prevRect.nodeType === 1) {prevRect = prevRect.getBoundingClientRect();}_css(target, 'transition', 'none');_css(target, 'transform', 'translate3d(' +(prevRect.left - currentRect.left) + 'px,' +(prevRect.top - currentRect.top) + 'px,0)');target.offsetWidth; // 触发重绘//放在timeout里面也可以// setTimeout(function() {//     _css(target, 'transition', 'all ' + ms + 'ms');//     _css(target, 'transform', 'translate3d(0,0,0)');// }, 0);_css(target, 'transition', 'all ' + ms + 'ms');_css(target, 'transform', 'translate3d(0,0,0)');clearTimeout(target.animated);target.animated = setTimeout(function() {_css(target, 'transition', '');_css(target, 'transform', '');target.animated = false;}, ms);}}//给元素添加stylefunction _css(el, prop, val) {var style = el && el.style;if (style) {if (val === void 0) {//使用DefaultView属性可以指定打开窗体时所用的视图if (document.defaultView && document.defaultView.getComputedStyle) {val = document.defaultView.getComputedStyle(el, '');} else if (el.currentStyle) {val = el.currentStyle;}return prop === void 0 ? val : val[prop];} else {if (!(prop in style)) {prop = '-webkit-' + prop;}style[prop] = val + (typeof val === 'string' ? '' : 'px');}}}
</script>
</body>
</html>

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

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

相关文章

Node.js 模块化

一、介绍 1.1 什么是模块化与模块 ? 将一个复杂的程序文件依据一定规则&#xff08;规范&#xff09;拆分成多个文件的过程称之为 模块化 其中拆分出的 每个文件就是一个模块 &#xff0c;模块的内部数据是私有的&#xff0c;不过模块可以暴露内部数据以便其他 模块使用 1…

股票市场

&#xff08;一&#xff09;股票市场 顾名思义&#xff0c;就是买卖股票的场所。就是为了撮合想发展但缺钱的企业与有钱但想投资的投资者。 股票市场按照交易场所&#xff0c;可分为场内市场和场外市场&#xff1a; 场内市场是指证券交易所&#xff0c; 场外市场就是证券交易…

【Linux】Linux环境基础开发工具使用

上篇博客我们学习了Linux权限相关知识&#xff0c;那么这节课我们来学习一下Linux环境基础开发工具使用吧~&#xff0c;主要包括yum、vim、gcc/g的使用&#xff0c;以及Linux项目自动化构建工具。 目录 Linux软件包管理器--yum yum是什么 yum相关操作 yum本地配置 Linux编…

蓝桥杯-循环节长度

两个整数做除法&#xff0c;有时会产生循环小数&#xff0c;其循环部分称为: 循环节。比如&#xff0c;11/136>0.8461553846153..... 其循环节为[846153] 共有 6 位。下面的方法&#xff0c;可以求出循环节的长度。请仔细阅读代码&#xff0c;并填写划线部分缺少的代码。 注…

redis—Zset有序集合

目录 前言 1.常见命令 2.使用场景 3.渐进式遍历 4.数据库管理 前言 有序集合相对于字符串、列表、哈希、集合来说会有一-些陌生。它保留了集合不能有重复成员的 特点&#xff0c;但与集合不同的是&#xff0c;有序集合中的每个元素都有-个唯- -的浮 点类型的分数(score) …

20240126收获

el-table比较常见的需要跳转column的场景&#xff0c;目前遇到三种&#xff0c;一种是前面列变成序号&#xff0c;用的是typeindex和&#xff1a;index来设置索引&#xff0c;第二种是变成多选&#xff0c;用的是typeselect和在table上加上select-change事件&#xff0c;第三种…

故障脚本的重要作用:预防、诊断与恢复

故障脚本是在信息技术和计算机领域中广泛使用的一种自动化工具&#xff0c;它们的主要目的是预测、诊断和修复系统或软件中的故障。这些脚本在现代技术环境中扮演着至关重要的角色&#xff0c;本文将介绍故障脚本的主要作用。 一、预防性作用 监控和预警 故障脚本可以用于监控系…

web应用课——(第一讲:html基础标签)

目录 一、html文件结构 二、文本标签 三、图片 四、音频和视频 五、超链接 六、表单 七、列表 八、表格 九、语义标签 十、特殊符号 一、html文件结构 <html>标签&#xff1a;表示一个 HTML 文档的根&#xff08;顶级元素&#xff09;&#xff0c;所以它也被…

vue3-hand-mobile

当我写完手势移动事件后&#xff0c;我又通过svg的方法添加了一段文字和polygon。当我在这个蓝色的polygon上滑动手势的时候&#xff0c;会报错。 可能这个bug只是我个人的代码导致的。但是我觉得vue3-hand-mobile插件的这一段代码写的有问题。 我通过circular-json库修复了这…

在Windows中如何格式化硬盘?这里提供了详细的步骤

格式化硬盘意味着擦除硬盘上的任何信息和设置文件系统,以便操作系统可以从硬盘读取数据并将数据写入硬盘。如果你计划在Windows中使用硬盘,则需要格式化硬盘。 如何在Windows中格式化硬盘 按照以下简单步骤在Windows 11,Windows 10,Windows 8,Windows 7,Windows Vista或…

3d模型上的材质怎么删除---模大狮模型网

在大多数3D软件中&#xff0c;可以通过以下步骤来删除3D模型上的材质&#xff1a; 选择要删除材质的模型&#xff1a;首先&#xff0c;从场景中选择包含目标材质的模型。可以使用选择工具或按名称查找模型。 进入编辑模式&#xff1a;将模型切换到编辑模式。这通常需要选择相应…

私有化部署pdf工具箱

功能简介 用于合并/拆分/旋转/移动PDF及其页面的完全交互式GUI。 将多个 PDF 合并到一个生成的文件中。 将 PDF 拆分为多个文件&#xff0c;并按指定的页码或将所有页面提取为单个文件。 将 PDF 页面重新组织为不同的顺序。 以 90 度为增量旋转 PDF。 删除页面。 多页布局…

专业143总分420+复旦大学957信号与系统考研经验电子信息与通信工程

本人本科排名中流211院校报考复旦。今年考研成绩出来&#xff0c;专业课143&#xff0c;符合自己预估&#xff0c;数学有点拉胯&#xff0c;英语有点超预期&#xff0c;政治正常&#xff0c;总分420&#xff0c;顺利考上复旦大学电子信息&#xff0c;以下总结一些自己去年的复习…

张维迎《博弈与社会》纳什均衡与囚徒困境博弈(3)理性共识的问题

理性人不选择坏战略 上一节&#xff0c;我们借助囚徒困境博弈阐述了什么是占优均衡。在囚徒困境中&#xff0c;无论别人采取什么行动&#xff0c;每一个参与人都有一个特定的最优选择&#xff08;占优战略&#xff09;。也就是说&#xff0c;一个理性的参与人在做决策时&#x…

腾讯云轻量应用Ubuntu服务器如何一键部署幻兽帕鲁Palworld私服?

幻兽帕鲁/Palworld是一款2024年Pocketpair开发的开放世界生存制作游戏&#xff0c;在帕鲁的世界&#xff0c;玩家可以选择与神奇的生物“帕鲁”一同享受悠闲的生活&#xff0c;也可以投身于与偷猎者进行生死搏斗的冒险。而帕鲁可以进行战斗、繁殖、协助玩家做农活&#xff0c;也…

SAC(Soft Actor-Critic)理论与代码解释

标题 理论序言基础Q值与V值算法区别 SAC概念Q函数与V函数最大化熵强化学习&#xff08;Maximum Entropy Reinforcement Learning, MERL&#xff09;算法流程1个actor&#xff0c;4个Q Critic1个actor&#xff0c;2个V Critic&#xff0c;2个Q Critic 代码详解Actor网络理论中的…

Opencv——霍夫变换

霍夫直线变换 霍夫直线变换(Hough Line Transform)用来做直线检测 为了加升大家对霍夫直线的理解,我在左图左上角大了一个点,然后在右图中绘制出来经过这点可能的所有直线 绘制经过某点的所有直线的示例代码如下,这个代码可以直接拷贝运行 import cv2 as cv import matplot…

基于JavaWeb开发的服装网上商城系统【附源码】

基于JavaWeb开发的服装网上商城系统【附源码】 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 &#…

如何优化博客的内容和用户体验

在当今数字时代&#xff0c;博客成为了分享知识、展示个人专业能力和吸引读者的重要工具。然而&#xff0c;随着越来越多的博客涌现&#xff0c;如何优化博客的内容和用户体验成为了一个关键的问题。本文将为你提供一些有效的技巧&#xff0c;帮助你优化博客的内容和提升用户体…

Phoncent博客,探索Rie Kudan的GPT创作之举

近日&#xff0c;大家都在谈论日本作家Rie Kudan&#xff0c;她凭借其小说《东京共鸣塔》&#xff08;"Tokyo-to Dojo-to"&#xff09;荣获了日本极具声望的芥川奖。这本小说引起了广泛的讨论和思考&#xff0c;因为令人惊讶的是&#xff0c;Kudan在其中直接引用了人…