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 相关文章推荐
jQuery+CSS 实现的超Sexy下拉菜单
Jan 17 Javascript
jquery 页面全选框实践代码
Apr 02 Javascript
用jquery生成二级菜单的实例代码
Jun 24 Javascript
PHP实现的各种中文编码转换类分享
Jan 23 Javascript
javascript中replace( )方法的使用
Apr 24 Javascript
javascript多行字符串的简单实现方式
May 04 Javascript
手把手教你搭建ES6的开发运行环境
Jul 11 Javascript
jQuery EasyUI开发技巧总结
Sep 26 jQuery
原生js封装运动框架的示例讲解
Oct 01 Javascript
bootstrap-Treeview实现级联勾选
Nov 23 Javascript
bootstrap datetimepicker控件位置异常的解决方法
Nov 23 Javascript
利用vue3+ts实现管理后台(增删改查)
Oct 30 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中的strpos使用示例
2014/02/27 PHP
Codeigniter校验ip地址的方法
2015/03/21 PHP
PHP数组操作――获取数组最后一个值的方法
2015/04/14 PHP
php 无限分类 树形数据格式化代码
2016/10/11 PHP
Yii2-GridView 中让关联字段带搜索和排序功能示例
2017/01/21 PHP
input、button的不同type值在ajax提交表单时导致的陷阱
2009/02/24 Javascript
Jquery使用Firefox FireBug插件调试Ajax步骤讲解
2013/12/02 Javascript
jQuery中[attribute*=value]选择器用法实例
2014/12/31 Javascript
分享一则javascript 调试技巧
2015/01/02 Javascript
js分页工具实例
2015/01/28 Javascript
jQuery弹出框代码封装DialogHelper
2015/01/30 Javascript
浅谈$(document)和$(window)的区别
2015/07/15 Javascript
jQuery实现的Tab滑动选项卡及图片切换(多种效果)小结
2015/09/14 Javascript
浅谈JavaScript 数据属性和访问器属性
2016/09/01 Javascript
jquery获取点击控件的绝对位置简单实例
2016/10/13 Javascript
基于jQuery的checkbox全选问题分析
2016/11/18 Javascript
Angular 作用域scope的具体使用
2017/12/11 Javascript
JS使用数组实现的队列功能示例
2019/03/04 Javascript
Python中map,reduce,filter和sorted函数的使用方法
2015/08/17 Python
用Python编写简单的微博爬虫
2016/03/04 Python
python 采集中文乱码问题的完美解决方法
2016/09/27 Python
python通过ffmgep从视频中抽帧的方法
2018/12/05 Python
对python3 Serial 串口助手的接收读取数据方法详解
2019/06/12 Python
centos7之Python3.74安装教程
2019/08/15 Python
opencv 实现特定颜色线条提取与定位操作
2020/06/02 Python
利用canvas实现图片压缩的示例代码
2018/07/17 HTML / CSS
东南亚地区最大的购物网站Lazada新加坡站点:Lazada.sg
2016/07/17 全球购物
纽约的奢华内衣店:Journelle
2016/07/29 全球购物
联想西班牙官网:Lenovo西班牙
2018/08/28 全球购物
师范生实习个人的自我评价
2013/09/28 职场文书
小学优秀辅导员事迹材料
2014/05/11 职场文书
文员岗位职责范本
2015/04/16 职场文书
好员工观后感
2015/06/17 职场文书
2019秋季运动会口号
2019/06/25 职场文书
预备党员入党思想汇报(范文)
2019/08/14 职场文书
SpringBoot2零基础到精通之数据库专项精讲
2022/03/22 Java/Android