突破编程_前端_SVG(使用 svg-pan-zoom 库进行平移与缩放)

news2024/11/27 4:28:40

1 svg-pan-zoom 概述

svg-pan-zoom 是一个轻量级、高性能且易于使用的 JavaScript 库,专为增强 SVG 图像的浏览体验而设计。它提供了平移和缩放功能,使用户能够无缝探索大型或复杂的 SVG 图形。这个库允许用户对SVG图像进行交互操作,包括缩放、平移和旋转等,从而提供了更加灵活和交互式的 SVG 浏览体验。

在 svg-pan-zoom 中,可以通过配置选项来定制SVG的平移和缩放行为。例如,可以设置是否启用平移和缩放功能,控制缩放操作的敏感度,限制用户可以缩放到的最小和最大级别,以及调整SVG图像在视口中的显示方式等。此外,svg-pan-zoom 还提供了回调函数和事件处理机制,允许开发者在特定的 SVG 操作之前或之后执行自定义代码,以及处理自定义的 SVG 事件。

通过使用 svg-pan-zoom,开发者可以轻松地在他们的应用中实现交互式的 SVG 地图、图表或其他可视化元素,从而提升用户体验和应用的交互性。无论是在 Web 应用、移动应用还是桌面应用中,svg-pan-zoom 都能为 SVG 图像提供出色的浏览和交互功能。

2 svg-pan-zoom 的基本使用

2.1 引入 svg-pan-zoom

(1)通过 npm 安装 svg-pan-zoom

进入到指定的开发目录下,初始化 npm 项目(如果你的目录还不是一个 npm 项目,你需要初始化它。这将会创建一个 package.json 文件,其中包含你的项目依赖和其他元数据)。

npm init -y

(2)安装 svg-pan-zoom

使用 npm 安装 svg-pan-zoom 包。

npm install svg-pan-zoom --save

(3)在项目中引入 svg-pan-zoom

  • 可以使用 require 或 import 语句来引入 svg-pan-zoom。
// 使用 CommonJS 语法(Node.js)  
const svgPanZoom = require('svg-pan-zoom');  

// 或者使用 ES6 语法(例如,在模块化的前端项目中)  
import svgPanZoom from 'svg-pan-zoom';
  • 也可以通过 <script> 标签直接引入:
<script src="node_modules/svg-pan-zoom/dist/svg-pan-zoom.min.js"></script>

2.2 初始化 svg-pan-zoom

如下为样例代码:

<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta charset="UTF-8">  
    <meta name="viewport" content="width=device-width, initial-scale=1.0">  
    <title>SVG Pan Zoom Example</title>  
    <style>  
        /* 确保 SVG 元素有足够的空间来展示和缩放 */  
        #mySvg {  
            width: 400px;  
            height: 200px;  
            border: 1px solid black;  
        }  
    </style>  
</head>  
<body>  
    <svg id="mySvg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 200">  
        <!-- 你的 SVG 内容 -->  
        <rect x="50" y="50" width="100" height="50" fill="lightblue" />  
        <!-- ... 其他 SVG 元素 ... -->  
    </svg>  
  
    <!-- 引入 svg-pan-zoom 库(请确保路径正确) -->  
    <script src="node_modules/svg-pan-zoom/dist/svg-pan-zoom.min.js"></script>  
    <script>  
        // 等待 DOM 完全加载  
        document.addEventListener('DOMContentLoaded', function() {  
            // 获取 SVG 元素  
            var svgElement = document.getElementById('mySvg');  
  
            // 初始化 svg-pan-zoom  
            var obj = svgPanZoom(svgElement, {  
                // 这里可以配置选项,比如:  
                zoomEnabled: true, // 允许缩放  
                panEnabled: true,  // 允许平移  
                maxZoom: 10,       // 设置最大缩放级别  
                minZoom: 0.1,      // 设置最小缩放级别  
                // ... 其他配置选项 ...  
            });  
  
            // 你可以在这里添加更多的事件监听器或逻辑  
        });  
    </script>  
</body>  
</html>

在这里插入图片描述

上面的示例做了以下几件事情:

  • 创建了一个带有 id=“mySvg” 的 SVG 元素,并设置了 viewBox 属性以定义其坐标系统。
  • 引入了 svg-pan-zoom 的 JavaScript 文件。请注意,路径 node_modules/svg-pan-zoom/dist/svg-pan-zoom.min.js 是假设已经通过 npm 将 svg-pan-zoom 安装到了 node_modules 目录下。在实际部署时,可能需要将库文件复制到你的静态资源目录,并通过正确的 URL 引用它。
  • 在 DOMContentLoaded 事件触发后,我们获取了 SVG 元素的引用,并使用 svgPanZoom 函数初始化了一个实例。我们传递了 SVG 元素本身以及一个配置对象作为参数。在这个配置对象中,我们启用了缩放和平移功能,并设置了最大和最小缩放级别。
  • 初始化完成后,可以根据需要添加更多的事件监听器或逻辑来处理平移和缩放事件。

2 svg-pan-zoom 的属性

如下是 svg-pan-zoom 的属性的示例:

let panZoomTiger = svgPanZoom('#demo-tiger', {
  viewportSelector: '.svg-pan-zoom_viewport'
, panEnabled: true
, controlIconsEnabled: false
, zoomEnabled: true
, dblClickZoomEnabled: true
, mouseWheelZoomEnabled: true
, preventMouseEventsDefault: true
, zoomScaleSensitivity: 0.2
, minZoom: 0.5
, maxZoom: 10
, fit: true
, contain: false
, center: true
, refreshRate: 'auto'
, beforeZoom: function(){}
, onZoom: function(){}
, beforePan: function(){}
, onPan: function(){}
, onUpdatedCTM: function(){}
, customEventsHandler: {}
, eventsListenerElement: null
});

以下是配置属性的详细解释:

svg-pan-zoom 是一个强大的库,用于为 SVG 元素提供平移和缩放功能。以下是你提供的配置属性的详细解释:

  1. viewportSelector:

    • 描述: 这是一个选择器字符串,用于确定哪个元素将作为 SVG 的视口(viewport)。视口是 SVG 图像显示的区域。
    • : 一个 CSS 选择器字符串,例如 ‘.svg-pan-zoom_viewport’。
    • 用途: 将 SVG 图像嵌入到一个特定的容器中,并由这个容器的大小决定 SVG 的视口大小。
  2. panEnabled:

    • 描述: 是否启用平移功能。
    • : true 或 false。
    • 用途: 控制用户是否可以通过拖动鼠标来平移 SVG 图像。
  3. controlIconsEnabled:

    • 描述: 是否显示控制图标(如缩放和平移按钮)。
    • : true 或 false。
    • 用途: 如果你不希望显示默认的控制图标,可以将其设置为 false。
  4. zoomEnabled:

    • 描述: 是否启用缩放功能。
    • : true 或 false。
    • 用途: 控制用户是否可以通过鼠标滚轮或双击来缩放 SVG 图像。
  5. dblClickZoomEnabled:

    • 描述: 是否启用双击缩放功能。
    • : true 或 false。
    • 用途: 当用户双击 SVG 图像时,是否触发缩放操作。
  6. mouseWheelZoomEnabled:

    • 描述: 是否启用鼠标滚轮缩放功能。
    • : true 或 false。
    • 用途: 控制用户是否可以通过滚动鼠标滚轮来缩放 SVG 图像。
  7. preventMouseEventsDefault:

    • 描述: 是否阻止默认的鼠标事件。
    • : true 或 false。
    • 用途: 当设置为 true 时,库会尝试阻止某些默认的鼠标事件,以避免与 SVG-pan-zoom 的交互发生冲突。
  8. zoomScaleSensitivity:

    • 描述: 缩放操作的敏感度。
    • : 一个数字,例如 0.2。
    • 用途: 控制每次缩放操作导致的缩放级别变化的大小。
  9. minZoommaxZoom:

    • 描述: SVG 图像的最小和最大缩放级别。
    • : 数字,例如 0.5 和 10。
    • 用途: 限制用户可以缩放到的最小和最大级别。
  10. fit:

    • 描述: 是否在初始化时自动调整 SVG 的大小和位置,以适应视口。
    • : true 或 false。
    • 用途: SVG 图像在加载时自动适应其容器的大小。
  11. contain:

    • 描述: 当启用时,确保 SVG 图像始终完全显示在视口中,即使缩放级别很高。
    • : true 或 false。
    • 用途: 控制 SVG 图像是否始终在视口内完全可见。
  12. center:

    • 描述: 当启用时,SVG 图像会在视口中居中显示。
    • : true 或 false。
    • 用途: 控制 SVG 图像是否默认在视口中居中。
  13. refreshRate:

    • 描述: 刷新率设置,用于控制平移和缩放操作的平滑度。
    • : ‘auto’ 或一个数字(表示每秒的帧数)。
    • 用途: 当更精细地控制平移和缩放操作的性能。
  14. beforeZoom, onZoom, beforePan, onPan, onUpdatedCTM:

    • 描述: 这些是回调函数,用于在特定的 SVG 操作之前或之后执行自定义代码。
    • : 函数。
    • 用途: 允许开发者在平移、缩放或其他操作时执行自定义逻辑。
  15. customEventsHandler:

    • 描述: 一个对象,用于处理自定义事件。
    • : 一个对象,其属性是事件名称,值是处理这些事件的函数。
    • 用途: 允许开发者定义和处理自定义的 SVG 事件。
  16. eventsListenerElement:

    • 描述: 指定哪个元素应该监听平移和缩放事件。默认情况下,svg-pan-zoom 会在 SVG 元素本身上监听这些事件。但如果你希望在其他元素(比如一个覆盖层或特定的按钮)上监听这些事件,并触发 SVG 的平移和缩放,你可以使用这个选项来指定那个元素。
    • : 一个 DOM 元素或选择器的字符串。
    • 用途: 当应用结构需要更复杂的交互逻辑时,这个选项会很有用。

在配置 svg-pan-zoom 时,这些选项提供了丰富的定制性,使你能够根据你的具体需求来调整 SVG 的平移和缩放行为。

例如,如果你有一个响应式设计的网站,并且希望 SVG 图像能够随着视口大小的变化而自动调整大小和位置,你可以设置 fit 为 true,并可能还要设置 contain 为 true 以确保图像始终在视口中可见。

如果你想要更精细地控制用户的交互体验,你可以使用回调函数(如 beforeZoom 和 onZoom)来添加动画效果、更新 UI 元素或执行其他逻辑。

最后,通过调整 zoomScaleSensitivity、minZoom 和 maxZoom 等选项,你可以确保 SVG 图像的缩放级别在合理的范围内,并为用户提供平滑而一致的缩放体验。

3 svg-pan-zoom 的常用接口

  1. zoomIn():

    • 描述: 放大 SVG 元素。
    • 示例: svgPanZoomInstance.zoomIn();
  2. zoomOut():

    • 描述: 缩小 SVG 元素。
    • 示例: svgPanZoomInstance.zoomOut();
  3. reset():

    • 描述: 将 SVG 元素的视图重置到初始状态,包括缩放和平移。
    • 示例: svgPanZoomInstance.reset();
  4. panBy(dx, dy):

    • 描述: 按照指定的 x(dx)和 y(dy)偏移量平移 SVG 元素。
    • 示例: svgPanZoomInstance.panBy(100, 50); 这将使 SVG 元素向右移动 100 个单位,并向下移动 50 个单位。
  5. zoomAtPoint(scale, point):

    • 描述: 将 SVG 元素缩放到指定的缩放级别(scale)。
    • 参数: scale:目标缩放级别。大于 1 的值表示放大,小于 1 但大于 0 的值表示缩小。point:一个包含 x 和 y 坐标的对象,指定缩放操作的中心点。
    • 示例: svgPanZoomInstance.zoomAtPoint(2); 这将 SVG 元素放大到两倍大小。

样例代码如下:

<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta charset="UTF-8">  
    <meta name="viewport" content="width=device-width, initial-scale=1.0">  
    <title>SVG Pan Zoom Example</title>  
    <style>  
        /* 确保 SVG 元素有足够的空间来展示和缩放 */  
        #mySvg {  
            width: 400px;  
            height: 200px;  
            border: 1px solid black;  
        }  
    </style>  
</head>  
<body>  
    <svg id="mySvg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 200">  
        <!-- 你的 SVG 内容 -->  
        <rect x="50" y="50" width="100" height="50" fill="lightblue" />  
        <!-- ... 其他 SVG 元素 ... -->  
    </svg>  
  
    <!-- 引入 svg-pan-zoom 库(请确保路径正确) -->  
    <script src="node_modules/svg-pan-zoom/dist/svg-pan-zoom.js"></script>  
    <script>  
        // 等待 DOM 完全加载  
        document.addEventListener('DOMContentLoaded', function() {  
            var svgElement = document.getElementById('mySvg');  
			var svgPanZoomInstance = svgPanZoom(svgElement, {  
				// 配置选项  
			});  
			  
			// 假设我们有一个事件监听器,当用户点击 SVG 元素时触发缩放  
			svgElement.addEventListener('click', function(event) {  
				var rect = svgElement.getBoundingClientRect();  
				var point = {  
					x: event.clientX - rect.left,  
					y: event.clientY - rect.top  
				};  
				  
				// 以点击点为中心放大到两倍大小  
				svgPanZoomInstance.zoomAtPoint(2, point);  
			});
        });  
    </script>  
</body>  
</html>
  1. getSizes():

    • 描述: 返回当前 SVG 元素和视口的大小信息。
    • 返回值: 一个对象,包含 SVG 元素和视口的宽度和高度。
  2. destroy():

    • 描述: 销毁 svg-pan-zoom 实例,移除所有事件监听器和功能。
    • 示例: svgPanZoomInstance.destroy();

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

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

相关文章

Transformer的Decoder的输入输出都是什么

目录 1 疑问&#xff1a;Transformer的Decoder的输入输出都是什么 2 推理时Transformer的Decoder的输入输出 2.1 推理过程中的Decoder输入输出 2.2 整体右移一位 3 训练时Decoder的输入 参考文献&#xff1a; 1 疑问&#xff1a;Transformer的Decoder的输入输出都是什么 …

【Redis 神秘大陆】009 案例实践进阶

九、案例实践&进阶方案 9.1 本地缓存组件选型 使用缓存组件时需要重点关注集群方式、集群、缓存命中率。 需要关注集群组建方式、缓存统计&#xff1b;还需要考虑缓存开发语言对缓存的影响&#xff0c;如对于JAVA开发的缓存需要考虑GC的影响&#xff1b;最后还要特别关注…

CubelMX点灯

工程配置 开发板led引脚图 工程io配置 配置PB5 为输出 配置 PE5 为输出 时钟配置 写测试代码 配置工程&#xff0c;下载运行。 参考链接 STM32入门教程-1.点灯_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1dC41147eL/?spm_id_from333.788&vd_sourcee821a225c7b…

机器人交互新纪元:讯飞星火大模型引领升级浪潮

放眼全球&#xff0c;大模型浪潮从前沿话题到规模落地&#xff0c;传统计划和商业模式正在“重构”。依托大模型的持续迭代与快速升级&#xff0c;从文本生成、图像生成乃至视频生成&#xff0c;AI不断改变工作本质&#xff0c;为产业发展注入“超能量”。 当众多行业还在探索大…

NL2SQL进阶系列(5):论文解读业界前沿方案(DIN-SQL、C3-SQL、DAIL-SQL、SQL-PaLM)、新一代数据集BIRD-SQL解读

NL2SQL进阶系列(5)&#xff1a;论文解读业界前沿方案&#xff08;DIN-SQL、C3-SQL、DAIL-SQL&#xff09;、新一代数据集BIRD-SQL解读 NL2SQL基础系列(1)&#xff1a;业界顶尖排行榜、权威测评数据集及LLM大模型&#xff08;Spider vs BIRD&#xff09;全面对比优劣分析[Text2…

随笔-做好卖麻辣烫的准备

前两天突然接到宝哥的微信&#xff0c; 宝哥&#xff1a;有啥项目没有&#xff1f; 我&#xff1a;&#xff1f;啥项目&#xff1f; 宝哥&#xff1a;那个卖奶茶的。 我&#xff1a;什么情况&#xff0c;你要去卖奶茶啊。 宝哥&#xff1a;有这个打算&#xff0c;年前被裁…

CodeForce[1500-2000]——1946D Birthday Gift

codeforce刷题日记 题目大意:一道位运算有关的题&#xff0c;题目大意是给一个长度为n的整形数组&#xff0c;要求将其分成连续的k段&#xff0c;让每段的元素异或后的结果进行或运算&#xff0c;要让这个值<x&#xff0c;求k的最大值。 问题难点在分成k段的依据是什么&…

LeetCode 每日一题 Day 123-136

1379. 找出克隆二叉树中的相同节点 给你两棵二叉树&#xff0c;原始树 original 和克隆树 cloned&#xff0c;以及一个位于原始树 original 中的目标节点 target。 其中&#xff0c;克隆树 cloned 是原始树 original 的一个 副本 。 请找出在树 cloned 中&#xff0c;与 tar…

【k8s】:深入理解 Kubernetes 中的污点(Taints)与容忍度(Tolerations)

【k8s】&#xff1a;深入理解 Kubernetes 中的污点&#xff08;Taints&#xff09;与容忍度&#xff08;Tolerations&#xff09; 1、污点&#xff08;Taints&#xff09;2、容忍度&#xff08;Tolerations&#xff09;3、示例演示-测试污点的具体应用场景3.1 给节点打污点&…

【C++】类和对象③(类的默认成员函数:拷贝构造函数 | 赋值运算符重载)

&#x1f525;个人主页&#xff1a;Forcible Bug Maker &#x1f525;专栏&#xff1a;C 目录 前言 拷贝构造函数 概念 拷贝构造函数的特性及用法 赋值运算符重载 运算符重载 赋值运算符重载 结语 前言 本篇主要内容&#xff1a;类的6个默认成员函数中的拷贝构造函数…

算法练习第17天|104.二叉树的最大深度 、559.N叉树的最大深度

104.二叉树的最大深度 104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/maximum-depth-of-binary-tree/description/ 什么是二叉树的深度和高度&#xff1f; 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。最大深度…

03_信号和槽

信号和槽 系统的信号和槽自定义信号和槽Lambda表达式 系统的信号和槽 下面我们完成一个小功能&#xff0c;上面我们已经学习了按钮的创建&#xff0c;但是还没有体现出按钮的功能&#xff0c;按钮最大的功能也就是点击后触发一些事情&#xff0c;比如我们点击按钮&#xff0c;…

链表里面头节点存在的目的

头节点存在的目的&#xff1a; 在单链表的使用中&#xff0c;头结点&#xff08;Header Node&#xff09;是一个常用的概念&#xff0c;特别是在进行链表操作时。头结点不是数据域中实际存储的数据节点&#xff0c;而是作为链表操作的辅助节点&#xff0c;它包含对第一个实际数…

二路归并排序的算法设计和复杂度分析(C语言)

目录 实验内容&#xff1a; 实验过程&#xff1a; 1.算法设计 2.程序清单 3.运行结果 4.算法复杂度分析 实验内容&#xff1a; 二路归并排序的算法设计和复杂度分析。 实验过程&#xff1a; 1.算法设计 二路归并排序算法&#xff0c;分为两个阶段&#xff0c;首先对待排…

HADOOP大数据处理技术7-JavaSe

一粒尘埃 在空气中凝结 最后生成磅礴的风 ​ 生活有时会像一场暴风雨&#xff0c;狂风骤雨让人无法呼吸&#xff0c;但即使如此&#xff0c;也请记住&#xff0c;每一次风雨过后都会是一轮明媚的阳光。在黑暗中寻找光明&#xff0c;在困境中寻找希望&#xff0c;因为最终胜利属…

T细胞耗竭

目录 T Cell Exhaustion T 细胞衰竭路径上的细胞和分子路标 研究起源 介绍 T 细胞耗竭的发生路径 耗尽的T细胞亚群的解剖分离和迁移 持续TCR刺激的收益递减 通过共调节受体进行发育微调 细胞因子介导的耗尽T细胞亚群的特异性 T细胞耗竭和表观遗传 T Cell Exhaustion…

最新:阿里云服务器--学生优惠版购买以及配置方法

阿里云学生服务器免费申请&#xff0c;之前是云翼计划学生服务器9元/月&#xff0c;现在是高校计划&#xff0c;学生服务器可以免费申请&#xff0c;先完成学生认证即可免费领取一台云服务器ECS&#xff0c;配置为2核2G、1M带宽、40G系统盘&#xff0c;在云服务器ECS实例过期之…

Linux Docker容器安装和使用(最简洁快速方式)

Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的 Linux或Windows操作系统的机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不会有任何接口。本篇讲…

论文笔记:(INTHE)WILDCHAT:570K CHATGPT INTERACTION LOGS IN THE WILD

iclr 2024 spotlight reviewer 评分 5668 1 intro 由大型语言模型驱动的对话代理&#xff08;ChatGPT&#xff0c;Claude 2&#xff0c;Bard&#xff0c;Bing Chat&#xff09; 他们的开发流程通常包括三个主要阶段 预训练语言模型在被称为“指令调优”数据集上进行微调&…

25. 【Android教程】列表控件 ListView

在学习了 ScrollView 及 Adapter 两节内容之后&#xff0c;大家应该对 ListView 有了一些基本的了解&#xff0c;它是一个列表样式的 ViewGroup&#xff0c;将若干 item 按行排列。ListView 是一个很基本的控件也是 Android 中最重要的控件之一。它可以帮助我们完成多个 View 的…