如何用JS制作元素拖动占位的功能,过程及代码是什么
Admin 2022-06-20 群英技术资讯 261 次浏览
这篇博客,是博主这几天刚做的一个项目遇到的一个难点,学会了这个,你就能轻松实现页面元素的移动啦,再配合一些条件,就可以做出一个任务完成进度的页面了!
先来看看效果:
拖动元素从一个板块移动到另一个板块的某个位置, 博主根据自己的需求做的这个是点击的元素 只能移动到它所在模块的下一个模块,如果移动到别的模块就会回到原来位置,而且当你拖动的 元素位置没有超过某个距离也会自动弹回到原来位置
关键一步就在于!当你鼠标按下的时候,不仅要获取到当前的元素还要获取到当前所在的模块(所以在一开始就要先给每个模块设置一个index属性,属性值就是每个模块本身的索引号),这一步是为了当鼠标放开的时候进行判断所要移动到的模块是否是当前模块的下一个模块(可能有点绕,仔细读仔细品),如果条件成立,那么就要开始和所要移动到的模块中的元素一一比较位置了(这里是为了确定元素要移动到的具体位置),确定好后就要在具体位置新建一个空的元素,把移动元素的内容添加到这个空的元素中,最后最后一步!不要忘记把原先的那个元素移除噢~
代码呈现:
<!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> <script src="./js/jQuery.min.js"></script> <style> * { margin: 0; left: 0; list-style: none; box-sizing: border-box; } .container { display: flex; justify-content: space-around; width: 1000px; height: 600px; margin: 100px auto; padding: 0; } .container li { width: 180px; height: 100%; background-color: plum; border-radius: 10px; padding: 5px; } .item { width: 170px; height: 100px; background-color: salmon; margin: 5px 0; border-radius: 10px; cursor: pointer; } </style> </head> <body> <ul class="container"> <li> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> </li> <li> <div class="item">4</div> <div class="item">5</div> <div class="item">6</div> </li> <li> <div class="item">7</div> <div class="item">8</div> <div class="item">9</div> </li> <li></li> <li></li> </ul> <script> $(function(){ for (var i = 0; i < 5; i++) { $(".container li")[i].setAttribute('index', i); } $('.item').on('mousedown',function(e){ var index = Number($(this).parent()[0].getAttribute('index')); //获取当前所选任务的左边距和上边距 startLeft = $(this).offset().left; startTop = $(this).offset().top; //求鼠标在所选任务里的位置 mouseX = e.pageX - startLeft; mouseY = e.pageY - startTop; $(this).on('mousemove',function(e){ $(this).offset({ left: e.pageX - mouseX, top: e.pageY - mouseY }) }) $(this).on('mouseup',function(){ //用来记录item移动到那个位置 k = -1; $(this).off('mousemove'); //获取所选 模块 的下一个 模块索引 if (index >= 4) { index = 3; } var next = $('.container li').eq(index + 1); //如果鼠标放开时,所移动到的距离正好位于所选模块的下一个模块的区间内,就执行 if ($(this).offset().left >= next.offset().left&&$(this).offset().left <= next.offset().left + next[0].offsetWidth) { //获取到所选的item中的内容 var text = $(this).html(); //在最终所要放置的位置新建一个空任务,再把所获取到的内容添加进去 var father = document.createElement('div'); father.className = 'item'; $(father).append(text); //把点击的当前元素获取过来 var ele = $(this); //如果当前模块没有item,则直接添加到第一个位置,如果有,则比较看它的top比哪个 大就放在哪个的后面 if (next.children().length == 0) { next.append(father); } else { $.each(next.children(), function (i,item) { if ( ele.offset().top > $(item).offset().top) { k = i; } }) //如果 k == -1 说明 要把任务放在该模块的第一个位置 if (k == -1) { next.children().eq(0).before(father); } else { next.children().eq(k).after(father); } } //解绑移动事件,清空原来位置的item $(this).off("mousemove"); $(this).remove(); $(this).empty(); } else { //这里就是移动不成功,回到原来位置 $(this).offset({ left: startLeft, top: startTop }) $(this).off("mousemove"); } }) }) }) </script> </body> </html>
这个案例再结合后台数据,就可以实现多个任务不同进度的显示和拖动效果了,如下图所示:
还不快快卷起来~
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
本文将深入 Node 异步和事件循环的底层实现和执行机制。聊聊Node 为什么要使用异步来作为核心编程模型呢?如何实现异步?以及基于事件循环的异步编程模型。
这篇文章主要介绍了一文让你快速了解JavaScript栈,栈全称为堆栈,是一种先进后出的的数据结构,栈中只有两种基本操作,也就是插入和删除,也就是入栈和出栈操作,栈只有一端可以进行入栈和出栈操作,我们将其称为栈顶,另一端称其为栈底
这篇文章主要介绍了学习 Vue.js 遇到的那些坑,帮助大家更好的理解和使用vue框架,感兴趣的朋友可以了解下
这篇文章主要给大家介绍了关于require加载器实现原理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
微信小程序自定义导航的方法 本文实例为大家分享了微信小程序自定义导航的具体代码,供大家参考,具体内容如下 在app.js中获取状态栏信息和胶囊按钮信息 onLaunch() { // 展示本地存储能力 const logs = wx.getStorageSync('logs') || [] logs.unshift(Date.now()) wx.setStorageSync('logs', logs) // 获取系统信息 this.globalData.systemInfo
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008