vue 组件封装——可自由拖拽移动的盒子

news2024/9/23 9:35:59

最终效果

在这里插入图片描述

完整代码

关键性要点,详见注释

组件封装 superBox.vue

<template>
  <div
    ref="box_Ref"
    class="box"
    @mousedown="moveStart"
    @mousemove="moving"
    @mouseup="moveEnd"
    :style="{
      width: (nodeInfo.width || 40) + 'px',
      height: (nodeInfo.height || 60) + 'px',
      left: (nodeInfo.x || 0) + 'px',
      top: (nodeInfo.y || 0) + 'px',
      backgroundColor: nodeInfo.color || 'black',
      zIndex: zIndex,
    }"
  ></div>
</template>

<script>
export default {
  props: {
    nodeInfo: Object,
  },
  data() {
    return {
      zIndex: "auto",
      // 移动开始时,鼠标的x坐标
      moveStart_mouseX: null,
      // 移动开始时,鼠标的y坐标
      moveStart_mouseY: null,
      ifMove: false,
      originNodeInfo: null,
    };
  },

  methods: {
    // 移动开始
    moveStart(e) {
      this.moveStart_mouseX = e.clientX;
      this.moveStart_mouseY = e.clientY;
      this.ifMove = true;
      this.originNodeInfo = JSON.parse(JSON.stringify(this.nodeInfo));
      //   移动时,临时提升元素至顶层,避免因元素遮挡而无法继续移动
      this.zIndex = 99999;
    },
    // 移动中
    moving(e) {
      if (this.ifMove) {
        let moveing_mouseX = e.clientX;
        let moveing_mouseY = e.clientY;
        let xChange = moveing_mouseX - this.moveStart_mouseX;
        let yChange = moveing_mouseY - this.moveStart_mouseY;
        this.$emit("moved", {
          newX: this.originNodeInfo.x + xChange,
          newY: this.originNodeInfo.y + yChange,
        });
      }
    },
    // 移动结束
    moveEnd() {
      this.ifMove = false;
      this.moveStart_mouseX = null;
      this.moveStart_mouseY = null;
      this.originNodeInfo = null;
      this.zIndex = "auto";
    },
  },
};
</script>

<style scoped>
.box {
  position: absolute;
  cursor: move;
}
</style>

使用组件 index.vue

<template>
  <div>
    <SuperBox @moved="moved($event, node1)" :nodeInfo="node1" />
    <SuperBox @moved="moved($event, node2)" :nodeInfo="node2" />
  </div>
</template>

<script>
import SuperBox from "./superBox.vue";
export default {
  components: {
    SuperBox,
  },
  data() {
    return {
      node1: {
        x: 100,
        y: 10,
        color: "red",
      },

      node2: {
        x: 400,
        y: 10,
        color: "blue",
      },
    };
  },

  methods: {
    moved(movedInfo, nodeInfo) {
      // < 0 时置为0,避免元素移出浏览器窗口
      nodeInfo.x = movedInfo.newX < 0 ? 0 : movedInfo.newX;
      nodeInfo.y = movedInfo.newY < 0 ? 0 : movedInfo.newY;
    },
  },
};
</script>

遗留问题

当鼠标拖拽过快时,元素无法跟随移动,且 ifMove 无法正常恢复 false 导致拖拽异常。

想到解决方案的朋友,欢迎留言哦!

更多相关参考资料

  • vue实战——元素的拖拽 + 控制元素无法拖拽出盒子 + 随元素拖拽自适应变化大小的盒子
    https://blog.csdn.net/weixin_41192489/article/details/120518561

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

js模块化

第1章:模块化入门 1.1.理解什么是模块 将一个复杂的程序依据一定的规则拆分成单个文件&#xff0c;并最终组合在一起这些拆分的文件就是模块&#xff0c;模块内部数据是私有的&#xff0c;只是向外部暴露一些方法与外部其它模块通信 1.2.为什么要模块化? 降低复杂度&#…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java网络游戏虚拟交易平台8rfnp

计算机毕业设计的编程真的不会, 应该怎么办啊, 平时学了3年都没学懂&#xff0c;然而还有一个月就要答辩了&#xff0c;一点东西都没做出来&#xff0c;不知道该怎么办了&#xff1f;好迷茫&#xff0c;如果毕不到业怎么办, 有没有快速的学习方法 毕设毕设&#xff0c;最终的是…

【软件测试】10年测试老鸟,告诉你测试内功修炼之道......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 一名测试人员&#…

Docker[2]-docker的组成与卸载

1.5 Docker的基本组成 1.5.1 镜像(image) Docker 镜像&#xff08;Image&#xff09;就是一个只读的模板。镜像可以用来创建 Docker 容器&#xff0c;一个镜像可以创建很多容器。 docker面向对象容器对象镜像类 1.5.2 容器(container) Docker 利用容器&#xff08;Container&a…

一文读懂如何让网页变灰白色(黑白色)

文章目录1. 文章引言2. 实现方法2.1 修改CSS文件2.2 修改html标签2.3 修改body标签2.4 使用grayscale.js插件1. 文章引言 有段时间&#xff0c;我们打开知名的网页&#xff0c;发现全部变成黑白色了&#xff0c;如下图所示&#xff1a; 一般在清明节&#xff0c;全国哀悼日&am…

学会这些C语言技巧,你的编程能力大大提升

一、函数指针 在讲回调函数之前&#xff0c;我们需要了解函数指针。 我们都知道&#xff0c;C语言的灵魂是指针&#xff0c;我们经常使用整型指针&#xff0c;字符串指针&#xff0c;结构体指针等 int *p1; char *p2; STRUCT *p3; //STRUCT为我们定义的结构体 但是好像我们…

PCB设计总有几个阻抗没法连续的地方。

罗永浩所说“人生总有几次踩到大便的时候”&#xff0c;PCB设计也总有阻抗不能连续的时候。 特性阻抗&#xff1a;又称“特征阻抗”&#xff0c;它不是直流电阻&#xff0c;属于长线传输中的概念。在高频范围内&#xff0c;信号传输过程中&#xff0c;信号沿到达的地方&#xf…

canal springboot 入门

Alibaba canal(官方文档链接) 简介 canal [kə’nl]&#xff0c;译意为水道/管道/沟渠&#xff0c;主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费 早期阿里巴巴因为杭州和美国双机房部署&#xff0c;存在跨机房同步的业务需求&#xff0c;实现方…

转行编程语言该怎么选择?小扎给你安排上

编程语言的发展 ​ 编程语言到目前为止&#xff0c;经历了三个发展阶段&#xff0c;机器语言&#xff0c;汇编语言、高级语言。在高级语言中&#xff0c;又可以分为面向过程语言以及目前最为广泛流传的面向对象语言。 机器语言 ​ 第一代计算机语言称为机器语言。机器语言就是…

stm32cubemx hal学习记录:FreeRTOS中断管理

一、参数配置 1、配置RCC、USART1、时钟84M 2、配置SYS&#xff0c;将Timebase Source修改为除滴答定时器外的其他定时器。 3、初始化LED的两个引脚、两个按键引脚 4、开启FreeRTOS&#xff0c;v1与v2版本不同&#xff0c;一般选用v1即可 5、创建一个队列 6、创建两个线程…

正大国际期货:外盘黄金期货怎么做,需要注意什么?

无论你是刚入外盘黄金期货市场的新手小白&#xff0c;还是已经入黄金市场多年的老手&#xff0c;必须知道外盘黄金期货交易的技巧及规则&#xff0c;这样才可以在黄金期货市场中站稳脚跟&#xff0c;才能收获更多的利益。下面正大IxxxuanI就为大家准备了一些黄金交易技巧以供参…

太阳能发电与蓄电池研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f389;作者研究&#xff1a;&#x1f3c5;&#x1f3c5;&#x1f3c5;主要研究方向是电力系统和智能算法、机器学…

汇编语言程序设计入门

目录 基本概念 符号指令中的表达式 符号 数值常量 符号常量&#xff08;用的很少&#xff09; 数值表达式 标号&#xff08;一般出现在代码段&#xff09; 程序框架 ​编辑 标号的定义 变量&#xff08;最重要) 变量的属性​编辑 变量存储区中数据的存放​编辑 变量…

最受欢迎的Python科学类库

作为一种免费的&#xff0c;跨平台的&#xff0c;通用的和高级的编程语言&#xff0c;Python已被科学界广泛采用。科学家重视Python的精确和有效的语法&#xff0c;相对平坦的学习曲线以及它与其他语言&#xff08;例如C / C &#xff09;很好地集成的事实。 由于这种流行&…

最近沉迷Redis网络模型,无法自拔!终于知道Redis为啥这么快了

1. 用户空间和内核态空间 1.1 为什么要区分用户和内核 服务器大多都采用 Linux 系统&#xff0c;这里我们以 Linux 为例来讲解: ubuntu 和 Centos 都是 Linux 的发行版&#xff0c;发行版可以看成对 linux 包了一层壳&#xff0c;任何 Linux 发行版&#xff0c;其系统内核都…

设计模式-day03

5&#xff0c;结构型模式 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式&#xff0c;前者采用继承机制来组织接口和类&#xff0c;后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低&#xff0c;满足“…

项目管理(如何进行项目风险管理)

项目风险管理包括规划风险管理、识别风险、开展风险分析、规划风险应对、实施风险应对和监 督风险的各个过程。项目风险管理的目标在于提高正面风险的概率和(或)影响,降低负面风险的 概率和(或)影响,从而提高项目成功的可能性。 项目风险分类: 1、概率性风险(能识别并确…

【虹科】工业相机如何自动优化图像?

普通的消费网络相机操作简便&#xff0c;常常也会用于一些机器视觉应用。然而&#xff0c;我们很容易就可以意识到&#xff0c;与典型的工业相机相比&#xff0c;虽然网络相机价格诱人&#xff0c;但是在质量、耐用性和长期可用性方面存在显著劣势。和网络相机一样简单易用的工…

【正点原子FPGA连载】第三十一章DDR4读写测试实验 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第三十一章DDR4读…

Google Indexing API 推送 (避免踩坑)

https://developers.google.com/search/apis/indexing-api/v3/prereqs?hlen_GB 官方文档 1. 在创建服务账号部分需要注意的是&#xff1a; 第二步授权要把服务账号的邮箱地址加上2. 验证完网站站长之后需要注意的点 a. https://search.google.com/search-console/settings 进入…