用html+jq实现元素的拖动效果——js基础积累

html+jq实现元素的拖动效果

效果图如下:
在这里插入图片描述
将【item10】拖动到【item1】前面
在这里插入图片描述
直接上代码:

html部分

<ul id="sortableList"><li id="item1" class="w1" draggable="true">Item 1</li><li id="item2" class="w2" draggable="true">Item 2</li><li id="item3" class="w3" draggable="true">Item 3</li><li id="item4" class="w1" draggable="true">Item 4</li><li id="item5" class="w1" draggable="true">Item 5</li><li id="item6" class="w2" draggable="true">Item 6</li><li id="item7" class="w3" draggable="true">Item 7</li><li id="item8" class="w1" draggable="true">Item 8</li><li id="item9" class="w2" draggable="true">Item 9</li><li id="item10" class="w3" draggable="true">Item 10</li>
</ul>

js部分

 <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script><script>document.addEventListener('DOMContentLoaded', function () {const sortableList = document.getElementById('sortableList');const items = sortableList.querySelectorAll('li');items.forEach((item) => {item.addEventListener('dragstart', dragStart);item.addEventListener('dragover', dragOver);item.addEventListener('drop', drop);item.addEventListener('dragenter', dragEnter);item.addEventListener('dragleave', dragLeave);});function dragStart(e) {e.dataTransfer.setData('text/plain', e.target.id);// setTimeout(() => {//     e.target.classList.add('hide');// }, 0);console.log('Drag started:', e.target.id);}function dragOver(e) {e.preventDefault();e.target.classList.add('over');console.log('Drag over:', e.target.id);}function dragEnter(e) {e.preventDefault();console.log('Drag enter:', e.target.id);}function dragLeave(e) {e.target.classList.remove('over');console.log('Drag leave:', e.target.id);}function drop(e) {e.preventDefault();const draggedItemId = e.dataTransfer.getData('text/plain');const draggedItem = document.getElementById(draggedItemId);const targetItem = e.target;if (targetItem !== draggedItem) {const targetIndex = Array.from(items).indexOf(targetItem);const draggedIndex = Array.from(items).indexOf(draggedItem);if (targetIndex > draggedIndex) {targetItem.parentNode.insertBefore(draggedItem,targetItem.nextSibling);} else {targetItem.parentNode.insertBefore(draggedItem, targetItem);}}e.target.classList.remove('over');draggedItem.classList.remove('hide');console.log('Drop:', e.target.id);console.log('在这里加检查宽度方法');checkWidth();}});// 检查宽度function checkWidth(first = true) {//清空空白块if (first) $('#sortableList li.box').remove();//盒子宽度let boxWidth = document.getElementById('sortableList').offsetWidth;//当前li行的宽度let rowLiWidth = 0;//循环lifor (let i = 0; i < $('#sortableList li').length; i++) {var outerWidthWithMargin = $('#sortableList li').eq(i).outerWidth(true);var itemWidth = parseFloat(outerWidthWithMargin.toFixed(2));console.log(i, rowLiWidth, itemWidth);//当前li行的宽度+当前项宽度let RAW = rowLiWidth + itemWidth;//如果当前li行的宽度+当前项宽度大于盒子宽度,则添加空白块,并重新计算。//3是容错宽度。if (RAW >= boxWidth ||(RAW - boxWidth >= -3 && RAW - boxWidth <= 3)) {//宽度大于盒子宽度,则添加空白块,并重新计算。if (RAW > boxWidth) {let thisWidth = boxWidth - rowLiWidth;if (thisWidth > 3) {$('#sortableList li').eq(i).before(`<li class="box" style="width:${thisWidth}px"></li>`);rowLiWidth = 0; //重新计算。checkWidth(false);break;}}rowLiWidth = 0; //重新计算。} else {rowLiWidth += itemWidth;}if (i == $('#sortableList li').length - 1) {let thisWidth = boxWidth - rowLiWidth;$('#sortableList li').eq(i).after(`<li class="box" style="width:${thisWidth}px"></li>`);break;}}}</script>

css部分

 <style>* {box-sizing: border-box;}#sortableList {list-style-type: none;padding: 0;display: flex;flex-wrap: wrap;position: relative;}#sortableList:after {border-top: none;border-left: none;position: absolute;top: 0;left: 0;width: 100%;height: 100%;z-index: 0;pointer-events: none;}#sortableList:after,#sortableList li:after {content: '';border: 1px solid #eee;position: absolute;top: 0;left: 0;width: 100%;height: 100%;z-index: 0;pointer-events: none;}#sortableList li:after {border-right: none;border-bottom: none;}#sortableList li {padding: 8px;background-color: #fff;cursor: move;position: relative;}#sortableList li.box {background-color: #fff;}#sortableList li.over {border: 2px dashed #000;}#sortableList li.w1 {width: 20%;}#sortableList li.w2 {width: 30%;}#sortableList li.w3 {width: 50%;}#sortableList li.hide {display: none;}</style>

完整版代码如下:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><title>Title</title><style>* {box-sizing: border-box;}#sortableList {list-style-type: none;padding: 0;display: flex;flex-wrap: wrap;position: relative;}#sortableList:after {border-top: none;border-left: none;position: absolute;top: 0;left: 0;width: 100%;height: 100%;z-index: 0;pointer-events: none;}#sortableList:after,#sortableList li:after {content: '';border: 1px solid #eee;position: absolute;top: 0;left: 0;width: 100%;height: 100%;z-index: 0;pointer-events: none;}#sortableList li:after {border-right: none;border-bottom: none;}#sortableList li {padding: 8px;background-color: #fff;cursor: move;position: relative;}#sortableList li.box {background-color: #fff;}#sortableList li.over {border: 2px dashed #000;}#sortableList li.w1 {width: 20%;}#sortableList li.w2 {width: 30%;}#sortableList li.w3 {width: 50%;}#sortableList li.hide {display: none;}</style></head><body><ul id="sortableList"><li id="item1" class="w1" draggable="true">Item 1</li><li id="item2" class="w2" draggable="true">Item 2</li><li id="item3" class="w3" draggable="true">Item 3</li><li id="item4" class="w1" draggable="true">Item 4</li><li id="item5" class="w1" draggable="true">Item 5</li><li id="item6" class="w2" draggable="true">Item 6</li><li id="item7" class="w3" draggable="true">Item 7</li><li id="item8" class="w1" draggable="true">Item 8</li><li id="item9" class="w2" draggable="true">Item 9</li><li id="item10" class="w3" draggable="true">Item 10</li></ul><script src="https://code.jquery.com/jquery-3.6.0.min.js"></script><script>document.addEventListener('DOMContentLoaded', function () {const sortableList = document.getElementById('sortableList');const items = sortableList.querySelectorAll('li');items.forEach((item) => {item.addEventListener('dragstart', dragStart);item.addEventListener('dragover', dragOver);item.addEventListener('drop', drop);item.addEventListener('dragenter', dragEnter);item.addEventListener('dragleave', dragLeave);});function dragStart(e) {e.dataTransfer.setData('text/plain', e.target.id);// setTimeout(() => {//     e.target.classList.add('hide');// }, 0);console.log('Drag started:', e.target.id);}function dragOver(e) {e.preventDefault();e.target.classList.add('over');console.log('Drag over:', e.target.id);}function dragEnter(e) {e.preventDefault();console.log('Drag enter:', e.target.id);}function dragLeave(e) {e.target.classList.remove('over');console.log('Drag leave:', e.target.id);}function drop(e) {e.preventDefault();const draggedItemId = e.dataTransfer.getData('text/plain');const draggedItem = document.getElementById(draggedItemId);const targetItem = e.target;if (targetItem !== draggedItem) {const targetIndex = Array.from(items).indexOf(targetItem);const draggedIndex = Array.from(items).indexOf(draggedItem);if (targetIndex > draggedIndex) {targetItem.parentNode.insertBefore(draggedItem,targetItem.nextSibling);} else {targetItem.parentNode.insertBefore(draggedItem, targetItem);}}e.target.classList.remove('over');draggedItem.classList.remove('hide');console.log('Drop:', e.target.id);console.log('在这里加检查宽度方法');checkWidth();}});// 检查宽度function checkWidth(first = true) {//清空空白块if (first) $('#sortableList li.box').remove();//盒子宽度let boxWidth = document.getElementById('sortableList').offsetWidth;//当前li行的宽度let rowLiWidth = 0;//循环lifor (let i = 0; i < $('#sortableList li').length; i++) {var outerWidthWithMargin = $('#sortableList li').eq(i).outerWidth(true);var itemWidth = parseFloat(outerWidthWithMargin.toFixed(2));console.log(i, rowLiWidth, itemWidth);//当前li行的宽度+当前项宽度let RAW = rowLiWidth + itemWidth;//如果当前li行的宽度+当前项宽度大于盒子宽度,则添加空白块,并重新计算。//3是容错宽度。if (RAW >= boxWidth ||(RAW - boxWidth >= -3 && RAW - boxWidth <= 3)) {//宽度大于盒子宽度,则添加空白块,并重新计算。if (RAW > boxWidth) {let thisWidth = boxWidth - rowLiWidth;if (thisWidth > 3) {$('#sortableList li').eq(i).before(`<li class="box" style="width:${thisWidth}px"></li>`);rowLiWidth = 0; //重新计算。checkWidth(false);break;}}rowLiWidth = 0; //重新计算。} else {rowLiWidth += itemWidth;}if (i == $('#sortableList li').length - 1) {let thisWidth = boxWidth - rowLiWidth;$('#sortableList li').eq(i).after(`<li class="box" style="width:${thisWidth}px"></li>`);break;}}}</script></body>
</html>

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

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

相关文章

单片机学习笔记 12. 定时/计数器_定时

更多单片机学习笔记&#xff1a;单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘单片机学习笔记 8…

【后端开发】Go语言编程实践,Goroutines和Channels,基于共享变量的并发,反射与底层编程

【后端开发】Go语言编程实践&#xff0c;Goroutines和Channels&#xff0c;基于共享变量的并发&#xff0c;反射与底层编程 【后端开发】Go语言高级编程&#xff0c;CGO、Go汇编语言、RPC实现、Web框架实现、分布式系统 文章目录 1、并发基础, Goroutines和Channels2、基于共享…

人机交互革命,为智能座舱市场激战注入一针「催化剂」

从AIGC到AGI赋能&#xff0c;智能座舱人机交互体验迎来新范式。 不断训练、迭代的大模型&#xff0c;为智能座舱带来了更全面的感知能力、更准确的认知理解&#xff0c;以及更丰富的交互模态&#xff0c;显著提升了其智能化水平。 “AI大模型的快速应用与迭代&#xff0c;推动…

计算机视觉硬件知识点整理六:工业相机选型

文章目录 前言一、工业数字相机的分类二、相机的主要参数三、工业数字摄像机主要接口类型四、选择工业相机的考量因素六、实例分析 前言 随着科技的不断进步&#xff0c;工业自动化领域正经历着前所未有的变革。作为工业自动化的重要组成部分&#xff0c;工业相机在工业检测、…

如何使用brew安装phpredis扩展?

如何使用brew安装phpredis扩展&#xff1f; phpredis扩展是一个用于PHP语言的Redis客户端扩展&#xff0c;它提供了一组PHP函数&#xff0c;用于与Redis服务器进行交互。 1、cd到php某一版本的bin下 /usr/local/opt/php8.1/bin 2、下载 phpredis git clone https://githu…

硬件看门狗工作原理

硬件看门狗是什么&#xff1f; 硬件看门狗&#xff08;Hardware Watchdog&#xff09;是一种用于监控系统运行状态的硬件设备或电路。它的主要功能是检测系统是否正常运行&#xff0c;并在系统出现故障或无响应时自动重启或采取其他恢复措施。 工作原理与引脚 硬件看门狗一般…

神经网络中的优化方法(一)

目录 1. 与纯优化的区别1.1 经验风险最小化1.2 代理损失函数1.3 批量算法和小批量算法 2. 神经网络中优化的挑战2.1 病态2.2 局部极小值2.3 高原、鞍点和其他平坦区域2.4 悬崖和梯度爆炸2.5 长期依赖2.6 非精确梯度2.7 局部和全局结构间的弱对应 3. 基本算法3.1 随机梯度下降(小…

海康gige工业相机无驱动取像突破(c#实现,最后更新,你也可以移植到linux下去用)

买了3个海康的相机&#xff0c;最初测试成功的是500万相机。 然后写了一个通用版&#xff0c;害怕有问题&#xff0c;又买了600万的相机&#xff0c;测试果然不及格&#xff0c;花了九牛二虎之力找到一个小问题&#xff0c;就这个 if (changdu > 1000)&#xff1b; 最后又…

Linux -初识 与基础指令1

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【Linux】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 文章目录 &#x1f4da; 前言&#x1f5a5;️ 初识&#x1f510; 登录 root用户&#x1f465; 两种用户➕ 添加用户&#x1f9d1;‍&#x1f4bb; 登录 普通用户⚙️ 常见…

Elasticsearch在liunx 中单机部署

下载配置 1、下载 官网下载地址 2、上传解压 tar -zxvf elasticsearch-XXX.tar.gz 3、新建组和用户 &#xff08;elasticsearch 默认不允许root账户&#xff09; #创建组 es groupadd es #新建用户 useradd ryzhang -g es 4、更改文件夹的用户权限 chown -R ryzhang …

Refit 使用详解

Git官网&#xff1a;https://github.com/reactiveui/refit Refit 是一个针对 .NET 应用程序的 REST API 客户端库&#xff0c;它通过接口定义 API 调用&#xff0c;从而简化与 RESTful 服务的交互。其核心理念是利用声明性编程的方式来创建 HttpClient 客户端&#xff0c;使得…

《山海经》:北山

《山海经》&#xff1a;北山 北山一经单狐山求如山&#xff08;水马&#xff1a;形状与马相似&#xff0c;滑鱼&#xff1a;背部红色&#xff09;带山&#xff08;䑏疏&#xff1a;似马&#xff0c;一只角&#xff0c;鵸鵌&#xff1a;状乌鸦五彩斑斓&#xff0c;儵鱼&#xff…

使用gemini-1.5-pro-002做视频检测

使用Google Cloud Video Intelligence API做视频检测最大的缺陷是无法自定义规则&#xff0c;若使用gemini-1.5-pro-002多模拟模型&#xff0c;则可以自定义检测的规则&#xff0c;具有更好的灵活性。 安装SDK pip install --upgrade google-cloud-aiplatform gcloud auth ap…

动态规划——子序列问题

文章目录 目录 文章目录 前言 一、动态规划思路简介 二、具体实现 1. 字符串问题 1.1 最长公共字符串 1.2.0 最长回文子串 1.2.1 最长回文子序列 2.编辑距离问题 2.1 判断子序列 2.2 编辑距离 总结 前言 上文提到动态规划的背包问题&#xff0c;本文继续介绍动态…

Ubuntu24.04配置DINO-Tracker

一、引言 记录 Ubuntu 配置的第一个代码过程 二、更改conda虚拟环境的默认安装路径 鉴于不久前由于磁盘空间不足引发的重装系统的惨痛经历&#xff0c;在新系统装好后当然要先更改虚拟环境的默认安装路径。 输入指令&#xff1a; conda info可能因为我原本就没有把 Anacod…

vulnhub靶场【哈利波特】三部曲之Aragog

前言 使用virtual box虚拟机 靶机&#xff1a;Aragog : 192.168.1.101 攻击&#xff1a;kali : 192.168.1.16 主机发现 使用arp-scan -l扫描&#xff0c;在同一虚拟网卡下 信息收集 使用nmap扫描 发现22端口SSH服务&#xff0c;openssh 80端口HTTP服务&#xff0c;Apach…

顶刊算法 | 鱼鹰算法OOA-BiTCN-BiGRU-Attention多输入单输出回归预测(Maltab)

顶刊算法 | 鱼鹰算法OOA-BiTCN-BiGRU-Attention多输入单输出回归预测&#xff08;Maltab&#xff09; 目录 顶刊算法 | 鱼鹰算法OOA-BiTCN-BiGRU-Attention多输入单输出回归预测&#xff08;Maltab&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实…

getchar()

getchar():从计算机终端&#xff08;一般是键盘&#xff09;输入一个字符 1、getchar返回的是字符的ASCII码值&#xff08;整数&#xff09;。 2、getchar在读取结束或者失败的时候&#xff0c;会返回EOF 输入密码并确认&#xff1a; scanf读取\n之前的内容即12345678 回车符…

动态规划-----路径问题

动态规划-----路径问题 下降最小路径和1&#xff1a;状态表示2&#xff1a;状态转移方程3 初始化4 填表顺序5 返回值6 代码实现 总结&#xff1a; 下降最小路径和 1&#xff1a;状态表示 假设&#xff1a;用dp[i][j]表示&#xff1a;到达[i,j]的最小路径 2&#xff1a;状态转…

网络安全防护指南

网络安全防护指南 网络安全是指保护网络系统中的硬件、软件及数据不受偶然或恶意原因而遭到破坏、更改或泄露&#xff0c;确保网络系统连续可靠地正常运行。随着互联网的普及和技术的发展&#xff0c;网络安全问题日益严峻&#xff0c;对个人、企业和国家都构成了巨大威胁。因…