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.offsetLeft
    let Y = e.clientY - el.offsetTop
    const 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.offsetLeft
    let Y = e.clientY - el.offsetTop
    const 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.offsetLeft
      let Y = e.clientY - imageDiv.offsetTop
      const 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.mfbz.cn/a/498970.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL---函数

目录 一、概述 二、字符串函数 三、数值函数 四、日期函数 五、流程函数 一、概述 函数 是指一段可以直接被另一段程序调用的程序或代码。 也就意味着,这一段程序或代码在MySQL 中 已经给我们提供了,我们要做的就是在合适的业务场景调用对应的函数完…

课堂练习:环境体验——Linux 文件操作命令

任务描述 第二个任务就是了解Linxu的文件查看命令,文件编辑基本命令。 相关知识 为了完成本关任务,你需要掌握: 1.文件查看命令。 2.文件编辑基本命令。 文件查看命令 我们要查看一些文本文件的内容时,要使用文本编辑器来查看…

vue3+ts白屏问题解决

文章目录 打开白屏解决方法可能出现问题使用base导致的使用baseUrl导致的 注意点vue3ts白屏问题知识分享 打开白屏 解决方法 在vue.config.js页面 添加publicPath:./, const { defineConfig } require(vue/cli-service)module.exports defineConfig({ transpileDependenci…

MATLAB:优化与规划问题

一、线性规划 % 线性规划(Linear programming, 简称LP) fcoff -[75 120 90 105]; % 目标函数系数向量 A [9 4 7 54 5 6 105 10 8 53 8 9 77 6 4 8]; % 约束不等式系数矩阵 b [3600 2900 3000 2800 2200]; % 约束不等式右端向量 Aeq []; % 约束等式系…

搭建本地局域网域名并配置本地的mqtt服务器

1. 第一步: 首先准备一台windows电脑,安装 Technitium DNS Server 链接如下: Technitium DNS Server | An Open Source DNS Server For Privacy & Security 启动 start 然后进入 http://localhost:5380/ 下载完成之后,需要…

数字三角形 Number Triangles

题目描述 观察下面的数字金字塔。 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。 在上面的样例中,从 7 → 3 → 8 → 7 → 5 7 \to 3 \to 8 \to 7 \to 5 7→3→8→7→5 的…

【JAVAEE学习】探究Java中多线程的使用和重点及考点

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

vue 内嵌第三方网页

需要将另一个系统嵌套到当前网页中 一、frame 方法一就是通过html的标签 iframe 实现网页中嵌入其他网站 标签属性 属性含义src嵌套的网页地址width设置嵌套网页的宽度,单位为像素height设置嵌套网页的高度,单位为像素frameborder控制嵌套的网页是否…

【CC工具箱1.2.5】更新_免费无套路,70+个工具

CC工具箱目前已经更新到1.2.5版本,完全免费无套路。 适用版本ArcGIS Pro 3.0及以上。 欢迎大家使用,反馈bug,以及提出需求和意见,时间和能力允许的话我会尽量满足要求。 如有关于工具的使用问题和需求建议,可以加下…

使用unplugin-auto-import页面不引入api飘红

解决方案:. tsconfig.json文件夹加上 {"compilerOptions": {"target": "ES2020","useDefineForClassFields": true,"module": "ESNext","lib": ["ES2020", "DOM", &q…

使用Python进行微服务架构的设计与实现【第159篇—微服务架构】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 使用Python进行微服务架构的设计与实现 在当今软件开发领域中,微服务架构已经成…

结构体,联合体,枚举( 1 )

目录 前言 1.结构体 1.1结构体的声明 1.2结构体变量的创建和初始化 1.3结构体成员的访问字符 1.4结构体的内存大小 1.4.1对齐规则 1.5结构体传参 前言 在编程的世界里,数据结构的选择对于程序的效率和可读性有着至关重要的影响。不同的数据结构适用于不同的…

华为WATCH 4是怎么监测我们健康的?真的有用吗?

最近,总听到身边的朋友说手表帮他们发现了不少健康的问题,所以我也想整一个来试试看。看了很多款手表后,发现华为WATCH 4还挺符合我的需求,它有一系列超实用的健康监测功能,可以说是随身的健康小助手。 先来说说心脏…

企微侧边栏开发(内部应用内嵌H5)

一、背景 公司的业务需要用企业微信和客户进行沟通,而客户的个人信息基本都存储在内部CRM系统中,对于销售来说需要一边看企微,一边去内部CRM系统查询,比较麻烦,希望能在企微增加一个侧边栏展示客户的详细信息&#xf…

电脑最高可以装多少内存?电脑内存怎么装?

大家好,我是来自兼容性之家的! 通常我们的家用电脑主机有8到16GB的运行内存。 极少数高端用户会使用32至64GB内存。 比较高端的工作站的内存在128GB左右。 同时,家用电脑的硬盘容量约为1TB。 那么你有没有想过一台电脑可以拥有的最大内存量…

网站业务对接DDoS高防

准备需要接入的网站域名清单,包含网站的源站服务器IP(仅支持公网IP的防护)、端口信息等。所接入的网站域名必须已完成ICP备案。如果您的网站支持HTTPS协议访问,您需要准备相应的证书和私钥信息,一般包含格式为.crt的公…

Kafka入门到实战-第二弹

Kafka入门到实战 Kafka快速开始官网地址Kafka概述Kafka术语Kafka初体验更新计划 Kafka快速开始 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://kafka.apache.org/Kafka概述 Apache Kafka 是一个开源的分布式事件流…

AI写作工具哪家强?推荐11款AI写作生成器

AI写作工具近年来在技术的不断进步和应用的不断拓展下,逐渐成为人们创作、撰写的得力助手。然而,市面上涌现出的众多AI写作生成器,究竟哪家强呢?以下是11款方便实用的AI写作生成器,它们提供了快速、智能的写作功能&…

今天是我和 “代码” 分手的第100天...

smardaten迎来了一位特殊用户——杨钏,一名去年刚毕业的Java开发工程师。 进入的第一家ISV公司在与数睿数据达成长期合作的战略背景下,从现有开发人马中抽出成员,创建了由smardaten无代码工具完成交付的项目团队。 杨钏作为公司近年入职的新…

vue总结

vue create wuliu vue-router label 安装依赖,封装axios npm install axios --save-dev koa2 -e wuliuserver cd wuliuserver npm install 跨域: npm install koa-cors //wuliuserver/app.js下应当有: const cors require(koa-cors) app.us…