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 相关文章推荐
层序遍历在ExtJs的TreePanel中的应用
Oct 16 Javascript
jquery 实现密码框的显示与隐藏示例代码
Sep 18 Javascript
Express.JS使用详解
Jul 17 Javascript
12种JavaScript常用的MVC框架比较分析
Nov 16 Javascript
JS获取鼠标相对位置的方法
Sep 20 Javascript
Angular4如何自定义首屏的加载动画详解
Jul 26 Javascript
Angular4学习教程之HTML属性绑定的方法
Jan 04 Javascript
vue2.0移动端滑动事件vue-touch的实例代码
Nov 27 Javascript
Vue 动态组件与 v-once 指令的实现
Feb 12 Javascript
微信小程序如何实现五星评价功能
Oct 15 Javascript
JavaScript实现省市区三级联动
Feb 13 Javascript
在vue项目中引用Antv G2,以饼图为例讲解
Oct 28 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
PHP实现函数内修改外部变量值的方法示例
2018/12/28 PHP
PHP 图片处理
2020/09/16 PHP
Domino中运用jQuery读取视图内容的方法
2009/10/21 Javascript
javascript学习笔记(六) Date 日期类型
2012/06/19 Javascript
javascript常见操作汇总
2014/09/03 Javascript
JS对象与json字符串格式转换实例
2014/10/28 Javascript
Javascript实现快速排序(Quicksort)的算法详解
2015/09/06 Javascript
jQuery实现仿百度首页滑动伸缩展开的添加服务效果代码
2015/09/09 Javascript
js实现表单提交后不重新刷新当前页面
2016/11/30 Javascript
js鼠标跟随运动效果
2017/03/11 Javascript
Vue自定义指令使用方法详解
2017/08/21 Javascript
jquery实现动态添加附件功能
2018/10/23 jQuery
微信小程序左滑删除功能开发案例详解
2018/11/12 Javascript
浅谈在Vue.js中如何实现时间转换指令
2019/01/06 Javascript
[10:21]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster 选手采访
2021/03/11 DOTA
Python 26进制计算实现方法
2015/05/28 Python
Django学习笔记之Class-Based-View
2017/02/15 Python
Python编程对列表中字典元素进行排序的方法详解
2017/05/26 Python
numpy自动生成数组详解
2017/12/15 Python
实例讲解python中的协程
2018/10/08 Python
Python随机生成身份证号码及校验功能
2018/12/04 Python
用Python PIL实现几个简单的图片特效
2019/01/18 Python
Django 重写用户模型的实现
2019/07/29 Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
2019/08/23 Python
python通过文本在一个图中画多条线的实例
2020/02/21 Python
CSS3基础(RGBa、text-shadow、box-shadow、border-radius)
2012/11/13 HTML / CSS
html5中svg canvas和图片之间相互转化思路代码
2014/01/24 HTML / CSS
英国知名奢侈品包包品牌:Milli Millu
2016/12/22 全球购物
中层干部岗位职责
2013/12/18 职场文书
家长会演讲稿范文
2014/01/10 职场文书
教学改革实施方案
2014/03/31 职场文书
会员卡清退活动总结
2014/08/27 职场文书
七年级地理教学计划
2015/01/22 职场文书
通知的格式范文
2015/04/27 职场文书
2015年敬老院工作总结
2015/05/18 职场文书
解决jupyter notebook启动后没有token的坑
2021/04/24 Python