An extension of svg.js which allows to select elements with mouse
For a demo see http://svgjs.dev/svg.resize.js/ or run pnpm demo, which starts
a vite dev server with the demo from demo/.
-
Install
svg.jsandsvg.select.jsusing npm:npm i @svgdotjs/svg.js @svgdotjs/svg.select.js
-
Or get it from a cnd:
<script src="https://unpkg.com/@svgdotjs/svg.js"></script> <script src="https://unpkg.com/@svgdotjs/svg.select.js"></script>
-
Select a rectangle using this simple piece of code:
var canvas = new SVG().addTo('body').size(500, 500) canvas.rect(50, 50).fill('red').select()
Select
var canvas = SVG().addTo('body')
var rect = canvas.rect(100, 100)
var polygon = canvas.polygon([
[100, 100],
[200, 100],
[200, 200],
[100, 200]
])
rect.select()
polygon.pointSelect()
// both also works
polygon.select().pointSelect()Unselect
rect.select(false)Sometimes, the default shape is not to your liking. Therefore, you can create your own handles by passing in a create and update function:
rect.select({
createHandle: (group, p, index, pointArr, handleName) =>
group.circle(10).css({ stroke: '#666', fill: 'blue' }),
updateHandle: (group, p, index, pointArr, handleName) =>
group.center(p[0], p[1]),
createRot: (group) => group.circle(10).css({ stroke: '#666', fill: 'blue' }),
updateRot: (group, rotPoint, handlePoints) => group.center(p[0], p[1])
})
polygon.pointSelect({
createHandle: (group, p, index, pointArr, handleName) =>
group.circle(10).css({ stroke: '#666', fill: 'blue' }),
updateHandle: (group, p, index, pointArr, handleName) =>
group.center(p[0], p[1])
})By default, all resize handles (lt, t, rt, r, rb, b, lb, l) and the rotation handle (rot) are shown. Pass an explicit handles array to render only those:
// resize-only selection (corners)
rect.select({ handles: ['lt', 'rt', 'rb', 'lb'] })
// rotate-only selection
rect.select({ handles: ['rot'] })You can style the selection with the classes
svg_select_shape- normal selectionsvg_select_shape_pointSelection- point selectionsvg_select_handle- any normal selection handlessvg_select_handle_lt- left topsvg_select_handle_rt- right topsvg_select_handle_rb- right bottomsvg_select_handle_lb- left bottomsvg_select_handle_t- topsvg_select_handle_r- rightsvg_select_handle_b- bottomsvg_select_handle_l- leftsvg_select_handle_rot- rotation pointsvg_select_handle_point- point select point
git clone https://github.com/svgdotjs/svg.select.js.git
cd svg.select.js
npm install
npm run dev- The css classes changed. In case you used your own styling, you'll need to adapt
- A lot of options got dropped in favor of the
createandupdatefunctions- In case you want to hide certain handles, just create an element without any size and pass a noop to update
- the deepSelect option was moved to its own function and renamed to
pointSelect