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 相关文章推荐
一端时间轮换的广告
Jun 26 Javascript
javascript radio 联动效果
Mar 04 Javascript
JS继承 笔记
Jul 13 Javascript
原生js实现给指定元素的后面追加内容
Apr 10 Javascript
js倒计时小程序
Nov 05 Javascript
jquery attr方法获取input的checked属性问题
May 26 Javascript
AngularJS 基础ng-class-even指令用法
Aug 01 Javascript
JS使用插件cryptojs进行加密解密数据实例
May 11 Javascript
jQuery中extend函数简单用法示例
Oct 11 jQuery
vue2.0在table中实现全选和反选的示例代码
Nov 04 Javascript
基于vue 添加axios组件,解决post传参数为null的问题
Mar 05 Javascript
Jquery Fade用法详解
Nov 06 jQuery
基于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 文件夹删除、php清除缓存程序
2009/08/25 PHP
PHP中通过fopen()函数访问远程文件示例
2014/11/18 PHP
php实现使用正则将文本中的网址转换成链接标签
2014/12/03 PHP
PHP扩展模块memcached长连接使用方法分析
2014/12/24 PHP
PHP简单获取多个checkbox值的方法
2016/06/13 PHP
php文件上传、下载和删除示例
2020/08/28 PHP
原生php实现excel文件读写的方法分析
2018/04/25 PHP
Javascript aop(面向切面编程)之around(环绕)分析
2015/05/01 Javascript
JavaScript数据结构之广义表的定义与表示方法详解
2017/04/12 Javascript
ES6入门教程之Iterator与for...of循环详解
2017/05/17 Javascript
JavaScript编写棋盘覆盖代码详解
2017/08/28 Javascript
JS沙箱模式实例分析
2017/09/04 Javascript
JS实现手写parseInt的方法示例
2017/09/24 Javascript
Angular6 正则表达式允许输入部分中文字符
2018/09/10 Javascript
详解vuex中action何时完成以及如何正确调用dispatch的思考
2019/01/21 Javascript
elementUI table表格动态合并的示例代码
2019/05/15 Javascript
微信小程序按顺序同步执行的两种方式
2019/12/20 Javascript
浅谈Vue 函数式组件的使用技巧
2020/06/16 Javascript
python中的代码编码格式转换问题
2015/06/10 Python
python实现web方式logview的方法
2015/08/10 Python
Python常见数据结构之栈与队列用法示例
2019/01/14 Python
Python3多线程基础知识点
2019/02/19 Python
python批量下载抖音视频
2019/06/17 Python
解决.ui文件生成的.py文件运行不出现界面的方法
2019/06/19 Python
使用pygame写一个古诗词填空通关游戏
2019/12/03 Python
Python用K-means聚类算法进行客户分群的实现
2020/08/23 Python
使用HTML5 Canvas为图片填充颜色和纹理的教程
2016/03/21 HTML / CSS
HTML5自定义属性前缀data-及dataset的使用方法(html5 新特性)
2017/08/24 HTML / CSS
Christys’ Hats官网:英国帽子制造商
2018/11/28 全球购物
学前班教师的自我鉴定
2013/12/05 职场文书
网吧最新创业计划书范文
2014/03/27 职场文书
我的梦中国梦演讲稿
2014/04/23 职场文书
单位员工收入证明样本
2014/10/09 职场文书
入党宣誓仪式主持词
2015/06/29 职场文书
2015七夕情人节宣传语
2015/07/14 职场文书
关于车尾的标语大全
2015/08/11 职场文书