# svg.panzoom.js > A plugin for [svg.js](https://github.com/svgdotjs/svg.js) that enables panzoom for svg elements ## Getting started ``` npm install @svgdotjs/svg.js @svgdotjs/svg.panzoom.js ``` Include this plugin after including the svg.js library in your html document. ``` ``` Or for esm just import it: ``` import { SVG } from '@svgdotjs/svg.js' import '@svgdotjs/svg.panzoom.js' ``` To enable pan/zoom on an svg: ```js // enables panZoom var canvas = SVG() .addTo('#id') .size(1000, 1000) .panZoom() // zoom programatically canvas.zoom(lvl, point) ``` You can configure `panZoom` by passing options to it. - zoomMin: Minimal zoom level - zoomMax: Maximal zoom level - zoomFactor: How much is zoomed by one mouse wheel step This could look like this: ```js var canvas = SVG() .addTo('#id') .size(1000, 1000) .panZoom({ zoomMin: 0.5, zoomMax: 20 }) ``` Setting the min and max value will automatically restrict the zoom to the provided level. However you are still able to change the zoom out of that bonds by calling `zoom(lvl)` programatically. On touchable devices a pinchZoom gesture is supported. Min and max values also apply here. Zooming is animatable, too: ```js canvas .zoom(1) // uses center of viewport by default .animate() .zoom(2, { x: 100, y: 100 }) // zoom into specified point ``` To disable `panZoom` or change its options just call it again with `false` or the new options. ## Options You can override the default options by passing an object in to the `.panZoom({options})` call. | Option | Default | Description | | ------------ | ---------------- | -------------------------------------------------------------------------------------------------------------- | | panning | true | Enable panning | | pinchZoom | true | Enable pinch to zoom | | wheelZoom | true | Enable mouse wheel zoom | | panButton | 0 | Which mouse button to use for pan ([info](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button)) | | oneFingerPan | false | Enables the ability to pan with only one finger instead of two for touchdevices | | margins | false | An object {top, left, right, bottom} to restrict the pan area towards this side so that at least x user units of the opposite side are still visible | | zoomFactor | 2 | How quickly to zoom when using `wheelZoom` | | zoomMin | Number.MIN_VALUE | The minimum zoom level | | zoomMax | Number.MAX_VALUE | The maximum zoom level | | wheelZoomDeltaModeLinePixels | 17 | The multiplier to convert wheel zoom deltaY values from deltaMode=1 (lines) to deltaMode=0 (pixels) | | wheelZoomDeltaModeScreenPixels | 53 | The multiplier to convert wheel zoom deltaY values from deltaMode=2 (screen) to deltaMode=0 (pixels) | ### Example: ```js draw.panZoom({ wheelZoom: false, zoomMin: 0.5, zoomMax: 2 }) ``` This will disable wheel zooming and set the maximum zoom to 2 or 200% and the minimum zoom to 0.5 or 50%. ## Events Multiple events are fired doing different actions. This allow you to respond to actions and in some cases stop an action via `preventDefault()`. `zoom` is fired when a mouse wheel event or programmable `zoom()` triggers a zoom. This usually doesn't happen on mobile devices, in which case `pinchZoomStart` is fired when a zoom happens. Events fired from SVG.js are [`CustomEvent`s](http://devdocs.io/dom/customevent), so the arguments passed from svg.panzoom.js are in in the `.detail` property. | Event Name | Argument Value | preventDefault support | | -------------- | ---------------- | ---------------------- | | zoom | `{ lvl, focus }` | YES | | panStart | `{ event }` | NO | | panEnd | `{ event }` | NO | | panning | `{ box }` | YES | | pinchZoomStart | `{ event }` | YES | | pinchZoomEnd | `{ event }` | NO | Where `lvl` is the new zoom level, [`focus`](https://svgjs.com/docs/3.0/classes/#svg-point) is th point of zoom, [`box`](https://svgjs.com/docs/3.0/classes/#svg-box) is the new calculated viewbox and event is the event that triggered the action. An example of stopping a pinch-zoom action: ```js var canvas = SVG() .addTo('#id') .size(1000, 1000) .panZoom() canvas.on('pinchZoomStart', function (ev) { ev.preventDefault() // ... }) ```