jsPlumb导航器
开源项目地址:https://gitee.com/easyxaf/jsplumb-navigator
前言
jsPlumb可用于连接DOM元素,它不依赖框架,所以与主流框架都可以无缝的集成。但比较遗憾的是社区版中没有平移、缩放等功能,如果用它来开发工作流等项目,用户体验会大打折扣。我的项目是用Blazor开发的,在比较了多款开源流程图后,最终选择了jsPlumb,所以需要为其单独开发一个导航器。
jsPlumb社区版文档:https://docs.jsplumbtoolkit.com/community/6.x/
演示
思路
这里用到了两个名词,viewport(视口)与canvas(画布),视口是有大小的,画布是没有边界的,视口是我们观察画布的窗口,你可以把视口比作放大镜,平移可以观察到画布的不同位置,远近可对画布进行放大或缩小。
在jsPlumb中,需要一个容器(container)承载节点,本项目中画布(canvas)就是jsPlumb所需要的容器,视口(viewport)就是画布的父节点。
在有了上面的概念后,就能够轻松的理解源码中一些变量的命名。
使用
下面是DOM结构
<body>
<div id="viewport">
<div id="canvas"></div>
</div>
</body>
下面是CSS样式
#viewport {
position: relative;
width: 100%;
height: 100%;
background-color: white;
overflow: hidden;
}
#canvas {
position: absolute;
}
上面只是一个示例,id不是必需的,canvas的position需要设置为absolute,并且不要设置canvas的大小,canvas当前的width与height应该都为0,同时overflow为visible,这些都是默认值,无需显式设置,viewport需要一个大小,并且需要将overflow设置为hidden。
将jsplumb-navigator.js添加到html中,并在初始化完jsplumb后,使用window.createJsPlumbNavigator方法创建一个导航器。
下面是示例代码
jsPlumb.ready(() => {
const canvasEle = document.getElementById('canvas');
const instance = jsPlumb.newInstance({ container: canvasEle });
instance.connect({
source: document.getElementById('node1'),
source: document.getElementById('node2'),
anchors: ['Bottom', 'Top']
});
window.createJsPlumbNavigator(instance);
});
window.createJsPlumbNavigator方法还可以传入一个options,用于配置导航器
下面是options的默认值
const defaultOptions = {
miniMapWidth: 200,
miniMapHeight: 150,
miniMapPosition: 'bottom-right',
toolbarPosition: 'bottom-left',
disableMiniMap: false,
disableToolbar: false,
};
options可以设置miniMap的宽度与高度,toolbar与miniMap的位置,位置有4个,分别为 top-left、top-right、bottom-right、bottom-left,toolbar默认在左下角,miniMap默认在右下角,同时也可以禁用toolbar与miniMap
window.createJsPlumbNavigator方法还会返回一个navigator对象,你可以直接使用navigator对象中提供的方法直接操作导航器
下面是导出的navigator对象
window.createJsPlumbNavigator = (jsPlumbInstance, options) => {
const defaultOptions = {
miniMapWidth: 200,
miniMapHeight: 150,
miniMapPosition: 'bottom-right',
toolbarPosition: 'bottom-left',
disableMiniMap: false,
disableToolbar: false,
};
const navigator = new Navigator(jsPlumbInstance, { ...defaultOptions, ...options });
return {
getZoom: navigator.getCanvasScale.bind(navigator),
zoomTo: navigator.zoomTo.bind(navigator),
zoomIn: navigator.zoomIn.bind(navigator),
zoomOut: navigator.zoomOut.bind(navigator),
zoomTo100: navigator.zoomTo100.bind(navigator),
bestFit: navigator.bestFit.bind(navigator),
fitToViewport: navigator.fitToViewport.bind(navigator),
getMiniMapVisible: navigator.getMiniMapVisible.bind(navigator),
showMiniMap: navigator.showMiniMap.bind(navigator),
hideMiniMap: navigator.hideMiniMap.bind(navigator),
getToolbarVisible: navigator.getToolbarVisible.bind(navigator),
showToolbar: navigator.showToolbar.bind(navigator),
hideToolbar: navigator.hideToolbar.bind(navigator),
dispose: navigator.dispose.bind(navigator),
};
};
其中fitToViewport方法是用于将画布内容完全显示在视口中,bestFit方法是最佳匹配画布到视口中,它的缩放范围是0.5到1,在这个范围内将画布显示在视口中。你可以禁用toolbar后,通过navigator对象中的方法创建自己的toolbar
下面的示例代码禁用了toolbar,并将miniMap放置到了右上角,同时将画布全部显示在视口中。
const navigator = window.createJsPlumbNavigator(instance, {
miniMapPosition: 'top-right',
disableToolbar: true,
});
navigator.fitToViewport();
操作
- 鼠标左键放在画布空白处或miniMap中拖放可平移画布
- 鼠标滚轴放在画布中滚动将上下平移画布,按下Ctrl键将缩放画布
- 鼠标滚轴放在miniMap中滚动将缩放画布
https://www.cnblogs.com/haoxj/p/18064973
jsPlumb导航器的更多相关文章
- jsPlumb的简单使用
jsPlumb概述jsPlumb是一个在dom元素之间绘制连接线的javascript框架,它使用svg技术绘制连接线. 基本概念很明显,一个连线主要要解决的问题包括谁和谁连,在哪里连(连接点在哪里) ...
- RCP:导航器视图删除操作快捷键失效的解决方案
导航器视图按下“Delete”的时候,会触发删除节点的操作.如果失效,按以下步骤检查: 1.在要删除的节点上点击右键,确定删除操作是否生效.如果没有生效,则按下列位置 a)检查navigator扩展配 ...
- RCP:为指定的导航器添加上下文菜单
可以参考Eclipse的Help->Help Content下的: Platform Plug-in Developer Guide > Programmer's Guide > P ...
- 使用 jsPlumb 绘制拓扑图 —— 异步加载与绘制的实现
本文实现的方法可以边异步加载数据边绘制拓扑图. 有若干点需要说明一下: 1. 一次性获取所有数据并绘制拓扑图, 请参见文章: <使用 JsPlumb 绘制拓扑图的通用方法> ; 本文实现 ...
- 使用jsPlumb制作流程图设计器
jsPlumb是一个比较强大的绘图组件,它提供了一种方法,主要用于连接网页上的元素.在现代浏览器中,它使用SVG或者Canvas技术,而对于IE8以下(含IE8)的古董浏览器,则使用VML技术. 项目 ...
- jsPlumb插件做一个模仿viso的可拖拉流程图
前言 这是我第一次写博客,心情还是有点小小的激动!这次主要分享的是用jsPlumb,做一个可以给用户自定义拖拉的流程图,并且可以序列化保存在服务器端. 我在这次的实现上面做得比较粗糙,还有分享我在做j ...
- jsPlumb 学习笔记
介绍 使用svg完成画图,四个概念: anchor: endpoint在的位置,可通过name访问 endpoint:connection的一端节点,通过addPoint makeSource, co ...
- jsPlumb
官网:https://jsplumbtoolkit.com GitHub:https://github.com/sporritt/jsplumb/ 初始化 jsPlumb只有等到DOM初始化完成之后才 ...
- 使用 jsPlumb 绘制拓扑图 —— 异步载入与绘制的实现
本文实现的方法能够边异步载入数据边绘制拓扑图. 有若干点须要说明一下: 1. 一次性获取全部数据并绘制拓扑图. 请參见文章: <使用 JsPlumb 绘制拓扑图的通用方法> ; 本文实现 ...
- 使用 Eclipse 的 Navigator Link Helper 实现导航器与编辑器的关联
概要 Link With Editor 是 Eclipse 内置功能中十分小巧,但却异常实用的一个功能.这个开关按钮 (Toggle Button) 出现在各式导航器视图 ( 例如 Resource ...
随机推荐
- 从零开始配置vim(21)——lsp简介与treesitter 配置
截止到上一篇文章,我们配置了neovim的很多内容了.具备了一些编辑器的常用功能了,而且可以胜任日常的文档编辑工作了.但是想作为一个可靠的代码编辑器还缺少重要的一环,即代码语法部分的支持. 在过去的v ...
- 卧槽!这 5 个后端程序员学习指南竟然斩获超过 350k 的 star
前段时间弄应届生学习指南的时候,整理了几个不错的开源文档,分享给小伙伴们!我觉得应该可以对大家有帮助. 本期文章对应的视频地址:https://www.bilibili.com/video/BV1xZ ...
- Solon 框架启动为什么特别快?
思来想去!可能与 Solon 容器的独立设计有一定关系. 1.Solon 注解容器的运行特点 有什么注解要处理的(注解能力被规范成了四种),提前注册登记 全局只扫描一次,并在扫描过程中统一处理注解相关 ...
- Python自动化办公--Pandas玩转Excel数据分析【三】
相关文章: Python自动化办公--Pandas玩转Excel[一] Python自动化办公--Pandas玩转Excel数据分析[二] python处理Excel实现自动化办公教学(含实战)[一] ...
- C/C++ Qt 基本文件读写方法
Qt文件操作有两种方式,第一种使用QFile类的IODevice读写功能直接读写,第二种是利用 QFile和QTextStream结合起来,用流的方式进行文件读写. 第一种,利用QFile中的相关函数 ...
- 【scikit-learn基础】--『分类模型评估』之系数分析
前面两篇介绍了分类模型评估的两类方法,准确率分析和损失分析,本篇介绍的杰卡德相似系数和马修斯相关系数为我们提供了不同的角度来观察模型的性能,尤其在不平衡数据场景中,它们更能体现出其独特的价值. 接下来 ...
- Docker从认识到实践再到底层原理(五)|Docker镜像
前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助. 高质量博客汇总 然后就是博主最近最花时间的一 ...
- 安装TFA用于快速收集RAC各类日志
TFA一般主要用于Oracle RAC环境一键收集需要的日志进行分析问题,解决传统人工收集集群.数据库等各类日志效率低下的问题.具体关于TFA的介绍,网上资料已经非常多,在此不再赘述. TFA的安装也 ...
- 《ASP.ENT Core 与 RESTful API 开发实战》-- (第4章)-- 读书笔记(上)
第 4 章 资源操作 4.1 项目创建 从本章起,我们将创建一个在线图书馆项目,通过这个 Web API 应用程序来实际地熟悉并掌握如何使用 ASP.NET Core 创建 RESTful API 应 ...
- Java-统计程序运行的时长(计算两个时间相差的毫秒数、秒数)
最近在做Hbase的查询性能验证,需要统计查询的执行时长,所以需要统计开始时间和结束时间的时间差. 下面是使用SimpleDateFormat和Date计算时间差(相差毫秒数)的程序示例,仅供参考. ...