当前位置: 首页 > news >正文

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

代码展示如下:

<!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 = datathis.box = boxthis.showResBox = showResBoxthis.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 = thisswitch (e.type) {case 'dragstart':if (e.target.className=="item") {that.sourceElem = e.target}returncase 'dragover':e.preventDefault()if (e.target.className=="item") {that.targetElem = e.target}returncase '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 = nullthis.sourceElem = nullthis.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.lryc.cn/news/357040.html

相关文章:

  • 以果决其行,只为文化的传承
  • Flutter 中的 SizedOverflowBox 小部件:全面指南
  • 图像视频智能抹除修复解决方案,适应性强,应用广泛
  • 20240521(代码整洁和测试入门学习)
  • git中忽略文件的配置
  • 如何进行前端职业规划
  • GD32F103系列单片机片上FLASH和ARM介绍
  • Ansible自动化运维中的Setup收集模块应用详解
  • 再次学习History.scrollRestoration
  • python PyQt5 数字时钟程序
  • 骨传导耳机哪个品牌值得入手?精选五大不容错过的王者品牌推荐!
  • Vue.js|项目安装
  • 多线程新手村4--定时器
  • 如何衡量安全阀检测的价格与价值?一文揭晓答案
  • Sectigo证书介绍以及申请流程
  • 网络安全-钓鱼篇-利用cs进行钓鱼
  • 机器学习-6-对随机梯度下降算法SGD的理解
  • windows 11 精简版下载
  • rpm与yum扩展、命令
  • SpringBoot实现接口防抖的几种方案,杜绝重复提交
  • 了解VS安全编译选项GS
  • python 垃圾回收机制
  • 深度学习设计模式之组合模式
  • C++ 网络编程
  • 服务案例|网络攻击事件的排查与修复
  • 如何使用宝塔面板搭建Tipask问答社区网站并发布公网远程访问
  • Git学习和使用指南简单篇
  • HTTPS单双向认证流程详解与联想
  • 防止浏览器缓存了静态的配置等文件(例如外部的config.js 等文件)
  • 【Umi】umi-max 中使用 Dva