首页 > 其他分享 >vue集成svg大图拖拽无限放大缩小

vue集成svg大图拖拽无限放大缩小

时间:2024-08-01 16:19:14浏览次数:15  
标签:vue svg panzoom 缩小 大图 拖拽 放大

       vue项目中根据实际CAD图为参考,以及参看项目实际现场,手动绘制了一张线体、堆垛机、库区货架svg图,集成到vue页面中,svg图中可以交互接收C#发送过来的singalR实时数据。接收singalR的实时数据并显示到vue中,这里不作展开讲,可以参看笔者另一篇文章《vue若依集成C#的singalR接收实时数据》。

       早之前是页面右下角放了一个放大缩小按钮。通过点击放大缩小按钮,放大缩小控制svg图中的viewBox属性,来控制svg图的整体放大缩小。

1.在data() {return {    }}中定义缩放比例变量

 //缩放比例
 viewboxw: "0 0 2970 1271",

2.在index.vue页面中<template></template>标签内<svg></svg>使用viewboxw变量

<template>
  <div class="allbgc">
    <div class="contentwid">
      <!-- // 需要拖动的dom -->
      <div ref="dom" @wheel="wheel">
        <div class="svgdiv">
          <svg id="vehicleMonitorId" ref="mysvg" data-name="vehicleMonitorName" xmlns="http://www.w3.org/2000/svg"
            :viewBox="viewboxw">
            <!-- <title>二楼上层</title> -->
            <g>
              <ellipse class="st0" cx="39.2" cy="106" rx="28.5" ry="32" />
              <g>
                <g>
                  <g>
                    <g>
                      <g>
                        <text transform="matrix(1.2 0 0 1 18.1001 119.2002)" class="st1 st2 st3">
                          1#
                        </text>
                      </g>
                    </g>
                  </g>
                </g>
              </g>
            </g>
      </svg>

          <clipPath id="clippath">
            <rect class="cls-3" x="1729.9" y="837.4" width="45.7" height="35.9" />
          </clipPath>
        </div>
      </div>
    </div>
    
    <div class="sjs">
      {{ sjxs }}
    </div>
  </div>
</template>

是能放大缩小,有缺陷,只能已某一固定点(通常是页面左上角)为中心或者写死某一固定点放大缩小,后来觉得需要拿中心点(以中心点为中心放大缩小)比较困难,网上是有拿鼠标坐标或者svg图中坐标位中心点的方案 ,觉得不理想,没有实现,不是自己想要的效果,果断放弃。另寻他路。

  果然,在网上找到了适合自己项目的方案:panzoom。网上有svg-pan-zoom和panzoom方案,用svg-pan-zoom没有试验成功,后来用的panzoom,好用。svg标签外用panzoom包住就能轻松搞定无限放大缩小以及任意拖拽。

       话不多说,直接上代码。

1.npm安装panzoom插件svg图拖拽放大缩小用依赖包

npm install panzoom --save

2.import引入panzoom包

//引入panzoom svg库
import Panzoom from "panzoom";

3.在mounted() { }中初始化zoom方法

mounted() {
    this.initPanZoom();
},

4.在methods: { }中定义initPanZoom()方法和wheel(){ }方法。

    //初始化svg缩放
    initPanZoom() {
      // 存放Panzoom用于后面的其他操作
      this.panzoom = Panzoom(this.$refs.dom, {
        // origin: "0 0", // 位置
        maxScale: 2, // 最大比例
        minScale: 0, // 最小比例
        overflow: "auto", // 溢出
        canvas: true, // 是否视为canvas
        // dblZoom: false, // 双击放大禁用
      });
    },
    wheel(event) {},       

5.index.vue中<template></template>标签内<svg></svg>外层包一层<div ref="dom" @wheel="wheel"></div>

<template>
  <div class="allbgc">
    <div class="contentwid">
    <!-- // 需要拖动的dom -->
    <div ref="dom" @wheel="wheel">
    <div class="svgdiv">
          <svg
            id="vehicleMonitorId"
            ref="mysvg"
            data-name="vehicleMonitorName"
            xmlns="http://www.w3.org/2000/svg"
            :viewBox="viewboxw"
          >
            <!-- <title>二楼上层</title> -->
            <g>
              <ellipse class="st0" cx="39.2" cy="106" rx="28.5" ry="32" />
              <g>
                <g>
                  <g>
                    <g>
                      <g>
                        <text
                          transform="matrix(1.2 0 0 1 18.1001 119.2002)"
                          class="st1 st2 st3"
                        >
                          1#
                        </text>
                      </g>
                    </g>
                  </g>
                </g>
              </g>
            </g>
          </svg>

          <clipPath id="clippath">
            <rect
              class="cls-3"
              x="1729.9"
              y="837.4"
              width="45.7"
              height="35.9"
            />
          </clipPath>
        </div>
      </div>
    </div>
    
    <div class="sjs">
      {{ sjxs }}
    </div>
  </div>
</template>        

6.看效果。

 

 

标签:vue,svg,panzoom,缩小,大图,拖拽,放大
From: https://www.cnblogs.com/chenyangjava/p/18336511

相关文章

  • vue+通义大模型的聊天项目
    智能聊天chat_ali_server.py为服务端,需要配置自己的阿里API_KEY,URL阿里云配置方式剩下的是客户端修改src/store/index.js中serverhost变量的值npminpmrundev应该就可以了如需定制开发,联系:18841685054Github......
  • Vue 3组件中监听浏览器窗口的大小变化
    constwindowWidth=ref(window.innerWidth);onMounted(()=>{ //在组件挂载后检查屏幕大小 //添加事件监听,以便在屏幕大小变化时更新条件 window.addEventListener('resize',checkScreenSize); //立即检查屏幕大小 console.log("在组件挂载后检查屏幕大小")})on......
  • Vue3+Ts+Vite入门
    vue2采用的是vueRouter3vueX3(233)vue3采用的是vueRouter4vueX4(344)v3对比v2优点1.首次渲染更加快v2就算通过路由懒加载效率也不是非常高(查找各种依赖)v3通过vite构建工具使渲染速度更快2.diff算法更快v2新旧虚拟dom对比然后差异化更新v3对diff算法进行优......
  • 超简单!vue3+vant4+pinia+vue-router+mockjs移动端实现水果商城项目【原创】
    ......
  • 基于ssm+vue.js+uniapp的网络直播带货查询系统附带文章和源代码部署视频讲解等
    文章目录前言详细视频演示具体实现截图技术栈后端框架SSM前端框架Vue持久层框架MyBaits系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • 基于springboot+vue.js+uniapp的医疗挂号管理系统附带文章源码部署视频讲解等
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaits系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • ssm+vue的校园物品租赁管理系统的设计与实现【开题+程序+论文】-计算机毕业设计
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着校园生活的日益丰富与多元化,学生们对各类物品的需求也呈现出多样化、临时性的特点。传统的购买方式往往难以满足学生群体对短期使用物品的需求,如......
  • ssm+vue的家具定制购买网站的设计与实现【开题+程序+论文】-计算机毕业设计
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网的飞速发展,电子商务已成为现代消费的主流趋势,特别是在家居装饰领域,消费者对于个性化、定制化家具的需求日益增长。传统家具市场虽种类繁多,......
  • VUE3 el-Menu + tabs 联动
    我们在项目中会有这种情况,根据点击侧边栏的菜单,来动态实现右侧tabs的增减,那么这种效果怎么实现呢1.模板部分<el-menu:collapse="isCollapse"active-text-color="#ffd04b"background-color="#242424"class="el-menu-vertical-demo":default-active="onRoutes&qu......
  • 【计算机毕业设计】ssm399基于vue的电商购物网站+vue
    使用旧方法对电商购物信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在电商购物信息的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。这次开发的电商购物网站管理员功能有个人中心,用户管理,商品类型管理,商......