首页 > 其他分享 >[vue]在鼠标点击处,画点,并弹窗显示两个点的距离

[vue]在鼠标点击处,画点,并弹窗显示两个点的距离

时间:2023-10-01 14:05:41浏览次数:32  
标签:currMarkPoints vue const 鼠标 rect return event 弹窗 left


<template>
  <div class="sandbox">
    <div
      class="road"
      @click="handleClick($event)"
    >
      <div
        v-for="(point, pointIndex) in markPoints"
        :key="pointIndex + 'point'"
        :style="getMarkPointStyle(point)"
      >
        <img src="~@/assets/img/home/icon-no1.png" alt="标记点" />
      </div>
    </div>
    <el-dialog
      :visible="isDistanceVisible"
      title="两个标记点之间的距离"
      @close="handleCloseDialog"
      width="20%"
      height="100px"
    >
      <p>{{ calculateDistance() }}</p>
    </el-dialog>
  </div>
</template>
<script>
export default {
  data() {
    return {
      markPoints: [], // 存储标记点坐标的数组
      isDistanceVisible: false, // 是否显示距离弹窗
      currMarkPoints: [],
    };
  },
  methods: {
  //  这里有讲解,可以理解event.clientX - rect.left
    handleClick(event) {
      // event.currentTarget指向绑定事件的元素,即road元素;   rect.left表示 road盒子的左边 相对于浏览器窗口左边缘的水平距离
      const rect = event.currentTarget.getBoundingClientRect();
      // event.clientX  鼠标指针相对于浏览器窗口左边缘的水平距离
      // 因此event.clientX - rect.left:鼠标指针相对于road盒子左边缘的水平距离
      const x = event.clientX - rect.left;
      const y = event.clientY - rect.top;
      this.markPoints.push({ x, y });
      this.currMarkPoints.push({ x, y });
      // 弹窗显示,刚画的两个点的距离
      if (this.currMarkPoints.length === 2) {
        this.isDistanceVisible = true;
      }
    },
    // 给画的小点定位
    getMarkPointStyle(point) {
      return {
        position: "absolute",
        top: `${point.y}px`,
        left: `${point.x}px`,
      };
    },
    //计算两点之间的距离(刚画的两个点)
    calculateDistance() {
      if (this.currMarkPoints.length !== 2) {
        return;
      }
      const point1 = this.currMarkPoints[0];
      const point2 = this.currMarkPoints[1];
      const distance = Math.sqrt(
        Math.pow(point2.x - point1.x, 2) + Math.pow(point2.y - point1.y, 2)
      );
      return `${distance.toFixed(2)} px`;
    },
    handleCloseDialog() {
      this.isDistanceVisible = false;
      this.currMarkPoints = [];
    },
  },
};
</script>
.sandbox {
  .road {
    display: flex;
    align-items: center;
    background-color: #f3eaea;
    position: relative; // 要定位
    width: 500px;
    height: 500px;
  }
}


标签:currMarkPoints,vue,const,鼠标,rect,return,event,弹窗,left
From: https://blog.51cto.com/u_12881709/7673846

相关文章

  • Vue双向数据绑定原理-下
    Vue双向数据绑定原理-下这一篇文章主要讲解Vue双向数据绑定的原理,主要是通过Object.defineProperty()来实现的,这里我们手写Vue双向数据绑定的原理。首先我提出一个需求,我的需求是,快速监听对象中所有属性的变化。首先得要有一个对象,对象的定义代码如下:<script>letobj={......
  • 你知道Vue 3.0中Treeshaking特性吗?
    介绍Vue3.0引入了Tree-shaking特性,旨在优化构建过程并减小最终生成的代码大小。Tree-shaking是一种在构建时移除未使用代码的技术,通过分析模块的依赖关系,将没有被引用的部分从最终的打包文件中排除掉。这可以大大减少应用的体积,提高性能。举个通俗一点的例子:当我们开发一个应用程......
  • Vue双向数据绑定原理-中
    defineProperty方法defineProperty除了可以动态修改/新增对象的属性以外,还可以在修改/新增的时候给该属性添加get/set方法,从而实现数据劫持。definePropertyget/set方法特点只要通过defineProperty给某个属性添加了get/set方法,那么以后只要获取这个属性的值就会自动调用g......
  • python提取论文图片波形数据:pyautogui键盘移动鼠标,跨模块全局变量使用,cv2局部放大窗口
    最近写了一个python提取论文图片波形数据的脚本,代码如下。涉及新知识点:pyautogui键盘移动鼠标,跨模块全局变量使用,cv2局部放大窗口,matplotlib图片在pyQT5lable显示,坐标变换,多线程同时使用。搜索相关关键字去对应代码区看注释就可以了。gui窗口:1#-*-coding:utf-8-*-2......
  • 【RuoYi移动端】uni-app中通过vuex的store来实现全局变量的修改和读取
    一、在store文件中新建csjVar.js文件constcsjVar={csjMess:[{aaa:"ok"},{bbb:"no"}]}exportdefaultcsjVar二、修改store文件中新建index.js文件importVuefrom'vue'importVuexfrom'vuex'importuserfrom'@/store/modules/user�......
  • vue:自定义validator/验证规则([email protected])
    一,官方文档地址:https://element-plus.gitee.io/zh-CN/component/form.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A0%A1%E9%AA%8C%E8%A7%84%E5%88%99二,js代码:123456789101112131415161718192021222324252627282930313233343536373......
  • vue:el-table在resize时报错([email protected])
    一,报错信息:Uncaughtruntimeerrors:×ERRORResizeObserverloopcompletedwithundeliverednotifications.athandleError(webpack-internal:///./node_modules/webpack-dev-server/client/overlay.js:299:58)ateval(webpack-internal:///./node_modules/webpa......
  • vue处理响应式的思路
    首先看如下js代码leta='张三'console.log(a)//当前页面展示的是张三a='李四'首先页面刚开始渲染的时候数据a为张三,之后将a修改为了李四以后页面不会发生改变,但是数据已经修改了,vue为了解决这一问题,采用响应式的办法。通过对象的defineProperty方法,在回调函数中监听;......
  • Vue自定义指令
    定义指令全局定义//指令名称为:mydirec1Vue.directive('mydirec1',{//指令配置})//指令名称为:mydirec2Vue.directive('mydirec2',{//指令配置})之后,所有的组件均可以使用mydirec1和mydirec2指令<template><!--某个组件代码--><div><MyCompv-......
  • vue_error_Runtime directive used on component with non-element root node. The di
    翻译:'运行时指令,用于非元素根节点的组件。这些指令将无法发挥预期的作用';这个错误发生在我将v-show放在自定义组件上时,我想是因为自定义组件在渲染时会被自定义组件的内部元素替换,因此设置是无效的解决:在自定义组件外加一个div,把v-show写在div上......