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 相关文章推荐
js+CSS 图片等比缩小并垂直居中实现代码
Dec 01 Javascript
CheckBoxList多选样式jquery、C#获取选择项
Sep 06 Javascript
jquery bind(click)传参让列表中每行绑定一个事件
Aug 06 Javascript
javascript实现鼠标拖动改变层大小的方法
Apr 30 Javascript
jQuery Mobile页面返回不需要重新get
Apr 26 Javascript
vue实现todolist单页面应用
Apr 11 Javascript
Angular2实现组件交互的方法分析
Dec 19 Javascript
JavaScript使用prototype原型实现的封装继承多态示例
Aug 31 Javascript
vue+element-ui实现表格编辑的三种实现方式
Oct 31 Javascript
Vue入门学习笔记【基本概念、对象、过滤器、指令等】
Apr 13 Javascript
微信小程序进入广告实现代码实例
Sep 19 Javascript
Vuejs中的watch实例详解(监听者)
Jan 05 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下实现一个阿拉伯数字转中文数字的函数
2008/07/10 PHP
Php获取金书网的书名的实现代码
2010/06/11 PHP
解析yii数据库的增删查改
2013/06/20 PHP
Symfony2安装的方法(2种方法)
2016/02/04 PHP
php array_values 返回数组的值实例详解
2016/11/17 PHP
使用JQuery和s3captche实现一个水果名字的验证
2009/08/14 Javascript
更优雅的事件触发兼容
2011/10/24 Javascript
用js实现小球的自由移动代码
2013/04/22 Javascript
jQuery实现可收缩展开的级联菜单实例代码
2013/11/27 Javascript
js调用打印机打印网页字体总是缩小一号的解决方法
2014/01/24 Javascript
JavaScript学习小结之使用canvas画“哆啦A梦”时钟
2016/07/24 Javascript
基于jQuery和CSS3实现APPLE TV海报视差效果
2017/06/16 jQuery
详解Vue + Vuex 如何使用 vm.$nextTick
2017/11/20 Javascript
细说webpack源码之compile流程-rules参数处理技巧(1)
2017/12/26 Javascript
傻瓜式vuex语法糖kiss-vuex整理
2018/12/21 Javascript
vue组件定义,全局、局部组件,配合模板及动态组件功能示例
2019/03/19 Javascript
[55:25]2018DOTA2亚洲邀请赛3月29日 小组赛A组 VG VS OG
2018/03/30 DOTA
跟老齐学Python之让人欢喜让人忧的迭代
2014/10/02 Python
Windows下Python2与Python3两个版本共存的方法详解
2017/02/12 Python
python3之模块psutil系统性能信息使用
2018/05/30 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
2019/01/26 Python
python批量修改ssh密码的实现
2019/08/08 Python
最新Python idle下载、安装与使用教程图文详解
2020/11/28 Python
python3.9实现pyinstaller打包python文件成exe
2020/12/13 Python
Python 内存管理机制全面分析
2021/01/16 Python
css3的transform中scale缩放详解
2014/12/08 HTML / CSS
HTML利用九宫格原理进行网页布局
2020/03/13 HTML / CSS
Tech21美国/加拿大:英国NO.1防摔保护壳品牌
2018/01/20 全球购物
size?荷兰官方网站:英国高级运动鞋精品店
2020/07/24 全球购物
Lungolivigno Fashion官网:高级时装在线购物
2020/10/17 全球购物
集体婚礼策划方案
2014/02/22 职场文书
2014学年自我鉴定
2014/02/23 职场文书
高校教师岗位职责
2014/03/18 职场文书
邹越演讲观后感
2015/06/15 职场文书
2016年端午节校园广播稿
2015/12/18 职场文书
2019年最新七夕唯美祝福语(60条)
2019/07/22 职场文书