ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

G6 画布操作实战:drag-canvas、scroll-canvas、zoom-canvas 与视口性能优化全指南

G6 画布操作实战:drag-canvas、scroll-canvas、zoom-canvas 与视口性能优化全指南 数据可视化前端图表库【免费下载链接】G6♾ A Graph Visualization Framework in JavaScript.项目地址https://gitcode.com/gh_mirrors/g6/G6点击查看免费下载导读本文基于 G6 官方示例分类「Canvas Manipulation画布操作」整理而成系统讲解 G6 图可视化框架中四类画布交互行为的配置与组合使用拖拽画布drag-canvas、滚动画布scroll-canvas、缩放画布zoom-canvas以及操作画布过程中的性能优化optimize-viewport-transform。阅读本文后你将掌握通过behaviors配置快速为图实例开启平移、滚动、缩放等视口操作能力理解各行为的完整配置项与默认值并学会用enable回调、direction、range等参数定制交互细节还能组合出类似「按住 Ctrl 缩放、滚动平移」的常见编辑类应用交互。一、示例总览六个画布操作 Demo在仓库packages/site/examples/behavior/canvas/目录下官方提供了「Canvas Manipulation」分类的完整示例meta.json 中登记了 6 个演示Demo 文件演示内容核心行为drag.js拖拽画布drag-canvasscroll-xy.jsXY 轴双向滚动scroll-canvasscroll-y.js仅 Y 轴滚动scroll-canvasdirection: yzoom.js缩放画布zoom-canvasoptimize.js拖拽缩放时隐藏元素optimize-viewport-transformscroll-and-zoom.js滚动 缩放组合scroll-canvaszoom-canvas所有示例共用同一套初始数据5 个节点node1 ~ node5与 6 条边组成的网格图并使用grid布局。下面先从公共部分讲起。二、公共骨架初始化图实例6 个 Demo 的初始化代码完全一致核心是import { Graph } from antv/g6; const graph new Graph({ container: container, layout: { type: grid, }, data: { nodes: [{ id: node1 }, { id: node2 }, { id: node3 }, { id: node4 }, { id: node5 }], edges: [ { source: node1, target: node2 }, { source: node1, target: node3 }, { source: node1, target: node4 }, { source: node2, target: node3 }, { source: node3, target: node4 }, { source: node4, target: node5 }, ], }, behaviors: [drag-canvas], }); graph.render();要点说明container指定图挂载的 DOM 容器 idlayout.type: grid将节点排布为网格避免节点重叠便于观察画布平移/缩放效果behaviors数组以字符串形式注册内置交互是本文的主角最后必须调用graph.render()才会真正绘制。三、拖拽画布drag-canvasdrag.js 演示了最基础的画布平移——按下鼠标左键拖拽即可移动整个视口配置只需一行behaviors: [drag-canvas],在源码 drag-canvas.ts 中DragCanvas的默认配置如下static defaultOptions: PartialDragCanvasOptions { enable: (event) { if (targetType in event) return event.targetType canvas; return true; }, sensitivity: 10, direction: both, range: Infinity, };3.1 完整配置项解析配置项类型默认值说明enableboolean \| (event) boolean仅在事件目标为画布时生效是否启用拖拽函数形式可在运行时按事件动态判断directionx \| y \| bothboth允许拖拽的方向x仅水平、y仅垂直rangenumber \| number[]Infinity可拖拽视口范围默认最多一屏支持[top, right, bottom, left]四向分别设置取值[0, Infinity]trigger{ up, down, left, right }指针按下拖拽改为按键触发时的方向键配置sensitivitynumber10按键触发时单次移动的像素距离animationViewportAnimationEffectTiming—是否启用拖拽动画仅按键移动时生效onFinish() void—拖拽完成回调3.2 底层实现原理从源码看DragCanvas的核心调用链是监听CommonEvent.DRAG_START/DRAG/DRAG_END三个事件drag-canvas.ts#L133-L135拖拽开始时调用canvas.setCursor(grabbing)切换光标拖拽过程中依次经过三个钳制clamp处理再执行平移clampByDirection按direction截断位移分量clampByRange基于画布中心与range构造可拖拽包围盒防止视口移出范围drag-canvas.ts#L206-L229clampByRotation根据画布当前旋转角对位移做旋转补偿保证旋转后拖拽方向依然符合直觉最终调用graph.translateBy(offset, animation)完成平移。值得注意enable默认只允许在事件目标是画布targetType canvas时拖拽因此默认情况下按住节点拖拽不会误平移画布这避免了与「拖拽节点」行为drag-element冲突。若要改成任意位置都能拖画布可显式传入enable: true。3.3 进阶用法示例behaviors: [ { type: drag-canvas, direction: x, // 只允许水平拖拽 range: [0, 2, 0, 2], // 上下不可拖左右最多 2 屏 enable: (event) event.targetType canvas, }, ],若需要键盘方向键移动画布可配置trigger与sensitivitybehaviors: [ { type: drag-canvas, trigger: { up: [ArrowUp], down: [ArrowDown], left: [ArrowLeft], right: [ArrowRight] }, sensitivity: 20, animation: { duration: 300 }, }, ],四、滚动画布scroll-canvasscroll-xy.js 演示鼠标滚轮双向滚动behaviors: [scroll-canvas],scroll-y.js 则通过对象配置限定只沿 Y 轴滚动behaviors: [{ type: scroll-canvas, direction: y }],4.1 配置项详解源码 scroll-canvas.ts 定义的默认值与选项static defaultOptions: PartialScrollCanvasOptions { enable: true, sensitivity: 1, preventDefault: true, range: Infinity, };配置项类型默认值说明enableboolean \| (event) booleantrue是否启用滚动directionx \| y不限只允许水平 / 垂直滚动rangenumber \| number[]Infinity可滚动视口范围默认最多一屏支持四向分别设置sensitivitynumber1滚动灵敏度位移按此倍数放大preventDefaultbooleantrue是否阻止页面默认滚动行为trigger{ up, down, left, right }滚轮改为键盘按键触发onFinish() void—滚动完成回调4.2 实现细节源码中的两个实现要点值得了解原生 wheel 事件绑定滚动行为直接在原生 canvas DOM 上监听wheel事件并以{ passive: false }方式注册scroll-canvas.ts#L128这样才能在 Chrome 中有效调用preventDefault()阻止页面随滚轮滚动位移处理链路onWheel中取event.deltaX / deltaY取反后经formatDisplacement依次乘以sensitivity、按direction钳制、按range钳制最终调用graph.translateBy(value, false)平移视口scroll-canvas.ts#L136-L142。若希望滚轮只滚动、不干扰页面滚动保持默认preventDefault: true即可若图嵌入在可滚动页面中希望滚动穿透可设为false。五、缩放画布zoom-canvaszoom.js 演示滚轮缩放behaviors: [zoom-canvas],5.1 配置项详解源码 zoom-canvas.ts 的默认配置static defaultOptions: PartialZoomCanvasOptions { animation: { duration: 200 }, enable: true, sensitivity: 1, trigger: [], preventDefault: true, };配置项类型默认值说明animationViewportAnimationEffectTiming{ duration: 200 }缩放动画配置enableboolean \| (event) booleantrue是否启用缩放函数形式可做条件缩放originPoint鼠标位置缩放中心点视口坐标triggerShortcutKey \| { zoomIn, zoomOut, reset }滚轮触发方式[Control]表示按住 Ctrl 滚动才缩放也可配置组合快捷键sensitivitynumber1缩放灵敏度preventDefaultbooleantrue是否阻止默认事件onFinish() void—缩放完成回调5.2 快捷键缩放示例除了滚轮trigger还支持组合快捷键behaviors: [ { type: zoom-canvas, trigger: { zoomIn: [Control, ], zoomOut: [Control, -], reset: [Control, 0], }, }, ],也可仅要求按住修饰键再滚轮缩放behaviors: [{ type: zoom-canvas, trigger: [Control] }],trigger为空数组默认时表示直接使用滚轮缩放。六、组合实战滚动 缩放的编辑类交互scroll-and-zoom.js 演示了把滚动与缩放组合成常见编辑器交互的关键技巧用enable回调区分双指捏合与双指滑动。behaviors: [ scroll-canvas, { key: custom-zoom-canvas, type: zoom-canvas, enable: (event) { // ctrlKey 为 true 时是双指捏合或扩张操作缩放false 时是双指滑动操作滚动 return event.ctrlKey; }, }, ],要点分析触摸板上双指操作时浏览器会产生带ctrlKey标记的 wheel 事件捏合/扩张缩放时ctrlKey true双指滑动平移时ctrlKey false于是scroll-canvas负责双指滑动平移zoom-canvas通过enable只在ctrlKey为真时响应缩放两者互不抢占注意给行为指定key字段custom-zoom-canvas便于后续通过setBehaviors/updateBehavior精确更新该行为实例。这套组合与主流的图编辑工具如流程图、脑图产品的交互习惯一致可直接作为移动端/触控板场景的默认方案。七、性能优化操作画布时隐藏元素optimize.js 针对大规模图场景在拖拽、缩放、滚动过程中临时隐藏非必要元素减少渲染开销操作结束后再恢复显示。node: { style: { labelText: (datum) datum.id, }, }, behaviors: [zoom-canvas, drag-canvas, scroll-canvas, optimize-viewport-transform],7.1 配置项详解源码 optimize-viewport-transform.ts 的默认配置static defaultOptions: PartialOptimizeViewportTransformOptions { enable: true, debounce: 200, shapes: (type: ElementType) type node, };配置项类型默认值说明enableboolean \| (event) booleantrue是否启用优化shapes{ node?, edge?, combo? } \| 函数仅节点保持可见指定操作期间始终可见的图形未指定的元素默认是边、Combo、标签等会被隐藏debouncenumber200操作结束后恢复显示的防抖时间毫秒7.2 底层机制OptimizeViewportTransform通过监听视口变换事件实现optimize-viewport-transform.ts#L108-L113在GraphEvent.BEFORE_TRANSFORM视口变换开始前调用hideShapes把节点以外的图形元素批量置为hidden在GraphEvent.AFTER_TRANSFORM变换结束后防抖 200ms 调用showShapes统一恢复可见。shapes的两种写法// 写法一按元素类型指定始终可见的 classname节点 边的 label 保持可见 behaviors: [ { type: optimize-viewport-transform, shapes: { node: [label], edge: [label] }, }, ], // 写法二函数式自定义返回 true 表示该图形保持可见 behaviors: [ { type: optimize-viewport-transform, shapes: (type, shape) type node || shape.className label, }, ],对于上万节点的大图叠加该行为后拖拽/缩放过程会明显更流畅debounce可根据交互手感适当调大如 300避免高频变换时频繁切换可见性。八、行为注册与按需使用以上四类行为均已内置在 G6 中通过 behaviors/index.ts 统一导出注册因此示例中直接用字符串drag-canvas、scroll-canvas、zoom-canvas、optimize-viewport-transform即可。使用对象形式时支持以下通用字段见 base-behavior.tstype行为类型名必填key行为唯一标识用于后续graph.updateBehavior(key, options)或graph.setBehaviors更新各行为专属配置如direction、range、enable等。九、常见问题与建议拖拽节点和拖拽画布如何共存drag-canvas的enable默认限定事件目标为画布节点上的拖拽交给drag-element行为处理两者默认即可共存无需额外配置。滚轮会带动页面滚动默认preventDefault: true已阻止页面滚动若需穿透显式设置preventDefault: false。移动端/触控板体验如何优化参考第六节组合方案scroll-canvas 带ctrlKey判定的zoom-canvas实现双指滑动平移、捏合缩放。大图卡顿怎么办启用optimize-viewport-transform并配合shapes保留节点或关键 label节点数量级较大时还可结合canvas配置与分层渲染方案。围绕本主题读者可进一步在仓库中查看 behavior 目录的 API 文档、drag-canvas 行为文档、scroll-canvas 行为文档、zoom-canvas 行为文档 以及对应的单元测试结合示例与源码深入掌握 G6 的画布交互体系。赞分享数据可视化前端图表库【免费下载链接】G6♾ A Graph Visualization Framework in JavaScript.项目地址https://gitcode.com/gh_mirrors/g6/G6点击查看免费下载相关推荐G6 交互行为Behavior入门实战用 drag-canvas、zoom-canvas、drag-element 打造可交互图谱G6 交互行为Behavior入门实战用 drag canvas、zoom canvas、drag element 打造可交互图谱 本文是 G6 图可视化数据可视化前端图表库G6 图可视化 zoom-canvas 缩放画布交互从配置项到源码级原理G6 图可视化 zoom canvas 缩放画布交互从配置项到源码级原理 zoom canvas 是 G6 https://link.gitcode.com/数据可视化前端图表库G6 拖拽画布行为drag-canvas完整指南配置、源码原理与测试验证G6 拖拽画布行为drag canvas完整指南配置、源码原理与测试验证 导读 drag canvas 是 AntV G6 图可视化框架中最常用的交互行为数据可视化前端图表库上一篇Translumo终极指南三分钟掌握免费实时屏幕翻译神器下一篇3分钟上手Translumo游戏玩家的实时屏幕翻译神器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表