封装svg图片展示及操作组件——svgComponent——js技能提升

news/2025/1/21 15:55:24/

在这里插入图片描述

template部分

<template><div class="canvas-wrapper" ref="canvasWrapper"><svg:viewBox="computedViewBox"ref="svgCanvas"xmlns="http://www.w3.org/2000/svg"xmlns:xlink="http://www.w3.org/1999/xlink"class="schematic-svg"@mousedown="startDrag"@mousemove="onDrag"@mouseup="endDrag"@wheel="onScroll"v-html="svgContent"preserveAspectRatio="xMinYMin meet"></svg></div>
</template>

在这里插入图片描述
this.klFile = "data:image/svg+xml;base64," + data[0].kl_svg
<svg-component v-if="klFile !== null" :svg-base64="klFile" view-box="0 0 2000 2000"></svg-component>

script部分

<script>
export default {name:'SvgComponent',props: {svgBase64: {type: String,required: true},viewBox: {type: String,required: true},},data() {return {computedViewBox: this.viewBox, // 用于动态修改的 viewBoxdragging: false,startX: 0,startY: 0,viewBoxX: 0,viewBoxY: 0,svgContent: "", // 存储解码后的 SVG 内容};},watch: {svgBase64() {// 响应 props 变化并重新渲染 SVGthis.decodeSvgBase64();},},mounted() {this.decodeSvgBase64();},methods: {decodeSvgBase64() {// 解码 Base64 数据// 检查并移除可能存在的 Base64 数据头let base64String = this.svgBase64;const prefix = "data:image/svg+xml;base64,";if (base64String.startsWith(prefix)) {base64String = base64String.replace(prefix, "");}// 尝试解码 Base64 数据const decodedData = atob(base64String);this.svgContent = decodedData; // 将解码后的内容赋值给 svgContent},startDrag(event) {this.dragging = true;this.startX = event.clientX;this.startY = event.clientY;},onDrag(event) {if (this.dragging) {const dx = this.startX - event.clientX;const dy = this.startY - event.clientY;this.viewBoxX += dx;this.viewBoxY += dy;this.updateViewBox();this.startX = event.clientX;this.startY = event.clientY;}},endDrag() {this.dragging = false;},onScroll(event) {event.preventDefault();const zoomAmount = 1.1;const [x, y, w, h] = this.computedViewBox.split(" ").map(Number);// Zoom in or outif (event.deltaY < 0) {// Zoom inthis.computedViewBox = `${x + w * (1 - 1 / zoomAmount) / 2} ${y + h * (1 - 1 / zoomAmount) / 2} ${w / zoomAmount} ${h / zoomAmount}`;} else {// Zoom outthis.computedViewBox = `${x - w * (zoomAmount - 1) / 2} ${y - h * (zoomAmount - 1) / 2} ${w * zoomAmount} ${h * zoomAmount}`;}},updateViewBox() {const [x, y, w, h] = this.viewBox.split(" ").map(Number);this.computedViewBox = `${this.viewBoxX} ${this.viewBoxY} ${w} ${h}`;}},
};
</script>

css部分

<style scoped>
.canvas-wrapper {border-radius: 10px;box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);overflow: hidden;
}.schematic-svg {width: 100%;height: 100%;
}
</style>

http://www.ppmy.cn/news/1564995.html

相关文章

UDP/TCP ②-三次握手 || 四次挥手 || 确认应答 || 超时重传

这里是Themberfue 在讲完了UDP协议后&#xff0c;我们进入更为重要也是更为复杂的TCP协议&#xff0c;探究其是如何让数据可靠传输的。 TCP协议报文格式 关于TCP协议的一些特点我也不过多赘述了&#xff0c;详情请见&#xff1a;TCP✨TCP&#xff1a;有连接、可靠传输、面向字…

人工智能之深度学习_[3] -PyTorch自动微分模块和构建线性回归模型

文章目录 自动微分模块9.1 梯度基本计算9.2 梯度下降法求最优解9.3 梯度计算注意点9.4 自动微分模块应用 10 PyTorch构建线性回归模型 自动微分模块 自动微分就是自动计算梯度值,也就是计算导数。 什么是梯度 对函数求导的值就是梯度 什么是梯度下降法 是一种求最优梯度值的方法…

以太网实战AD采集上传上位机——FPGA学习笔记27

一、设计目标 使用FPGA实现AD模块驱动采集模拟电压&#xff0c;通过以太网上传到电脑上位机。 二、框架设计 数据位宽转换模块&#xff08;ad_10bit_to_16bit&#xff09;&#xff1a;为了方便数据传输&#xff0c;数据位宽转换模块实现了将十位的 AD 数据转换成十六位&#…

畅游Diffusion数字人(14):基于3D人体网格的语音驱动手势视频生成 ECCV 2024

畅游Diffusion数字人(0):专栏文章导航 前言:根据语音输入生成与说话内容、情感和节奏相匹配的自然、流畅且逼真的手势视频。该技术在虚拟形象、虚拟现实、动画制作等领域具有重要应用价值。然而这方面的研究非常少,这篇博客解读一篇ECCV 2024的最新论文。 目录 研究背景与挑…

一次完整的tcpdump -XX输出报文详解

报文&#xff1a; 03:32:51.745623 IP (tos 0x0, ttl 64, id 65006, offset 0, flags [DF], proto TCP (6), length 94) 10.229.43.200.6471 > 10.229.43.200.55674: Flags [P.], cksum 0x6daa (incorrect -> 0x2e06), seq 1:43, ack 42, win 3635, options [nop,nop…

分苹果,若a ^ b ^ c = 0意味着:a 和 (b ^ c) 的值相等,或者 b 和 (a ^ c) 的值相等,以及 c 和 (a ^ b) 的值相等。

若a ^ b ^ c faultSum&#xff0c;那么faultSum 0时&#xff0c;即可产生上面的平分方案。说明可以满足二进制平分 #include<bits/stdc.h> using namespace std; int main() { int n; cin>>n; vector<int> weight(n); for(int i0;i<n;i) {…

【网络编程】基础知识

目录 网络发展史 局域网和广域网 局域网&#xff08;LAN&#xff09; 广域网&#xff08;Wan&#xff09; 光猫 路由器 网线 设备通信的要素 IP地址 基本概念 地址划分 特殊地址&#xff08;后续编程使用&#xff09; IP地址转换 字节序 网络模型 网络的体系结…

使用EVE-NG-锐捷实现静态路由

一、项目拓扑 二、项目实现 1、路由器R1配置 进入特权模式 enable 进入全局模式 configure terminal更改名称为R1 hostname R1关闭域名解析。在域名解析开启的情况下&#xff0c;输错的命令会当做域名进行解析&#xff0c;卡住30秒左右&#xff0c;直至解析超时 …