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 获取事件对象的注意点
Jul 29 Javascript
Jquery操作Select 简单方便 一个js插件搞定
Nov 12 Javascript
jQuery DOM操作小结与实例
Jan 07 Javascript
javascript基础知识大全 便于大家学习,也便于我自己查看
Aug 17 Javascript
获取非最后一列td值并将title设为该值的方法
Oct 30 Javascript
javascript数组去重方法汇总
Apr 23 Javascript
限制文本框只能输入数字||只能是数字和小数点||只能是整数和浮点数
May 27 Javascript
Bootstrap CSS组件之分页(pagination)和翻页(pager)
Dec 17 Javascript
less简单入门(CSS 预处理语言)
Mar 08 Javascript
jQuery实现select下拉框获取当前选中文本、值、索引
May 08 jQuery
node.js学习之事件模块Events的使用示例
Sep 28 Javascript
微信小程序实现watch监听
Jun 04 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
PHP5中的时间相差8小时的解决办法
2008/03/28 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
PHP pthreads v3下同步处理synchronized用法示例
2020/02/21 PHP
Javascript的IE和Firefox兼容性汇编(zz)
2007/02/02 Javascript
在一个form用一个SUBMIT(或button)分别提交到两个处理表单页面的代码
2007/02/15 Javascript
JS实现仿Windows经典风格的选项卡Tab切换代码
2015/10/20 Javascript
微信小程序 数据交互与渲染实例详解
2017/01/21 Javascript
vue实现点击展开点击收起效果
2018/04/27 Javascript
jQuery轮播图实例详解
2018/08/15 jQuery
详解如何解决Vue和vue-template-compiler版本之间的问题
2018/09/17 Javascript
JavaScript文本特效实例小结【3个示例】
2018/12/22 Javascript
使用Node.js写一个代码生成器的方法步骤
2019/05/10 Javascript
vue项目中引入Sass实例方法
2019/08/27 Javascript
纯JS实现五子棋游戏
2020/05/28 Javascript
[01:35]辉夜杯战队访谈宣传片—iG.V
2015/12/25 DOTA
Python实现图像几何变换
2015/07/06 Python
python进行两个表格对比的方法
2018/06/27 Python
Python While循环语句实例演示及原理解析
2020/01/03 Python
Python Process创建进程的2种方法详解
2021/01/25 Python
CSS3伪类选择器:nth-child()
2009/04/02 HTML / CSS
CSS3 Calc实现滚动条出现页面不跳动问题
2017/09/14 HTML / CSS
德国汽车零件和汽车配件网上商店:kfzteile24
2018/11/14 全球购物
接口的多继承会带来哪些问题
2015/08/17 面试题
恒华伟业笔试面试题
2015/02/26 面试题
请问软件开发中的设计模式你会使用哪些
2015/05/13 面试题
产品销售员岗位职责
2013/12/18 职场文书
员工拾金不昧表扬信
2014/01/09 职场文书
便利店的创业计划书
2014/01/15 职场文书
护士长竞聘演讲稿
2014/04/30 职场文书
学校爱国卫生月活动总结
2014/06/25 职场文书
社团活动总结书
2014/06/27 职场文书
如何写早恋检讨书
2014/09/10 职场文书
个人党性分析材料
2014/12/19 职场文书
小学生差生评语
2014/12/29 职场文书
签订劳动合同通知书
2015/04/16 职场文书
MySQL时间盲注的五种延时方法实现
2021/05/18 MySQL