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

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

时间:2024-10-28 15:30:53浏览次数:4  
标签:vue https 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包住就能轻松搞定无限放大缩小以及任意拖拽。

3.使用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.看效果。

image

参考文档:

1.https://blog.csdn.net/a843334549/article/details/123296950

2.https://github.com/anvaka/panzoom

3.https://www.zhangxinxu.com/wordpress/2014/08/so-powerful-svg-smil-animation/

4.https://blog.fxnws.com/blue/163.html

标签:vue,https,svg,panzoom,缩小,大图,放大
From: https://www.cnblogs.com/guozhiqiang/p/18510750

相关文章

  • vue(vue.js)—组件(1)非单文件组件
    原文连接:vue(vue.js)—组件(1)非单文件组件–每天进步一点点现在流行的前端框架都支持组件化开发,什么是组件呢?试想一个场景,你开发了一个系统,系统中有一个修改密码的功能,点击后弹出一个小窗口,然后修改密码。系统中一共有5个页面需要用到这个功能,按照以前的做法是把写完的代码复......
  • vue—组件(2)单文件组件
    原文链接:vue—组件(2)单文件组件–每天进步一点点上一篇文章介绍了vuejs中非单文件组件,这篇文章介绍一下单文件组件。单文件组件需要用到vue脚手架,可以参考前面的文章:vue3.0(1)—项目搭建–每天进步一点点(longkui.site)1.默认组件我们通过脚手架创建了一个vue项目。其......
  • Vue3+TS中的web Worker实战
    在开始使用WebWorkers之前,首先让我们先了解一下什么是WebWorkersWebWorkers是一种在浏览器后台独立于主线程运行的JavaScript线程,它允许在Web应用程序中进行后台和长时间运行的脚本处理,而不会影响用户的界面性能。WebWorkers通过在后台线程中执行JavaScript脚......
  • 1、前端项目创建(vue3 + vite + element-plus)
    vue3+vite+element-plus项目创建:1、npmcreatevite@latestdata-relationship----templatevue2、npminstall  安装依赖3、npmielement-plus 安装element-plus4、修改main.jsimport{createApp}from'vue'importAppfrom'./App.vue'importElemen......
  • 基于nodejs+vue基于手机售后管理系统[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于手机售后管理系统的研究,现有研究多集中于售后服务的一般性流程或特定品牌手机售后的部分环节,专门针对一个全面整合多方面功能(如包含用户、服务类型......
  • 基于nodejs+vue基于考研资料分享系统[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于考研资料分享系统的研究,现有研究主要以考研资料的整合与提供为主,如一些考研资料数据库主要侧重于资料的分类整理与存储,而专门针对考研资料分享系统......
  • 基于nodejs+vue基于开源工作流的自来水业扩报装系统[开题+源码+程序+论文]计算机毕业
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于自来水业扩报装系统的研究,现有研究主要集中在传统的工作流程与管理模式方面,专门针对基于开源工作流构建自来水业扩报装系统的研究较少。在国内外,传......
  • 基于nodejs+vue基于酒店管理系统[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于酒店管理系统的研究,现有研究主要以酒店整体运营管理为主,专门针对包含会员等级、多种特色服务(如叫车、叫醒等)的综合性酒店管理系统的研究较少。在国......
  • webpack打包js代码(ES6->ES5)和vue文件
    为什么需要babel?Babel命令行使用Babel插件的使用Babel的预设presetbabel-loaderbabel-preset编写App.vue代码App.vue的打包过程@vue/compiler-sfcresolve模块解析确实文件还是文件夹extensions和alias配置......
  • 基于nodejs+vue基于和vue的酒吧运营系统[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景在当今数字化时代,酒吧运营管理面临着诸多挑战与机遇。关于酒吧运营管理系统的研究,现有研究主要以传统管理模式或单一功能模块为主,专门针对将Vue技术应用......