ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

G6 网格线插件(GridLine)完全指南:画布对齐辅助线的配置、跟随模式与实现原理

G6 网格线插件(GridLine)完全指南:画布对齐辅助线的配置、跟随模式与实现原理 数据可视化前端图表库【免费下载链接】G6♾ A Graph Visualization Framework in JavaScript.项目地址https://gitcode.com/gh_mirrors/g6/G6点击查看免费下载GridLine 是 G6 内置的画布辅助线插件通过绘制可定制的网格背景帮助用户在绘图过程中精准定位与对齐图形元素是搭建类设计器式图编辑体验的常用基础设施。本文以 GridLine 官方文档 为核心骨架结合 grid-line.ts 源码 与运行时事件机制系统讲解其全部配置项、跟随画布移动的两种模式、运行时动态更新技巧以及背后的 DOM CSS 实现原理读完即可在项目中快速落地并二次定制。概述网格线在 G6 中的定位网格线插件type: grid-line为画布提供视觉辅助线系统它的核心价值体现在三方面辅助精确绘图用户拖拽、放置节点时网格提供了可参照的坐标标尺提供视觉参照网格强化用户对画布空间与元素间距的感知降低误操作概率构建结构化参照系在设计、编辑类图应用如流程图编辑器、画板工具中网格是栅格化对齐体验的基础设施。从实现方式上看它并不参与 G6 自身的场景渲染场景由antv/g渲染到 canvas而是作为一个覆盖在画布之上的 DOM 层独立绘制网格因此它的渲染成本与图元数量无关即使面对上万节点的图网格本身依然轻量。快速开始最简单的接入方式将grid-line作为字符串直接放入plugins数组即可启用全部默认配置const graph new Graph({ // Other configurations... plugins: [grid-line], });也可以传入对象形式并显式指定插件标识与样式const graph new Graph({ plugins: [ { type: grid-line, key: my-grid-line, // 唯一标识用于动态更新或获取实例 size: 20, stroke: #0001, follow: true, }, ], });一个可运行的最小示例渲染单个节点并开启画布拖拽import { Graph } from antv/g6; const graph new Graph({ container: container, width: 300, height: 150, data: { nodes: [{ id: node-1, style: { x: 150, y: 75 } }] }, behaviors: [drag-canvas], plugins: [grid-line], }); graph.render();type: grid-line是 G6 内置注册的插件类型可在 build-in.ts 内置扩展注册表 中找到grid-line: GridLine的映射并在 插件统一导出入口 中确认GridLine类的导出因此无需额外引入即可使用。配置选项全解下表完整列出了 GridLine 插件的全部配置项与官方文档一致PropertyDescriptionTypeDefaultRequiredtype插件类型stringgrid-line✓key插件唯一标识用于获取插件实例或更新插件配置string-border是否显示画布边框booleantrueborderLineWidth边框线宽number1borderStroke边框颜色完整定义参考 CSS border-colorstring#eeeborderStyle边框样式完整定义参考 CSS border-stylestringsolidfollow是否跟随画布移动平移/缩放boolean | { translate?: boolean, zoom?: boolean }falselineWidth网格线宽number | string1size单个网格单元尺寸像素number20stroke网格线颜色string#eee这些默认值可以在 GridLine.defaultOptions 中逐一验证border: true、borderLineWidth: 1、borderStroke: #eee、borderStyle: solid、lineWidth: 1、size: 20、stroke: #eee。而follow在 GridLineOptions 接口注释 中标注默认值为false。各参数的作用与取值建议size网格单元尺寸控制相邻网格线的间距单位像素。数值越小网格越密。适合需要精细对齐的编辑场景设置 10~20需要宽松视觉参考时设置为 40 或更大。stroke/lineWidth网格线颜色与线宽stroke支持任意合法的 CSS 颜色值含透明度如#1890ff33这种带 alpha 通道的半透明写法lineWidth类型为number | string既可以直接给数值也可以给出1px这类字符串。border系列画布外框border控制是否绘制画布边界框borderLineWidth、borderStroke、borderStyle分别对应边框的宽度、颜色与样式solid、dashed、dotted等 CSS 取值。边框有助于把画布范围从页面背景中清晰地区分出来。key唯一标识当需要运行期通过graph.updatePlugin更新网格配置或通过graph.getPluginInstance拿到插件实例时必须为插件指定唯一的key。follow跟随模式控制网格是否随画布平移/缩放联动支持布尔值与对象两种形态详见下一节。follow网格如何跟随画布变换follow属性决定网格线是否跟随画布的视口变换平移与缩放支持两种配置方式1. 布尔配置一键开启整体跟随当设置为true时网格同时跟随画布的平移与缩放设置为false时网格静止在画布背景中// 同时开启平移与缩放跟随 const graph new Graph({ plugins: [ { type: grid-line, follow: true, }, ], });从源码看布尔值会被 parseFollow 归一化为{ translate: follow, zoom: follow }即布尔true等价于同时开启平移与缩放跟随。2. 对象配置平移与缩放分开控制当需要更精细的控制时使用对象形式分别指定translate与zoom// 只跟随平移不跟随缩放 const graph new Graph({ plugins: [ { type: grid-line, follow: { translate: true, // 跟随平移 zoom: false, // 不跟随缩放 }, }, ], }); // 只跟随缩放不跟随平移 const graph new Graph({ plugins: [ { type: grid-line, follow: { translate: false, // 不跟随平移 zoom: true, // 跟随缩放 }, }, ], });两种跟随的体验差异跟随缩放zoom: true网格单元尺寸会随画布缩放等比变化网格线相对画布内容保持位置关系使对齐参照在任意缩放级别下都保持相对内容的精度跟随平移translate: true网格随画布内容一起移动营造空间连续感避免拖拽画布后网格与内容脱节。实际项目中常见组合是跟随缩放但静止平移保持网格作为全局坐标系、两者都跟随完全贴合内容以及两者都不跟随网格作为固定页面背景。完整代码示例自定义网格样式按照业务视觉规范定制网格线颜色、粗细、单元大小与边框样式const graph new Graph({ // Other configurations... plugins: [ { type: grid-line, stroke: #1890ff33, // 蓝色半透明网格线 lineWidth: 2, size: 40, // 更大的网格单元 borderStroke: #1890ff, // 蓝色边框 borderLineWidth: 2, }, ], });运行效果import { Graph } from antv/g6; const graph new Graph({ container: container, width: 300, height: 150, data: { nodes: [{ id: node-1, style: { x: 150, y: 75 } }] }, behaviors: [drag-canvas], plugins: [ { type: grid-line, stroke: #1890ff33, // 蓝色半透明网格线 lineWidth: 2, size: 40, // 更大的网格单元 borderStroke: #1890ff, // 蓝色边框 borderLineWidth: 2, }, ], }); graph.render();网格跟随画布移动配合drag-canvas与zoom-canvas行为开启整体跟随const graph new Graph({ // Other configurations... behaviors: [drag-canvas, zoom-canvas], plugins: [ { type: grid-line, follow: true, // 网格跟随画布移动 }, ], });拖拽或缩放画布即可观察网格的跟随效果import { Graph } from antv/g6; const graph new Graph({ container: container, width: 300, height: 150, data: { nodes: [{ id: node-1, style: { x: 150, y: 75 } }] }, behaviors: [drag-canvas, zoom-canvas], plugins: [ { type: grid-line, follow: true, // 网格跟随画布移动 }, ], }); graph.render();运行期动态更新网格利用key标识 graph.updatePlugin在运行时切换网格尺寸、颜色等配置无需重建图实例// 初始配置 const graph new Graph({ // Other configurations... plugins: [ { type: grid-line, key: my-grid, size: 20, }, ], }); // 运行期动态更新 graph.updatePlugin({ key: my-grid, size: 40, // 更新网格尺寸 stroke: #ff4d4f, // 更新网格颜色 });updatePlugin的语义可在 graph.ts 的 updatePlugin 实现 中看到它按key匹配插件配置并做浅合并后重新设置插件集最终由 PluginController.setPlugins 完成增量更新。对应地GridLine的 update 方法 会同步刷新baseSize并重算样式因此size等参数的改动会即时生效。实战案例网格 布局 控制面板联动以下案例将网格线、grid布局与 gui 控制面板组合通过面板开关follow实时观察网格在静止与跟随之间的切换效果import { Graph } from antv/g6; const data { nodes: [{ id: node-0 }, { id: node-1 }, { id: node-2 }, { id: node-3 }, { id: node-4 }, { id: node-5 }], edges: [ { source: node-0, target: node-1 }, { source: node-0, target: node-2 }, { source: node-0, target: node-3 }, { source: node-0, target: node-4 }, { source: node-1, target: node-0 }, { source: node-2, target: node-0 }, { source: node-3, target: node-0 }, { source: node-4, target: node-0 }, { source: node-5, target: node-0 }, ], }; const graph new Graph({ container: container, data, layout: { type: grid }, behaviors: [drag-canvas], plugins: [{ key: grid-line, type: grid-line, follow: false }], }); graph.render(); window.addPanel((gui) { gui .add({ follow: false }, follow) .name(Follow) .onChange((value) { graph.updatePlugin({ key: grid-line, follow: value, }); }); });这个案例展示了三个实战要点其一follow可以在运行期通过updatePlugin平滑切换其二key必须与初始配置保持一致才能命中更新目标其三网格线可与布局算法此处为grid布局协同形成网格 栅格化排列的一致视觉语言。源码解读网格线是如何画出来的GridLine 的渲染不依赖 canvas 绘制指令而是纯 DOM CSS 实现理解这一点有助于你按需定制。覆盖层容器构造时插件通过 createPluginContainer(grid-line, true) 创建一个覆盖整个画布的div并挂载到 canvas 容器的最前面prepend。该容器具备以下关键样式gridArea: 1 / 1 / 2 / 2、inset: 0与画布容器等尺寸叠加overflow: hidden网格绘制超出画布区域时自动裁剪pointerEvents: none不拦截任何鼠标事件网格层下方的拖拽、缩放等行为不受影响。这也是网格与内容分层的关键网格永远位于场景之上可见但交互上完全透明。网格线的 CSS 绘制updateStyle 方法 用两条互相垂直的渐变背景叠加出网格线background-image: linear-gradient(stroke lineWidth, transparent lineWidth), linear-gradient(90deg, stroke lineWidth, transparent lineWidth); background-size: scaledSize scaledSize; background-repeat: repeat;第一条linear-gradient产生水平方向网格线第二条旋转 90° 产生垂直方向网格线两者叠加即形成网格background-size由baseSize * currentScale计算得出——这正是缩放跟随的载体边框则由border: ${borderLineWidth}px ${borderStyle} ${borderStroke}直接设置border: false时置为none。变换跟随的事件链路GridLine 通过监听视口变换事件实现跟随视口发生平移/缩放时viewport.ts 的 transform 方法 在变换完成后派发GraphEvent.AFTER_TRANSFORM事件事件名aftertransform定义于 graph 事件常量事件载荷是 ViewportEvent携带translate、scale、origin等变换数据bindEvents 中graph.on(GraphEvent.AFTER_TRANSFORM, this.onTransform)完成监听onTransform 依据follow解析结果分派到followZoom/followTranslate。平移跟随followTranslate的核心是把事件携带的位移增量累加到backgroundPosition并通过mod取模运算让偏移量始终落在单个网格单元范围内避免数值无限累积。缩放跟随followZoom的核心是一个保持锚点不动的坐标换算计算缩放前后比例deltaScale以缩放原点origin无缩放原点时退化为画布中心为不动点将网格偏移量按1 - deltaScale反推平移补偿同时把backgroundSize更新为baseSize * scale从而让网格在缩放过程中始终钉住画布上的同一点。这也是跟随缩放时网格保持相对内容位置的数学来源。生命周期销毁destroy 方法 会解绑AFTER_TRANSFORM监听并移除 DOM 容器避免内存泄漏与残留类型安全GridLineOptions接口grid-line.ts 顶部对所有配置项提供了完整的 TypeScript 类型标注与默认值说明配合GridLineOptions类型导出插件类型导出可获得 IDE 智能提示。相关参考插件官方文档英文版GridLine.en.md中文版见 GridLine.zh.md插件 API 速查plugins/grid-line.md插件源码packages/g6/src/plugins/grid-line.ts插件基类与容器工具base-plugin.ts、dom.ts内置注册表packages/g6/src/registry/build-in.ts视口变换与插件运行时runtime/viewport.ts、runtime/plugin.ts演示与测试GridLine 相关的可视化 demo 见 packages/g6/tests/demos/plugin-grid-line.ts单元测试见 packages/g6/tests/unit/plugins/grid-line.spec.ts。赞分享数据可视化前端图表库【免费下载链接】G6♾ A Graph Visualization Framework in JavaScript.项目地址https://gitcode.com/gh_mirrors/g6/G6点击查看免费下载相关推荐G6 网格线插件GridLine完全指南辅助绘图对齐的配置、跟随模式与源码实现解析G6 网格线插件GridLine完全指南辅助绘图对齐的配置、跟随模式与源码实现解析 网格线GridLine是 G6 内置的辅助绘图插件通过为画布叠加数据可视化前端图表库G6 网格线 GridLine 插件为画布构建精准对齐的辅助参考系G6 网格线 GridLine 插件为画布构建精准对齐的辅助参考系 网格线GridLine是 G6 内置的画布辅助插件通过铺满画布的等距网格为节点定位、数据可视化前端图表库G6 Grid Line 网格线插件实战配置项、跟随模式与源码原理全解析G6 Grid Line 网格线插件实战配置项、跟随模式与源码原理全解析 G6AntV G6的 Grid Line 网格线插件用于在画布上绘制背景网格为数据可视化前端图表库上一篇OpenWhispr网络允许列表设计看懂隐私优先应用的全部流量去向下一篇Kindle漫画转换终极指南使用KCC实现完美电子墨水屏阅读体验创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表