js实现拖拽元素选择和删除


Posted in Javascript onAugust 25, 2020

本文实例为大家分享了js实现拖拽元素选择和删除的具体代码,供大家参考,具体内容如下

我们上网的时候讲过一些平台在选择一些选项的时候采用拖拽的方式将选项拖入指定位置完成选择,现在我们就自己来实现一下类似的效果。

结果如下:

js实现拖拽元素选择和删除

代码如下:

<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8" />
 <title>js置顶动画</title>
 <style>
 *{margin:0;padding:0;user-select:none;}
 .move-box {height:100px;width:100px;line-height:100px;text-align:center;font-size:14px;background:#ccc;margin:0 auto;position:relative;transition:all .1s;}
 .drag-box{width:1000px;margin:100px auto;border:1px dashed #ccc;font-size:0;background:url('./img/bg1.png') no-repeat center;background-size:80px;}
 .drag-box::after{content:'';display:block;clear:both;} /***清浮动***/
 .drag-box .label{height:100px;width:0;color:#fff;line-height:0;text-align:center;font-size:14px;display:inline-block;background:blue;}
 .drag-box .close-btn{padding:2px;margin-left:10px;background:#eee;}
 </style>
</head>
<body>
 <div class="move-box">拖动元素</div>
 <div class="drag-box">
 <div class="label"></div>
 </div>
</body>
<script>
 (function(){
 let boxId = 0; 
 let startX = null;
 let startY = null;
 let mouseX = null;
 let mouseY = null;
 let mBox = null;
 function $$(str) {return document.querySelectorAll(str);}
 // 计算鼠标是否在需要放置的框内
 function computInEle(ele, x, y){
 let left = ele.getBoundingClientRect().left;
 let top = ele.getBoundingClientRect().top;
 let width = ele.getBoundingClientRect().width;
 let height = ele.getBoundingClientRect().height;
 let xFlag = ( x > left && x < (left + width));
 let yFlag = ( y > top && y < (top + height));
 if (xFlag && yFlag) {
 return true;
 } else {
 return false;
 }
 }
 // 删除元素
 $$('.drag-box')[0].onclick = function(e){
 console.log(e);
 if (e.srcElement.className == 'close-btn') {
 this.removeChild(e.srcElement.parentNode);
 setTimeout(() => {
  alert('删除成功!');
 }, 0);
 }
 }
 // 鼠标按下复制一个元素
 $$('.move-box')[0].onmousedown = function(e){
 mouseX = e.pageX;
 mouseY = e.pageY;
 startX = this.getBoundingClientRect().left;
 startY = this.getBoundingClientRect().top;
 console.log(this.getBoundingClientRect());
 // 复制一个元素追加到body模拟跟随鼠标移动效果
 mBox = this.cloneNode(true);
 mBox.style.position = 'fixed';
 mBox.style.zIndex = '9999';
 mBox.style.opacity = '.75';
 mBox.style.left = startX + 'px';
 mBox.style.top = startY + 'px';
 mBox.id = 'moveBox' + (boxId++);
 document.body.appendChild(mBox);
 document.onmousemove = function(e){
 mBox.style.left = startX + (e.pageX - mouseX) + 'px';
 mBox.style.top = startY + (e.pageY - mouseY) + 'px';
 };
 };
 // 鼠标按下放开事件
 document.onmouseup = function(e){
 let x = e.pageX;
 let y = e.pageY;
 let ele = $$('.drag-box')[0];
 console.log(computInEle(ele, x, y));
 if (mBox) {
 // 松开鼠标时鼠标在拖拽框内,则将复制的元素追加到拖拽框内
 if (computInEle(ele, x, y)) {
  mBox.style.position = 'static';
  mBox.style.display = 'block';
  mBox.style.float = 'left';
  mBox.style.margin = 'auto';
  mBox.style.opacity = '1';
  mBox.innerText = mBox.innerText +(boxId - 1);
  let close = document.createElement('span');
  close.className = 'close-btn';
  close.innerText = '×';
  close.title = '删除元素';
  mBox.appendChild(close);
  ele.appendChild(mBox);
  mBox.onmousedown = null;
 } else {
  // 松开鼠标时鼠标不在拖拽框内,移除复制的元素
  mBox.style.left = startX + 'px';
  mBox.style.top = startY + 'px';
  document.body.removeChild(document.body.lastElementChild);
 }
 startX = null;
 startY = null;
 mouseX = null;
 mouseY = null;
 mBox = null;
 document.onmousemove = null;
 }
 };
 })();
</script>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript中把数字转换为字符串的程序代码
Jun 19 Javascript
jquery.cookie实现的客户端购物车操作实例
Dec 24 Javascript
基于canvas实现的绚丽圆圈效果完整实例
Jan 26 Javascript
基于JavaScript代码实现自动生成表格
Jun 15 Javascript
浅谈bootstrap使用中的一些问题以及解决过程
Oct 18 Javascript
Vue数据驱动模拟实现4
Jan 12 Javascript
JavaScript使用原型和原型链实现对象继承的方法详解
Apr 05 Javascript
谈谈React中的Render Props模式
Dec 06 Javascript
详解小程序循环require之坑
Mar 08 Javascript
jQuery实现弹幕特效
Nov 29 jQuery
SpringBoot+Vue 前后端合并部署的配置方法
Dec 30 Vue.js
JavaScript前端面试扁平数据转tree与tree数据扁平化
Jun 14 Javascript
基于vue实现简易打地鼠游戏
Aug 21 #Javascript
vue实现打地鼠小游戏
Aug 21 #Javascript
js实现滑动进度条效果
Aug 21 #Javascript
探索浏览器页面关闭window.close()的使用详解
Aug 21 #Javascript
vue组件开发之tab切换组件使用详解
Aug 21 #Javascript
vue组件开发之slider组件使用详解
Aug 21 #Javascript
Vue左滑组件slider使用详解
Aug 21 #Javascript
You might like
iis下php mail函数的sendmail配置方法(官方推荐)
2012/04/25 PHP
一个用js实现控制台控件的代码
2007/09/04 Javascript
基于Jquery的动态创建DOM元素的代码
2010/12/28 Javascript
javascript闭包传参和事件的循环绑定示例探讨
2014/04/17 Javascript
js检测浏览器版本、核心、是否移动端示例
2014/04/24 Javascript
直接拿来用的15个jQuery代码片段
2015/09/23 Javascript
JS基于Ajax实现的网页Loading效果代码
2015/10/27 Javascript
javascript作用域、作用域链(菜鸟必看)
2016/06/16 Javascript
微信小程序 window_x64环境搭建
2016/09/30 Javascript
Angular 2 ngForm中的ngModel、[ngModel]和[(ngModel)]的写法
2017/06/29 Javascript
jQuery事件_动力节点Java学院整理
2017/07/05 jQuery
react中使用swiper的具体方法
2018/05/15 Javascript
微信小程序实现无限滚动列表
2020/05/29 Javascript
JavaScript常用进制转换及位运算实例解析
2020/10/14 Javascript
Python 命令行参数sys.argv
2008/09/06 Python
Python标准库06之子进程 (subprocess包) 详解
2016/12/07 Python
Python 私有函数的实例详解
2017/09/11 Python
python编程通过蒙特卡洛法计算定积分详解
2017/12/13 Python
python pandas实现excel转为html格式的方法
2018/10/23 Python
python写一个随机点名软件的实例
2019/11/28 Python
python3下pygame如何实现显示中文
2020/01/11 Python
opencv中图像叠加/图像融合/按位操作的实现
2020/04/01 Python
基于Python测试程序是否有错误
2020/05/16 Python
Python flask路由间传递变量实例详解
2020/06/03 Python
Python自带的IDE在哪里
2020/07/01 Python
小米旗下精品生活电商平台:小米有品
2018/12/18 全球购物
娱乐地球:Entertainment Earth
2020/01/08 全球购物
应届生求职信写作技巧
2013/10/24 职场文书
运动会通讯稿300字
2014/02/02 职场文书
创先争优活动方案
2014/02/12 职场文书
公司委托书格式
2014/08/01 职场文书
师范生见习自我总结
2015/06/23 职场文书
一篇文章带你深入了解Mysql触发器
2021/08/02 MySQL
Python 中的 copy()和deepcopy()
2021/11/07 Python
《原神》新角色演示“神里绫人:林隐泓洄” 宠妹狂魔
2022/04/03 其他游戏
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
2022/04/24 Vue.js