React-Draggable
A simple component for making elements draggable.
View the Changelog
Demo
View Demo
Installing
$ npm install react-draggable
If you aren't using browserify/webpack, a
UMD version of react-draggable is available. It is updated per-release only.
This bundle is also what is loaded when installing from npm. It expects external React
and ReactDOM
.
If you want a UMD version of the latest master
revision, you can generate it yourself from master by cloning this
repository and running $ make
. This will create umd dist files in the dist/
folder.
Exports
The default export is <Draggable>
. At the .DraggableCore
property is <DraggableCore>
. Here's how to use it:
import Draggable from 'react-draggable';
import {DraggableCore} from 'react-draggable';
import Draggable, {DraggableCore} from 'react-draggable';
let Draggable = require('react-draggable');
let DraggableCore = Draggable.DraggableCore;
Draggable
A <Draggable>
element wraps an existing element and extends it with new event handlers and styles.
It does not create a wrapper element in the DOM.
Draggable items are moved using CSS Transforms. This allows items to be dragged regardless of their current
positioning (relative, absolute, or static). Elements can also be moved between drags without incident.
If the item you are dragging already has a CSS Transform applied, it will be overwritten by <Draggable>
. Use
an intermediate wrapper (<Draggable><span>...</span></Draggable>
) in this case.
Draggable API
The <Draggable/>
component transparently adds draggable to whatever element is supplied as this.props.children
.
Note: Only a single element is allowed or an Error will be thrown.
For the <Draggable/>
component to correctly attach itself to its child, the child element must provide support for the following props:
style
is used to give the transform css to the child.className
is used to apply the proper classes to the object being dragged.onMouseDown
is used along with onMouseUp to keep track of dragging state.onMouseUp
is used along with onMouseDown to keep track of dragging state.onTouchStart
is used along with onTouchEnd to keep track of dragging state.onTouchEnd
is used along with onTouchStart to keep track of dragging state.
React.DOM elements support the above six properties by default, so you may use those elements as children without any changes. If you wish to use a React component you created, you might find this React page helpful.
Props:
{
onStart: Function,
onDrag: Function,
onStop: Function,
onMouseDown: Function,
start: {x: number, y: number},
disabled: boolean,
cancel: string,
handle: string,
allowAnyClick: boolean,
axis: string,
bounds: {left: number, top: number, right: number, bottom: number} | string,
grid: [number, number],
zIndex: number
}
Note that sending className
, style
, or transform
as properties will error - set them on the child element
directly.
Draggable Usage
var React = require('react'),;
var ReactDOM = require('react-dom');
var Draggable = require('react-draggable');
var App = React.createClass({
handleStart: function (event, ui) {
console.log('Event: ', event);
console.log('Position: ', ui.position);
},
handleDrag: function (event, ui) {
console.log('Event: ', event);
console.log('Position: ', ui.position);
},
handleStop: function (event, ui) {
console.log('Event: ', event);
console.log('Position: ', ui.position);
},
render: function () {
return (
<Draggable
axis="x"
handle=".handle"
start={{x: 0, y: 0}}
grid={[25, 25]}
zIndex={100}
onStart={this.handleStart}
onDrag={this.handleDrag}
onStop={this.handleStop}>
<div>
<div className="handle">Drag from here</div>
<div>This readme is really dragging on...</div>
</div>
</Draggable>
);
}
});
ReactDOM.render(<App/>, document.body);
For users that require more control, a <DraggableCore>
element is available. This is useful for more programmatic
usage of the element. See React-Resizable and
React-Grid-Layout for some examples of this.
<DraggableCore>
is a useful building block for other libraries that simply want to abstract browser-specific
quirks and receive callbacks when a user attempts to move an element. It does not set styles or transforms
on itself.
DraggableCore API
<DraggableCore>
takes all of the above <Draggable>
options, with the exception of:
Drag callbacks are called with the following parameters:
(
event: Event,
ui:{
node: Node
position:
{
deltaX: number, deltaY: number,
lastX: number, lastY: number,
clientX: number, clientY: number
}
}
)
Contributing
- Fork the project
- Run the project in development mode:
$ npm run dev
- Make changes.
- Add appropriate tests
$ npm test
- If tests don't pass, make them pass.
- Update README with appropriate docs.
- Commit and PR
Release checklist
- Update CHANGELOG
make release-patch
, make release-minor
, or make-release-major
make publish
License
MIT