
AntV X6 Scroller 滚动画布插件全解从配置项到源码实现【免费下载链接】X6 JavaScript diagramming library that uses SVG and HTML for rendering.项目地址: https://gitcode.com/GitHub_Trending/x6/X6本篇指南围绕 AntV X6 的Scroller滚动画布插件展开讲解如何为画布开启滚动与平移能力、通过分页和autoResize管理超大画布内容以及利用lockScroller、setScrollbarPosition等 API 精确控制视口。读完本文你将掌握Scroller的全部配置项语义、修饰键语法并理解其底层 DOM 结构与事件机制的实现原理。Scroller 插件能解决什么问题在 X6 中默认的Graph画布尺寸是固定的当节点被拖拽到画布边缘之外、或导入了一张远超容器尺寸的图数据时超出部分将不可见。Scroller插件通过在画布外层包裹一个可滚动的容器对应源码中的containerClass graph-scroller让视口能够自由滚动从而浏览任意大小的内容区域。从源码结构看Scroller采用门面 实现的双层架构src/plugin/scroller/index.ts 中的Scroller类实现GraphPlugin接口是暴露给用户的插件入口src/plugin/scroller/scroller.ts 中的ScrollerImpl才是真正构建 DOM、处理滚动、平移、分页和自动扩充的核心实现类。:::warning 注意 使用Scroller插件时会默认禁用画布的panning拖拽平移能力以避免冲突。这一行为在源码中有明确实现Scroller.init会调用autoDisableGraphPanning()见 src/plugin/scroller/index.ts当检测到 Graph 内置 panning 处于启用状态时将其关闭并输出警告滚动容器内的拖拽交由 Scroller 自己接管。 :::快速上手为画布启用滚动能力你可以通过插件Scroller启用画布滚动能力示例import { Graph, Scroller } from antv/x6 const graph new Graph({ background: { color: #F2F7FA, } }) graph.use( new Scroller({ enabled: true, }), )关键点说明graph.use(...)是 X6 标准的插件挂载方式Scroller在init(graph)时完成容器替换、事件绑定与画布居中见 src/plugin/scroller/index.ts。插件启用后Graph实例会自动获得一组lockScroller、unlockScroller、getScrollbarPosition、setScrollbarPosition等快捷方法这是通过 src/plugin/scroller/api.ts 中的模块声明扩展declare module注入到Graph.prototype上的。插件初始化完成后会调用scrollerImpl.center()将画布内容居中显示。完整的交互式演示代码位于 site/src/tutorial/plugins/scroller/index.tsx它展示了如何结合pageVisible、pageBreak、pannable等选项并通过centerContent()、centerCell()按钮体验居中定位效果。选项详解Scroller支持的完整选项如下表所示属性名类型默认值必选描述pannablebooleanfalse是否启用画布平移能力在空白位置按下鼠标后拖动平移画布classNamestring-附加样式名用于定制样式widthnumber-Scroller的宽度默认为画布容器宽度heightnumber-Scroller的高度默认为画布容器高度modifiersModifierKey-设置修饰键后需要点击鼠标并按下修饰键才能触发画布拖拽pageWidthnumber-每一页的宽度默认为画布容器宽度pageHeightnumber-每一页的高度默认为画布容器高度pageVisiblebooleanfalse是否分页pageBreakbooleanfalse是否显示分页符autoResizebooleantrue是否自动扩充/缩小画布。开启后移动节点/边时将自动计算需要的画布大小当超出当前画布大小时按照pageWidth和pageHeight自动扩充画布。反之则自动缩小画布minVisibleWidthnumber-当padding为空时有效设置画布滚动时画布的最小可见宽度minVisibleHeightnumber-当padding为空时有效设置画布滚动时画布的最小可见高度paddingnumber \| Padding-设置画布四周的 padding 边距。默认根据minVisibleWidth和minVisibleHeight自动计算得到保证画布滚动时在宽度和高度方向至少有minVisibleWidth和minVisibleHeight大小的画布可见上面的Padding类型定义如下type Padding { top: number; right: number; bottom: number; left: number }部分选项的默认值与源码实现从 src/plugin/scroller/scroller.ts 的defaultOptions可以看到minVisibleWidth、minVisibleHeight的默认值为50pageVisible、pageBreak默认为falseautoResize默认为true并且padding在未指定时是一个根据客户端尺寸自动计算的函数padding() { const size this.getClientSize() const minWidth Math.max(this.options.minVisibleWidth || 0, 1) || 1 const minHeight Math.max(this.options.minVisibleHeight || 0, 1) || 1 const left Math.max(size.width - minWidth, 0) const top Math.max(size.height - minHeight, 0) return { left, top, right: left, bottom: top } }也就是说padding默认保证视口任意方向上至少有minVisibleWidth×minVisibleHeight的画布内容可见当你显式传入padding时则以你的设置优先。此外getOptionssrc/plugin/scroller/scroller.ts还会在pageWidth/pageHeight未指定时回退到 Graph 的width/height并把 Graph 上已有的background配置迁移到 Scroller 的背景层。分页pageVisible 与 pageBreakpageVisible: true会让画布以pageWidth × pageHeight为单位分页画布内容被限制在整页网格内滚动pageBreak: true则进一步在页面交界处绘制虚线分隔线。这两个开关的底层由updatePageBreak()实现见 src/plugin/scroller/scroller.ts它会按Math.floor(graphWidth / pageWidth)与Math.floor(graphHeight / pageHeight)计算出需要绘制的纵向、横向分隔线数量并插入带有graph-pagebreak-vertical/graph-pagebreak-horizontal类名的div。对应的虚线样式定义在 src/plugin/scroller/style/raw.ts 中1px 宽的border-left: 1px dashed #bdbdbd。autoResize 自动扩充autoResize: true默认是滚动画布的核心体验。插件监听模型的reseted、cell:added、cell:removed、cell:changed事件见 src/plugin/scroller/scroller.ts任何节点或边的增删改都会触发update()内部调用graph.fitToContent(...)并按pageWidth/pageHeight作为网格步长重新计算画布尺寸从而实现内容超界自动扩充、内容收缩自动缩小。需要注意update()经过了 200ms 的debounce见 src/plugin/scroller/scroller.ts避免频繁操作导致性能问题。你还可以通过graph.updateScroller()手动触发一次重算。ModifierKey 修饰键语法ModifierKey的类型定义如下type ModifierKey string | (alt | ctrl | meta | shift | space)[] | null支持以下几种形式alt表示按下alt。[alt, ctrl]表示按下alt或ctrl。alt|ctrl表示按下alt或ctrl。altctrl表示同时按下alt和ctrl。alt|ctrlshift表示同时按下alt和shift或者同时按下ctrl和shift。这套语法的底层实现在 src/common/modifier/index.ts 的parseModifierKey中字符串以|分隔出或组or每组内再以分隔出与键and数组形式则整体作为或组。匹配时isModifierKeyMatch要求或组至少命中一个且与组全部按下从而支持任意复杂的组合表达式。典型使用当pannable: true但希望只在按住space时才进入平移模式避免与框选、拖拽节点冲突时可以配置graph.use( new Scroller({ enabled: true, pannable: true, modifiers: space, }), )从源码看Scroller的pannable选项还支持对象形式{ enabled: boolean, eventTypes: ArrayleftMouseDown | rightMouseDown }见 src/plugin/scroller/index.tseventTypes决定平移由左键还是右键触发默认监听blank:mousedown、node:unhandled:mousedown、edge:unhandled:mousedown三个事件进入平移准备src/plugin/scroller/index.ts。平移过程中通过修改容器dataset.panning切换grab/grabbing光标见 src/plugin/scroller/style/raw.ts。API以下 API 在Scroller插件启用后即可通过graph直接调用未启用插件时调用会安全返回graph自身或默认值见 src/plugin/scroller/api.ts。graph.lockScroller()禁止滚动。底层实现为将滚动容器的overflow设为hidden见 src/plugin/scroller/scroller.ts适合在需要锁定视口的场景如弹窗交互、演示模式使用。graph.unlockScroller()启用滚动。底层将容器的overflow恢复为scroll见 src/plugin/scroller/scroller.ts。graph.getScrollbarPosition()获取滚动条位置返回形如{ left: number, top: number }的对象。实现直接读取容器的scrollLeft/scrollTop见 src/plugin/scroller/scroller.ts。graph.setScrollbarPosition(left?: number, top?: number)设置滚动条位置。left?: number水平滚动条的位置缺省时表示水平方向不滚动。top?: number垂直滚动条的位置缺省时表示垂直方向不滚动。例如graph.setScrollbarPosition(100) graph.setScrollbarPosition(100, null) graph.setScrollbarPosition(null, 200) graph.setScrollbarPosition(100, 200)传入null表示该方向保持不变只有传入具体数值才会更新对应方向的滚动位置见 src/plugin/scroller/scroller.ts。更多定位与缩放能力除了原文档列出的滚动条 APIScroller还提供了一批实用的视口定位方法均可通过graph调用graph.center()/graph.centerContent()/graph.centerCell(cell)分别将画布、内容区域、指定节点居中到视口中央实现逻辑见 src/plugin/scroller/scroller.tsgraph.scrollToPoint(x, y)/graph.scrollToContent()/graph.scrollToCell(cell)轻量滚动只滚动到目标位置而不额外增加 paddingsrc/plugin/scroller/scroller.tsgraph.positionContent(top | right | ...)/graph.positionCell(cell, direction)将内容或节点定位到视口的八个方位之一src/plugin/scroller/scroller.tsgraph.zoomToFit()/graph.zoomToRect(rect)/graph.transitionToPoint(...)以动画过渡的方式缩放并滚动到指定区域src/plugin/scroller/scroller.ts。源码架构Scroller 是如何工作的理解内部结构有助于排查滚动、层级相关的问题。ScrollerImpl构造函数src/plugin/scroller/scroller.ts构建的 DOM 层级大致如下div.graph-scroller可滚动容器overflow: scroll └── div.graph-scroller-content内容层宽高随内容扩充 ├── div.graph-scroller-background背景层托管画布 background ├── div.x6-grid网格层非分页模式 └── div.x6-graph原 Graph 容器几个值得注意的设计背景迁移getOptions会把 Graph 已有的background配置搬到 Scroller 的背景层并清空原 Graph 背景src/plugin/scroller/scroller.ts背景绘制交由ScrollerImplBackground负责src/plugin/scroller/scroller.ts。事件代理空白区域的事件如blank:mousedown通过delegateBackgroundEvents从GraphView.events代理到 Scroller 容器上保证原有交互不失效src/plugin/scroller/scroller.ts。平移实现startPanning记录起始坐标后在mousemove中通过修改容器的scrollLeft/scrollTop实现拖动即滚动src/plugin/scroller/scroller.ts与滚轮滚动共用同一套滚动机制。打印/导出保位插件监听了before:print、before:export等事件暂存滚动位置并在after:print、after:export恢复避免导出图片时出现滚动偏移src/plugin/scroller/scroller.ts。测试覆盖与验证仓库中tests/plugin/scroller.spec.ts 对 Scroller 提供了系统性测试可作为理解行为与回归保障的参考pannable状态的获取、启用、禁用与切换isPannable/enablePanning/disablePanning/togglePanningzoom/zoomTo、center/centerPoint/positionRect等定位接口的参数转发滚动条位置读写getScrollbarPosition/setScrollbarPosition及插件未启用时的安全降级lock/unlock对overflow样式的修改平移完整流程startPanning→pan→stopPanning验证scrollLeft/scrollTop随鼠标位移的反向变化addPadding对内容层尺寸与 Graph 容器left/top的联动isCellVisible/isPointVisible的可见性判定。这些用例覆盖了本文讲解的绝大部分配置项与 API是深入了解Scroller行为的可靠参考。【免费下载链接】X6 JavaScript diagramming library that uses SVG and HTML for rendering.项目地址: https://gitcode.com/GitHub_Trending/x6/X6创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考