- 数据可视化
【免费下载链接】cytoscape.js
Graph theory (network) library for visualisation and analysis
导读
cy.userPanningEnabled()是 Cytoscape.js 核心视图接口(viewport)中的一项开关方法,用于启用或禁用用户通过鼠标拖拽、触摸滑动等方式手动平移画布的能力。它广泛应用于只读展示、编辑锁定、图表演示等需要固定视口的场景——本文将从 API 用法、初始化配置、与panningEnabled的职责区别、渲染器底层交互链路到序列化行为,完整讲解该方法的实战技巧与原理。
一、方法概览与基本用法
在 documentation/md/core/userPanningEnabled.md 中,官方文档给出了最直接的两个用法示例:
启用用户平移:
cy.userPanningEnabled( true );禁用用户平移:
cy.userPanningEnabled( false );调用后画布立即生效:禁用时,用户用鼠标拖拽空白区域或使用触摸手势,都无法再移动视图(pan);启用后恢复。
1.1 Getter / Setter 双模式
该方法同时具备读、写两种模式,实现在 src/core/viewport.mjs:
userPanningEnabled: function( bool ){ if( bool !== undefined ){ this._private.userPanningEnabled = bool ? true : false; } else { return this._private.userPanningEnabled; } return this; // chaining }- 写入模式:传入布尔值,状态被归一化(
bool ? true : false)后存入实例内部私有状态_private.userPanningEnabled; - 读取模式:不传参数时返回当前布尔状态,方便在事件回调或条件判断中查询;
- 链式调用:写入后返回
this(实例本身),因此可以连续串联其他配置方法,例如:
cy.userPanningEnabled( false ).userZoomingEnabled( false ).boxSelectionEnabled( false );1.2 默认值与初始化选项
该方法对应的初始化配置项同样名为userPanningEnabled,默认值为true(即默认允许用户平移)。在 src/core/index.mjs 中可以看到核心初始化逻辑:
userPanningEnabled: defVal( true, options.userPanningEnabled ),defVal的作用是:当传入的options.userPanningEnabled未定义时,回退到默认值true;只有显式配置了布尔值才采用配置值。因此既可以在创建实例时通过 options 预设,也可以实例化之后用方法动态切换:
const cy = cytoscape({ container: document.getElementById('cy'), elements: [ /* ... */ ], userPanningEnabled: false, // 初始化即锁定用户平移 userZoomingEnabled: false // 可同时锁定用户缩放 });二、userPanningEnabled 与 panningEnabled 的区别
Cytoscape.js 提供了两个名字相近、语义互补的开关,切勿混淆:
| 方法 | 作用范围 | 典型场景 |
|---|---|---|
cy.panningEnabled( bool ) | 总开关,同时影响用户交互平移与程序化cy.pan()/cy.panBy()调用 | 完全禁止任何形式的视图移动 |
cy.userPanningEnabled( bool ) | 仅控制用户输入(鼠标拖拽、触摸滑动)引发的平移 | 保留程序化平移能力,只禁止用户手动拖拽 |
从 src/extensions/renderer/base/load-listeners.mjs 的鼠标拖拽处理分支可以直观看到二者的配合关系:
if( cy.panningEnabled() && cy.userPanningEnabled() ){ // 计算位移 deltaP,然后执行 cy.panBy( deltaP ); cy.emit( makeEvent('dragpan') ); ... }只有两个开关同时为真,用户的拖拽才会被转换为实际的cy.panBy()平移。这意味着:
- 仅
panningEnabled(false):用户拖拽与程序化平移都被禁止; - 仅
userPanningEnabled(false):用户拖拽无效,但开发者仍可调用cy.pan()、cy.panBy()以编程方式移动视口(例如实现"回到初始位置""按步骤翻页"等产品功能)。
实战提示:在只读大屏、演示报告等场景中,推荐用
userPanningEnabled(false)而非panningEnabled(false),这样你依然可以借助 animate 与panBy驱动镜头移动,实现引导式讲解。
三、渲染器底层交互链路:这个开关到底拦住了什么
该开关的判定贯穿渲染器的整套输入监听逻辑,集中体现在 src/extensions/renderer/base/load-listeners.mjs 中。除了上面的拖拽平移,还有三处关键分支:
1. 拖拽与框选的互斥切换(L716-L719)
if( !r.hoverData.dragging && cy.boxSelectionEnabled() && ( multSelKeyDown || !cy.panningEnabled() || !cy.userPanningEnabled() ) ){ goIntoBoxMode(); // 进入框选模式 } else if( !r.hoverData.selecting && cy.panningEnabled() && cy.userPanningEnabled() ){ // 进入拖拽平移模式 }当userPanningEnabled为false时,按住鼠标拖拽不再平移画布,而是自动切换为框选(box selection)模式——这实际上是官方为"锁定平移同时保留多选"提供的默认行为。
2. 滚轮缩放的前置条件(L1120)
if( cy.panningEnabled() && cy.userPanningEnabled() && cy.zoomingEnabled() && cy.userZoomingEnabled() ){ // 处理滚轮缩放 }滚轮缩放必须同时满足四个开关。可见该开关与userZoomingEnabled彼此独立但共同构成交互权限矩阵,精细控制粒度需要四者组合使用。
3. 触摸双指捏合缩放(L1575)
} else if( capture && e.touches[1] && !r.touchData.didSelect && cy.zoomingEnabled() && cy.panningEnabled() && cy.userZoomingEnabled() && cy.userPanningEnabled() ){ // pinch to zoom }移动端双指捏合缩放同样要求四个开关全部为真。因此userPanningEnabled(false)在触屏设备上不仅禁止单指拖拽平移,还会连带禁用双指捏合缩放(若userZoomingEnabled未单独开启的话需按上述矩阵理解)。
结论:该开关不是一条简单的"视觉遮罩",而是深度介入渲染器的mousemove/wheel/touchmove事件管线,从事件源头上掐断平移手势的生效路径。
四、与 cy.json() 的序列化协同
视口交互配置是实例状态的一部分,会随cy.json()一并导出与导入。相关证据有两处:
- 导出侧:src/core/index.mjs 中
json.userPanningEnabled = _p.userPanningEnabled;会把当前开关状态写入 JSON; - 导入侧:src/core/index.mjs 将
userPanningEnabled列入fields列表,cy.json(obj)反序列化时会自动调用cy.userPanningEnabled(obj.userPanningEnabled)恢复状态。
对应测试用例也验证了这一点,见 test/core-graph-manipulation.mjs:
it('cy.json() sets userPanningEnabled', function(){ cy.json({ userPanningEnabled: false }); expect( cy.userPanningEnabled() ).to.equal( false ); cy.json({ userPanningEnabled: true }); expect( cy.userPanningEnabled() ).to.equal( true ); });此外 test/core-export.mjs 断言导出的 JSON 中userPanningEnabled属性与cy.userPanningEnabled()的当前值一致。这意味着你可以把"视图是否锁定"作为实例配置的一部分整体保存、加载,无需单独持久化额外字段。
五、实战组合:构建"锁定视图 + 程序化导航"的演示模式
综合以上原理,一个典型的演示 / 大屏场景配置如下:
const cy = cytoscape({ container: document.getElementById('cy'), style: [ /* 样式表 */ ], elements: [ /* 图数据 */ ], // 启动即进入"用户不可动、程序可动"的受控模式 userPanningEnabled: false, userZoomingEnabled: false }); // 但开发者依然可以驱动镜头:定位到指定节点并居中 cy.animate({ center: { eles: cy.getElementById('hub') }, zoom: 1.5, duration: 800 }); // 运行时按需解锁,允许用户自由浏览 document.getElementById('unlock-btn').addEventListener('click', () => { cy.userPanningEnabled( true ).userZoomingEnabled( true ); }); // 查询当前状态(用于 UI 状态同步) if( cy.userPanningEnabled() ){ // 更新按钮文案等 }关键要点回顾:
- 默认值为
true,初始化 options 与方法调用二选一即可生效; userPanningEnabled(false)只屏蔽用户手势,cy.pan()/cy.panBy()程序化平移不受影响;- 它同时影响拖拽平移、框选切换、滚轮缩放与双指捏合四条交互分支(见 load-listeners.mjs);
- 状态会随
cy.json()导入导出,可整体持久化。
六、小结
cy.userPanningEnabled()是 Cytoscape.js 交互权限体系中"用户平移"这一维度的唯一入口。理解它与panningEnabled、userZoomingEnabled的层级关系,以及其在渲染器事件管线中的判定位置,就能精确控制"哪些操作留给用户、哪些操作留给代码",从而在只读展示、受控演示与自由探索三种视图模式之间无缝切换。
- 数据可视化
【免费下载链接】cytoscape.js
Graph theory (network) library for visualisation and analysis
相关推荐
3步搞定用户行为分析:Redash漏斗图可视化实战指南
3步搞定用户行为分析:Redash漏斗图可视化实战指南 Redash是一个基于Python的高性能数据可视化平台,提供了丰富的数据可视化和分析工具,帮助用户轻松
数据可视化数据分析后端前端Cytoscape.js 视口平移 API 详解:cy.pan() 的绝对定位、坐标换算与事件机制
Cytoscape.js 视口平移 API 详解:cy.pan 的绝对定位、坐标换算与事件机制 本篇技术指南聚焦 Cytoscape.js 核心 API 中的
数据可视化Cytoscape.js 动画控制实战:使用 apply() 将动画精准步进到指定进度
Cytoscape.js 动画控制实战:使用 apply 将动画精准步进到指定进度 导读 在 Cytoscape.js 中, apply 是动画对象(Anima
数据可视化
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考