---
title: 对齐线 Snapline
order: 13
---
## 概述
对齐线插件为画布提供智能对齐参考线,在移动节点时自动显示辅助线并支持自动吸附,帮助用户实现精确对齐,是图形编辑中提升效率和精确度的重要工具。
## 使用场景
对齐线插件主要适用于以下场景:
- 手动调整节点位置时,需要与其他节点精确对齐
- 拖拽移动多个节点时,保持它们之间的对齐关系
- 制作规范的图形布局时,确保节点间距和位置的一致性
- 通过自动吸附功能提高节点排版效率
## 基本用法
以下是一个简单的 Snapline 插件初始化示例:
```js
const graph = new Graph({
plugins: [
{
type: 'snapline',
key: 'my-snapline', // 指定唯一标识符
tolerance: 5, // 对齐吸附阈值
offset: 20, // 对齐线延伸距离
autoSnap: true, // 启用自动吸附
},
],
});
```
## 在线体验
## 配置项
| 属性 | 描述 | 类型 | 默认值 | 必选 |
| ------------------- | ----------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ----------------------- | ---- |
| type | 插件类型 | string | `'snapline'` | ✓ |
| key | 插件唯一标识符 | string | - | |
| tolerance | 对齐精度,即触发对齐的距离阈值 | number | 5 | |
| offset | 对齐线头尾的延伸距离 | number | 20 | |
| autoSnap | 是否启用自动吸附 | boolean | true | |
| shape | 指定元素的参照图形:
- `'key'`: 使用元素的主图形作为参照图形
- `Function`: 传入函数时接收元素对象,返回一个图形 | string \| ((node: Node) => DisplayObject) | `'key'` | |
| verticalLineStyle | 垂直对齐线样式 | 支持[BaseStyleProps](/manual/element/shape/properties#baseshapestyle) 下的部分配置,详见[「对齐线样式配置项」](#对齐线样式配置) | `{ stroke: '#1783FF' }` | |
| horizontalLineStyle | 水平对齐线样式 | 支持[BaseStyleProps](/manual/element/shape/properties#baseshapestyle) 下的部分配置,详见[「对齐线样式配置项」](#对齐线样式配置) | `{ stroke: '#1783FF' }` | |
| filter | 过滤不需要参与对齐的节点 | (node: Node) => boolean | `() => true` | |
### shape
`shape` 属性用于指定元素的参照图形,支持以下配置方式:
```js
// 使用主图形作为参照
{
type: 'snapline',
shape: 'key'
}
// 使用自定义函数返回参照图形
{
type: 'snapline',
shape: (node) => {
return node.getShape('custom-shape');
}
}
```
### 对齐线样式配置
| 配置项 | 说明 | 类型 | 默认值 |
| -------------- | --------------- | ---------------------------------------- | ----------- |
| stroke | 线条颜色 | string \| Pattern \| null | `'#1783FF'` |
| opacity | 整体透明度 | number \| string | 1 |
| strokeOpacity | 描边透明度 | number \| string | 1 |
| lineWidth | 线宽度 | number \| string | 1 |
| lineCap | 线段端点样式 | `'butt'` \| `'round'` \| `'square'` | `'butt'` |
| lineJoin | 线段连接处样式 | `'miter'` \| `'round'` \| `'bevel'` | `'miter'` |
| lineDash | 虚线配置 | number \| string \| (string \| number)[] | - |
| lineDashOffset | 虚线偏移量 | number | 0 |
| shadowBlur | 阴影模糊程度 | number | 0 |
| shadowColor | 阴影颜色 | string | - |
| shadowOffsetX | 阴影 X 方向偏移 | number | 0 |
| shadowOffsetY | 阴影 Y 方向偏移 | number | 0 |
| cursor | 鼠标样式 | string | `'default'` |
| zIndex | 渲染层级 | number | 0 |
示例配置
```js
{
type: 'snapline',
horizontalLineStyle: {
stroke: '#F08F56',
strokeOpacity: 0.8,
lineWidth: 2,
lineDash: [4, 4],
lineDashOffset: 0,
opacity: 1,
cursor: 'move',
},
verticalLineStyle: {
stroke: '#17C76F',
strokeOpacity: 0.8,
lineWidth: 2,
lineDash: [4, 4],
lineDashOffset: 0,
opacity: 1,
cursor: 'move',
},
}
```
## 代码示例
### 基础对齐线
最简单的使用方式:
```js
const graph = new Graph({
plugins: ['snapline'],
});
```
### 自定义配置
可以根据需要自定义对齐线的行为:
```js
const graph = new Graph({
plugins: [
{
type: 'snapline',
tolerance: 8, // 更大的吸附范围
offset: 30, // 更长的延伸线
horizontalLineStyle: {
stroke: '#1890ff',
lineWidth: 2,
},
filter: (node) => node.id !== 'node-0', // 根据id过滤节点,不参与对齐
},
],
});
```
## 实际案例
```js | ob { inject: true }
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', 'drag-element'],
plugins: [
{
type: 'snapline',
key: 'snapline',
verticalLineStyle: { stroke: '#F08F56', lineWidth: 2 },
horizontalLineStyle: { stroke: '#17C76F', lineWidth: 2 },
autoSnap: false,
},
],
});
graph.render();
```