Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

react-easy-panzoom

Package Overview
Dependencies
Maintainers
1
Versions
17
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

react-easy-panzoom

Wrapper to enable pan and zoom for any React component

  • 0.4.4
  • latest
  • Source
  • npm
  • Socket score

Version published
Weekly downloads
7.2K
increased by18.06%
Maintainers
1
Weekly downloads
 
Created
Source

react-easy-panzoom

Code Code npm Code Code

react-easy-panzoom-demo

React components that enables pan and zoom features for any component. Try out the live demo here

Installation

react-panzoom requires React 16 or later.

Using npm:

npm install --save react-easy-panzoom

Using yarn:

yarn add react-easy-panzoom

Usage

import { PanZoom } from 'react-easy-panzoom'

// ...
render() {
  return (
    <PanZoom>
      { 'This content can be panned and zoomed' }
    </PanZoom>
  )
}

Key mapping

PanZoom component natively supports keyboard interactions with arrow keys and - / + keys. This mapping can be extends using the keyMapping prop.

e.g. Mapping w, a, s, d:

import { PanZoom } from 'react-easy-panzoom'

// ...
render() {
  return (
    <PanZoom
      keyMapping={{
        '87': { x: 0, y: -1, z: 0 },
        '83': { x: 0, y: 1, z: 0 },
        '65': { x: -1, y: 0, z: 0 },
        '68': { x: 1, y: 0, z: 0 },
      }}
    >
      { 'This content can be panned and zoomed' }
    </PanZoom>
  )
}

Prevent pan

Sometimes it can be useful to prevent the view from panning, for example if the pan start is done on a clickable element. PanZoom provides the preventPan prop that let you define a function to prevent panning.

e.g. prevent panning when starting the pan on a specific div

content = null

// preventPan gives access to the event, as well as the 
// mouse coordinates in the coordinate system of the PanZoom container
preventPan = (event, x, y) => {
  // if the target is the content container then prevent panning
  if (e.target === content) {
    return true
  }

  // in the case the target is not the content container
  // use the coordinates to determine if the click happened
  // on the content container    
  const contentRect = content.getBoundingClientRect()

  const x1 = contentRect.left
  const x2 = contentRect.right
  const y1 = contentRect.top
  const y2 = contentRect.bottom

  return (x >= x1 && x <= x2) && (y >= y1 && y <= y2)
}

render() {
  return (
    <PanZoom
      preventPan={this.preventPan}
    >
      <div>{ 'This content can be panned and zoomed' }</div>
      <div ref={ref => this.content = ref}>{ 'This content can be panned and zoomed only outside of its container' }</div>
    </PanZoom>
  )
}

Boundaries

PanZoom supports the enableBoundingBox prop to restrict panning. The box is calculated based on the width and height of the inner content. A ratio is applied so that the bounding box allows panning up to a specific percentage of the inner content. By default this ratio is 0.8 but can be modified with boundaryRatioVertical and boundaryRatioHorizontal. In this case the pan content will be able to pan outside the parent container up to 80% of its size (the 20% remaining will always be visible).

A negative ratio will create a padding, but combined with zooming it can produce strange behaviour. A ratio above 1 will allow the pan content to pan outside the parent container more than its size.

To use the bounding box:

import { PanZoom } from 'react-easy-panzoom'

// ...
render() {
  return (
    <PanZoom
      boundaryRatioVertical={0.8} 
      boundaryRatioHorizontal={0.8} 
      enableBoundingBox
    >
      <div>{ 'This content can be panned and zoomed' }</div>
    </PanZoom>
  )
}

Properties

NameTypeDefaultDescription
autoCenterboolfalseAuto-center the view when mounting
autoCenterZoomLevelnumberSpecify the initial zoom level for auto-center
zoomSpeednumber1Sets the zoom speed
doubleZoomSpeednumber1.75Sets the zoom speed for double click
disabledboolfalseDisable pan and zoom
disableKeyInteractionboolfalseDisable keyboard interaction
disableDoubleClickZoomboolfalseDisable zoom when performing a double click
disableScrollZoomboolfalseDisable zoom when performing a scroll
realPinchboolfalseEnable real pinch interaction for touch events
keyMappingobjectfalseDefine specific key mapping for keyboard interaction (e.g. { '<keyCode>': { x: 0, y: 1, z: 0 } }, with <keyCode> being the key code to map)
minZoomnumberSets the minimum zoom value
maxZoomnumberSets the maximum zoom value
enableBoundingBoxbooleanfalseEnable bounding box for the panzoom element. The bounding box will contain the element based on a ratio of its size
boundaryRatioVerticalnumber0.8Vertical ratio for the bounding box
boundaryRatioHorizontalnumber0.8Horizontal ratio for the bounding box
noStateUpdatebooltrueDisable state update for each new x, y, z transform value while panning. Enabling it drastically increases the performances
onPanStartfuncFired on pan start
onPanfuncFired on pan
onPanEndfuncFired on pan end
preventPanfuncDefines a function to prevent pan
styleobjectOverride the inline-styles of the root element
onStateChangefuncCalled after the state of the component has changed

You can also pass in every other props you would pass to a div element. Those will be passed through to the container component. This is helpful for adding custom event handlers.

Methods

By using ref, methods from PanZoom can be accessed and called to trigger manipulation functions.

Available methods are listed below:

NameParametersDescription
zoomIn(zoomSpeed?: number)Zoom in from the center of the PanZoom container
zoomOut(zoomSpeed?: number)Zoom out from the center of the PanZoom container
autoCenter(zoom: number, animate?: boolean = true)Center and resize the view to fit the PanZoom container
resetReset the view to it's original state (will not auto center if autoCenter is enabled)
moveByRatio(x: number, y: number, moveSpeedRatio?: number)Move the view along x or/and y axis
rotate(angle: number | (prevAngle) => newAngle)Rotate the view by the specified angle

Thanks

This react library is based on the awesome panzoom by @anvaka.

License

The files included in this repository are licensed under the MIT license.

Keywords

FAQs

Package last updated on 13 Oct 2019

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc