vue 元素拖动,复制,已复制元素可移动,快捷方便,已解决

在这里插入图片描述
在这里插入图片描述

注意:使用当前组件时,请先了解组件代码逻辑
下方组件根据自己的需求来更改响应的元素id,调整代码实现逻辑,这里不过多解释

import Vue from "vue";/*** 拖拽*/
Vue.directive("Drag", (el) => {const moveEl = el;let flag = false;const mouseDown = (e) => {flag = true;let X = e.clientX - el.offsetLeftlet Y = e.clientY - el.offsetTopconst move = (e) => {if (flag) {el.style.cursor = 'move';el.style.marginLeft = '0px';el.style.marginTop = '0px';el.style.left = e.pageX - X + 'px';el.style.top = e.pageY - Y + 'px';}}document.addEventListener('mousemove', move);document.addEventListener('mouseup', (e) => {document.removeEventListener('mousemove', move);});}moveEl.addEventListener('mousedown', mouseDown);
})/*** 复制*/
Vue.directive("Copy", (el) => {const moveEl = el;let copy = false;const mouseDown = (e) => {let X = e.clientX - el.offsetLeftlet Y = e.clientY - el.offsetTopconst move = (e) => {if (!copy) {const imageDiv = document.createElement(el.tagName);imageDiv.className = "image";imageDiv.style.left = e.pageX - X + 'px';imageDiv.style.top = e.pageY - Y + 'px';// 获取元素属性el.getAttributeNames().forEach((name) => {imageDiv.setAttribute(name, el.getAttribute(name));});// 获取元素中内容imageDiv.innerHTML = el.innerHTML;imageDiv.addEventListener('click', (e) => {openIframeWindow(e)})// 已复制元素添加拖拽功能imageDiv.attributes.setNamedItem(document.createAttribute('v-drag'));imageDiv.attributes.setNamedItem(document.createAttribute('v-copy'));setImagesInterval(imageDiv);// 添加复制后元素的拖拽功能imagesDrag(imageDiv);document.getElementsByClassName('content')[0].appendChild(imageDiv);}copy = true;}document.addEventListener('mousemove', move);document.addEventListener('mouseup', (e) => {copy = false;document.removeEventListener('mousemove', move);});}moveEl.addEventListener('mousedown', mouseDown);// 打开iframe窗口function openIframeWindow(e) {document.getElementById('iframe').style.display = 'block';// 显示iframe的div标签document.getElementById('my-iframe').style.display = 'block';// 显示iframe标签document.getElementById('my-iframe').src = './iframe';// 显示iframe标签的src属性document.getElementById('my-iframe').style.width = '19.9rem';// 显示iframe标签的宽document.getElementById('my-iframe').style.height = '20rem';// 显示iframe标签的高document.getElementById('iframe').style.width = '19.9rem';// 显示iframe的div标签的宽document.getElementById('iframe').style.left = e.pageX + 5 + 'px';// 显示iframe的div标签的left属性document.getElementById('iframe').style.top = e.pageY + 5 + 'px';// 显示iframe的div标签的top属性// document.getElementsByClassName('open')[0].style.display = 'block';// 显示打开按钮// document.getElementsByClassName('close')[0].style.display = 'block';// 显示关闭按钮// document.getElementById('title').style.display = 'block';// 显示标题编辑文本框document.getElementById('closeButton').style.left = '0rem';// 设置关闭按钮的left属性document.getElementById('iframe0').style.display = 'block';// 显示iframe0的div通信按钮document.getElementById('iframe1').style.display = 'none';// 显示iframe1的div通信按钮}// 复制后的图片轮播function setImagesInterval(imageDiv) {let count = 0;setInterval(() => {if (count == 0) {imageDiv.getElementsByTagName('img')[0].style.display = 'block';imageDiv.getElementsByTagName('img')[1].style.display = 'none';imageDiv.getElementsByTagName('img')[2].style.display = 'none';count++;} else if (count == 1) {imageDiv.getElementsByTagName('img')[0].style.display = 'none';imageDiv.getElementsByTagName('img')[1].style.display = 'block';imageDiv.getElementsByTagName('img')[2].style.display = 'none';count++;} else if (count == 2) {imageDiv.getElementsByTagName('img')[0].style.display = 'none';imageDiv.getElementsByTagName('img')[1].style.display = 'none';imageDiv.getElementsByTagName('img')[2].style.display = 'block';count = 0;}}, 1000);}// 复制后的图片拖拽function imagesDrag(imageDiv){let flag = false;const mouseDown = (e) => {flag = true;let X = e.clientX - imageDiv.offsetLeftlet Y = e.clientY - imageDiv.offsetTopconst move = (e) => {if (flag) {imageDiv.style.cursor = 'move';imageDiv.style.marginLeft = '0px';imageDiv.style.marginTop = '0px';imageDiv.style.left = e.pageX - X + 'px';imageDiv.style.top = e.pageY - Y + 'px';}}imageDiv.addEventListener('mousemove', move)imageDiv.addEventListener('mouseup', (e) => {flag = false;imageDiv.removeEventListener('mousemove', move)})}imageDiv.addEventListener('mousedown', mouseDown);}
})

全局引用
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/289115.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL表内容的增删查改

在前面几章的内容中我们学习了数据库的增删查改,表的增删查改,这一篇我们来学习一下对表中的内容做增删查改。 CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除) 1.创建Create 我们先创建…

深入解析MD5哈希算法:原理、应用与安全性

码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! 本文将深入探讨MD5哈希算法的工作原理、应用场景以及安全性问题。我们将了解MD5如何生成固定长度的哈希值,以及它在数…

BUG未解之谜01-指针引用之谜

在leetcode里面刷题出现的问题,当我在sortedArrayToBST里面给root赋予初始值NULL之后,问题得到解决! 理论上root是未初始化的变量,然后我进入insert函数之后,root引用的内容也是未知值,因此无法给原来的二叉…

could not resolve com.android.tools.build:gradle:4.1.1.

一、报错信息 could not resolve com.android.tools.build:gradle:4.1.1.其实是因为你的网络不能从AS工程提供的mavenCentral()、google()和jcenter()等仓库下载相应的依赖。 二、解决方法 在build.gradle(Project)中,在原先的maven仓库前加上阿里云镜像源。这里…

如何遍历整个DOM树

原文链接:[如何遍历整个DOM树(外网原文链接)](https://chrisdeo.github.io/2019/07/20/%E5%A6%82%E4%BD%95%E9%81%8D%E5%8E%86%E6%95%B4%E4%B8%AADOM%E6%A0%91/) 作为前端开发工程师,我们大部分工作内容其实还是围绕着DOM在进行Javascript的编写&#xf…

SQL把统计结果作为条件进行查询

今天在社区看到一个问题如何返回 统计数值,比较简单,分享一下写法: --测试数据 if not object_id(NTempdb..#T) is nulldrop table #T Go Create table #T([name] nvarchar(21),[year] nvarchar(21),[time] nvarchar(22)) Insert #T select …

手写SpringBoot(二)之动态切换Servlet容器

系列文章目录 手写SpringBoot(一)之简易版SpringBoot 手写SpringBoot(二)之动态切换Servlet容器 手写SpringBoot(二)之动态切换Servlet容器 文章目录 系列文章目录手写SpringBoot(二&#xff…

KubeSphere简单介绍及安装使用

KubeSphere 概述 官网地址:https://kubesphere.io/zh/ 什么是 kubesphere KubeSphere 是一个开源的多云容器管理平台,旨在简化企业级 k8s 集群的部署、管理和运维。它提供了一个可视化的管理界面,帮助用户更轻松地管理和监控 k8s 集群&…

访问者模式(数据与行为解耦)

目录 前言 UML plantuml 类图 实战代码 SimpleFileVisitor FileVisitor 接口 删除指定文件夹 模板 IVisitor IVisitable Client 前言 一个类由成员变量和方法组成,成员变量即是类的数据结构,方法则是类的行为。 如果一个类的数据结构稳定&am…

超声波清洗机家用的哪家好?眼镜清洗器推荐!一分钟选购洗眼镜机

相信大家都知道,眼镜脏的话可以使用超声波清洗机清洁!因为超声波清洗机能够通过振频的原理,对眼镜的污垢进行清洗。有的朋友会问,我手洗不可以吗?手洗当然可以,但是手洗对于镜片的清洗有作用,但…

【C语言】 gets()puts()fgets()fputs()字符串输入输出函数的用法

文章目录 C语言中的字符串输入输出函数:gets、puts、fgets与fputsgets函数puts函数fgets函数fputs函数 C语言中的字符串输入输出函数知识点总结结语 C语言中的字符串输入输出函数:gets、puts、fgets与fputs 在C语言中,处理字符串的输入和输出…

Java关键字之 assert

语法 assert关键字语法有两种用法&#xff1a; 1、assert <boolean表达式> 如果<boolean表达式>为true&#xff0c;则程序继续执行。 如果为false&#xff0c;则程序抛出AssertionError&#xff0c;并终止执行。 2、assert <boolean表达式> : <错误信…

翔云身份证实名认证接口-PHP调用方法

网络平台集成实名认证接口&#xff0c;是顺应当下网络实名制规定&#xff0c;有效规避法律风险。互联网平台若没有实名认证功能&#xff0c;那么便无法保证网民用户身份的真实性&#xff0c;很有可能被虚假用户攻击&#xff0c;特别是在当网络平台产生垃圾信息乃至是违法信息时…

必示科技携手云杉网络发布“智能可观测性联合解决方案”

近日&#xff0c;必示科技与云杉网络携手发布“智能可观测性联合解决方案”&#xff0c;整体方案融合云杉网络DeepFlow产品在可观测性领域、必示科技AIOps产品在运维数据分析领域的深厚技术积淀&#xff0c;完整实现IT系统高质量、高性能、全栈的可观测数据采集、智能监控和智能…

Go —— defer

defer defer 语句用于延迟函数的调用&#xff0c;常用于关闭文件描述符、释放锁等资源释放场景。但 defer 关键字只能作用于函数或函数调用。 defer func(){ // 函数fmt.Print("Hello&#xff0c;World!") }()defer fmt.Print("Hello&#xff0c;World!&…

第十三届国际纯数学与应用数学会议(ICPAM 2024)即将召开!

第十三届国际纯数学与应用数学会议将于2024年7月17日至20日在克罗地亚萨格勒布召开。ICPAM是一项连续成功举办十二年的年度会议&#xff0c;其汇集了纯数学和应用数学领域的教授、研究人员、学者和学生&#xff0c;为跨行业交流&#xff0c;经验分享&#xff0c;学术界合作以及…

ArcGIS Pro横向水平图例

终于知道ArcGIS Pro怎么调横向图例了&#xff01; 简单的像0一样 旋转&#xff0c;左转右转随便转 然后调整图例项间距就可以了&#xff0c;参数太多就随便试&#xff0c;总有一款适合你&#xff01; 要调整长度&#xff0c;就调整图例块的大小。完美&#xff01; 好不容易…

【C++】手撕哈希表的闭散列和开散列

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;手撕哈希表的闭散列和开散列 > 毒鸡汤&#xff1a;谁不是一边受伤&#xff0c;一边学会坚强。 > 专栏选自&#xff1a;C嘎嘎进阶 > 望小伙伴们…

对AOP的理解

目录 一、为何需要AOP&#xff1f;1、从实际需求出发2、现有的技术能解决吗&#xff1f;3、AOP可以解决 二、如何实现AOP&#xff1f;1、基本使用2、更推荐的做法2.1 “基本使用”存在的隐患2.2 最佳实践2.2.1 参考Transactional&#xff08;通过AOP实现事务管理&#xff09;2.…

SpringBoot国际化配置流程(超详细)

前言 最新第一次在做SpringBoot的国际化&#xff0c;网上搜了很多相关的资料&#xff0c;都是一些简单的使用例子&#xff0c;达不到在实际项目中使用的要求&#xff0c;因此本次将结合查询的资料以及自己的实践整理出SpringBoot配置国际化的流程。 SpringBoot国际化 "i…