---
title: LassoSelect
order: 12
---
## Overview
Click and drag the mouse to draw an **irregular** box to enclose elements, and the elements within the selected range will be selected.
## Use Cases
This behavior is mainly used for:
- Quickly selecting a batch of elements, making it easier to avoid elements you don't want to select
- Quickly deselecting a batch of elements, making it easier to avoid elements you want to keep
## Online Experience
## Basic Usage
Add this behavior in the graph configuration:
**1. Quick Configuration (Static)**
Declare directly using a string form. This method is simple but only supports default configuration and cannot be dynamically modified after configuration:
```javascript
const graph = new Graph({
// Other configurations...
behaviors: ['lasso-select'],
});
```
**2. Object Configuration (Recommended)**
Configure using an object form, supporting custom parameters, and can dynamically update the configuration at runtime:
```javascript
const graph = new Graph({
// Other configurations...
behaviors: [
{
type: 'lasso-select',
key: 'lasso-select',
immediately: true, // Elements are immediately selected when the box encloses them
trigger: ['shift', 'alt', 'control'], // Use multiple keys for selection
},
],
});
```
## Configuration Options
| Option | Description | Type | Default | Required |
| --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | ------------------------- | -------- |
| type | Behavior type name. This plugin is built-in, you can use it by `type: 'lasso-select'`. | `lasso-select` \| string | `lasso-select` | ✓ |
| animation | Whether to enable animation | boolean | false | |
| enable | Whether to enable lasso selection | boolean \| ((event: [Event](/api/event#event-object-properties)) => boolean) | true | |
| enableElements | Types of elements that can be selected | ( `node` \| `edge` \| `combo` )[] | [`node`, `combo`, `edge`] | |
| [immediately](#immediately) | Whether to select immediately, only effective when [selection mode](#mode) is `default` | boolean | false | |
| [mode](#mode) | Selection mode | `union` \| `intersect` \| `diff` \| `default` | `default` | |
| onSelect | Callback for selected element state | (states:Record<string,string\|string[]>) =>Record<string,string\|string[]> | | |
| state | State to switch to when selected | string \| `selected` \| `active` \| `inactive` \| `disabled` \| `highlight` | `selected` | |
| [style](#style) | Style of the box during selection | RectStyleProps extends BaseStyleProps | [Default](#style) | |
| trigger | Press this shortcut key along with mouse click to select **Key reference:** _MDN Key Values_ | string[] \| (`Control` \| `Shift`\| `Alt` \| `......`)[] | [`shift`] | |
### immediately
Whether to select immediately, only effective when selection mode is `default`
```js
const graph = new Graph({
behaviors: [
{
type: 'lasso-select',
key: 'lasso-select',
immediately: true, // Elements are immediately selected when the box encloses them
trigger: [], // No need for other keys, just click and drag the mouse to select
},
],
});
```
```js | ob { pin: false, inject: true }
import { Graph } from '@antv/g6';
const graph = new Graph({
container: 'container',
width: 400,
height: 200,
data: {
nodes: [
{ id: 'node-1', style: { x: 100, y: 50 } },
{ id: 'node-2', style: { x: 260, y: 50 } },
{ id: 'node-3', style: { x: 280, y: 100 } },
],
edges: [
{ source: 'node-1', target: 'node-2' },
{ source: 'node-1', target: 'node-3' },
{ source: 'node-2', target: 'node-3' },
],
},
node: {
style: { fill: '#7e3feb' },
},
edge: {
stroke: '#8b9baf',
},
behaviors: [
{
type: 'lasso-select',
key: 'lasso-select',
immediately: true, // Immediate selection
trigger: [],
},
],
plugins: [{ type: 'grid-line', size: 30 }],
});
graph.render();
```
### mode
Selection mode
- `union`: Keep the current state of selected elements and add the specified state.
- `intersect`: Retain the specified state if the selected elements already have it; otherwise, clear the state.
- `diff`: Toggle the specified state of the selected elements.
- `default`: Clear the current state of selected elements and add the specified state.
```js
const graph = new Graph({
behaviors: [
{
type: 'lasso-select',
key: 'lasso-select',
mode: 'default', // Selection mode, default selection mode
},
],
});
```
```js | ob { pin: false }
createGraph(
{
data: {
nodes: [
{ id: 'node-1', style: { x: 200, y: 100 } },
{ id: 'node-2', style: { x: 360, y: 100 } },
{ id: 'node-3', style: { x: 280, y: 220 } },
],
edges: [
{ source: 'node-1', target: 'node-2' },
{ source: 'node-1', target: 'node-3' },
{ source: 'node-2', target: 'node-3' },
],
},
node: {
style: { fill: '#7e3feb' },
state: {
custom: { fill: '#ffa940' },
},
},
edge: {
stroke: '#8b9baf',
state: {
custom: { stroke: '#ffa940' },
},
},
behaviors: [
{
type: 'lasso-select',
key: 'lasso-select',
trigger: [],
immediately: true,
},
],
plugins: [{ type: 'grid-line', size: 30 }],
animation: true,
},
{ width: 600, height: 300 },
(gui, graph) => {
const options = {
key: 'lasso-select',
type: 'lasso-select',
animation: false,
enable: true,
enableElements: ['node', 'edge', 'combo'],
mode: 'default',
state: 'selected',
};
const optionFolder = gui.addFolder('lassoSelect Options');
optionFolder.add(options, 'type').disable(true);
optionFolder.add(options, 'state', ['active', 'selected', 'custom']);
optionFolder.add(options, 'mode', ['union', 'intersect', 'diff', 'default']);
// .onChange((e) => {
// immediately.show(e === 'default');
// });
optionFolder.onChange(({ property, value }) => {
graph.updateBehavior({
key: 'lasso-select',
[property]: value,
});
graph.render();
});
},
);
```
### style
| Property | Description | Type | Default |
| ----------------- | ----------------------- | ---------------------------------------- | --------- |
| cursor | Mouse style | string | |
| fill | Fill color | string \| Pattern \| null | `#1677FF` |
| fillOpacity | Fill opacity | number \| string | 0.1 |
| isBillboard | Billboard mode | boolean | |
| isSizeAttenuation | Size attenuation | boolean | |
| lineCap | Line cap style | `butt` \| `round` \| `square` | |
| lineDash | Dash line config | number \| string \| (string \| number)[] | |
| lineDashOffset | Dash line offset | number | |
| lineJoin | Line join style | `miter` \| `round` \| `bevel` | |
| lineWidth | Line width | number \| string | 1 |
| opacity | Overall opacity | number \| string | |
| radius | Rectangle corner radius | number \| string \| number[] | |
| shadowBlur | Shadow blur level | number | |
| shadowColor | Shadow color | string | |
| shadowOffsetX | Shadow X offset | number | |
| shadowOffsetY | Shadow Y offset | number | |
| stroke | Stroke color | string \| Pattern \| null | `#1677FF` |
| strokeOpacity | Stroke opacity | number \| string | |
| visibility | Visibility | `visible` \| `hidden` | |
| zIndex | Rendering level | number | 2 |
**Example**:
```js
const graph = new Graph({
behaviors: [
{
type: 'lasso-select',
key: 'lasso-select',
style: {
width: 0,
height: 0,
lineWidth: 4,
lineDash: [2, 2], // Dashed outline
// RGB super colorful box
fill: 'linear-gradient(217deg, rgba(255,0,0,.8), rgba(255,0,0,0) 70.71%),linear-gradient(127deg, rgba(0,255,0,.8), rgba(0,255,0,0) 70.71%),linear-gradient(336deg, rgba(0,0,255,.8), rgba(0,0,255,0) 70.71%)',
stroke: 'pink',
fillOpacity: 0.2,
zIndex: 2,
pointerEvents: 'none',
},
},
],
});
```
```js | ob { pin: false, inject: true }
import { Graph } from '@antv/g6';
const graph = new Graph({
container: 'container',
width: 600,
height: 300,
data: {
nodes: [
{ id: 'node-1', style: { x: 200, y: 100 } },
{ id: 'node-2', style: { x: 360, y: 100 } },
{ id: 'node-3', style: { x: 280, y: 220 } },
],
edges: [
{ source: 'node-1', target: 'node-2' },
{ source: 'node-1', target: 'node-3' },
{ source: 'node-2', target: 'node-3' },
],
},
node: {
style: { fill: '#7e3feb' },
},
edge: {
stroke: '#8b9baf',
},
behaviors: [
{
type: 'lasso-select',
key: 'lasso-select',
trigger: [],
immediately: true,
style: {
width: 0,
height: 0,
lineWidth: 4,
lineDash: [2, 2], // Dashed outline
// RGB super colorful box
fill: 'linear-gradient(217deg, rgba(255,0,0,.8), rgba(255,0,0,0) 70.71%),linear-gradient(127deg, rgba(0,255,0,.8), rgba(0,255,0,0) 70.71%),linear-gradient(336deg, rgba(0,0,255,.8), rgba(0,0,255,0) 70.71%)',
stroke: 'pink',
fillOpacity: 0.2,
zIndex: 2,
pointerEvents: 'none',
},
},
],
plugins: [{ type: 'grid-line', size: 30 }],
animation: true,
});
graph.render();
```
### trigger
Press this shortcut key along with mouse click to select, if set to an **empty array**, it means mouse click to select without needing to press other keys.
Note that setting `trigger` to `['drag']` will cause the `drag-canvas` behavior to be disabled. They cannot be configured simultaneously.
### Practical Example
```js | ob { inject: true }
import { Graph } from '@antv/g6';
const graph = new Graph({
container: 'container',
data: {
nodes: [
{ id: 'node-1', style: { x: 200, y: 250 } },
{ id: 'node-2', style: { x: 250, y: 200 } },
{ id: 'node-3', style: { x: 300, y: 250 } },
{ id: 'node-4', style: { x: 250, y: 300 } },
],
edges: [
{ source: 'node-1', target: 'node-2' },
{ source: 'node-2', target: 'node-3' },
{ source: 'node-3', target: 'node-4' },
{ source: 'node-4', target: 'node-1' },
],
},
behaviors: [
{
key: 'lasso-select',
type: 'lasso-select',
enable: true,
animation: false,
mode: 'default', // union intersect diff default
state: 'selected', // 'active', 'selected', 'inactive', ...
trigger: [], // ['Shift', 'Alt', 'Control', 'Drag', 'Meta', ...]
style: {
width: 0,
height: 0,
lineWidth: 4,
lineDash: [2, 2],
fill: 'linear-gradient(217deg, rgba(255,0,0,.8), rgba(255,0,0,0) 70.71%),linear-gradient(127deg, rgba(0,255,0,.8), rgba(0,255,0,0) 70.71%),linear-gradient(336deg, rgba(0,0,255,.8), rgba(0,0,255,0) 70.71%)',
stroke: 'pink',
fillOpacity: 0.2,
zIndex: 2,
pointerEvents: 'none',
},
},
],
});
graph.render();
```