Skip to main content

Command Palette

Search for a command to run...

Making Draggable Components in React

Published
Making Draggable Components in React
V

I'm a solutions engineer lead, GitHub Star, Director of WomenDevsSG, and co founder of ragTech. I work at the intersection of tech, systems, and leadership, and this blog is where I share my journey through all three. Expect honest reflections, real experiences, and thoughts that are still forming rather than polished career advice.

As user interactivity becomes more prevalent in modern apps, it is sometimes nice to have draggable components implemented in your apps. Think of Trello or website builders like Wix. They have drag-and-drop elements which makes it easy and intuitive for users.

Hello everyone! In this article, I'll be illustrating some simple ways to make draggable components in React using the react-draggable package.

Step 1: Install npm package

After creating your React app with npx create-react-app my-app, run:

npm install react-draggable

Step 2: Add a Draggable Component

In App.js, simply import the Draggable component:

import Draggable from 'react-draggable';

Then wrap the element you want to be draggable in it like so:

<Draggable>
    <div className="box">
        <div>Move me around!</div>
    </div>
</Draggable>

We can add some CSS to the box:

.box {
  position: absolute;
  cursor: move;
  color: black;
  max-width: 215px;
  border-radius: 5px;
  padding: 1em;
  margin: auto;
  user-select: none;
}

And that's it!

drag.gif

That's pretty simple, isn't it? Now let's discuss some cool properties in the Draggable component that you can add to customize the dragging a little bit more.

1. Drag on one axis

The axis property is set to both by default so as seen in the above example, it allows the component to be dragged in any direction. Other values that you can set it to are:

  • axis="x": the component can only be dragged horizontally.
  • axis="y": the component can only be dragged vertically.
  • axis="none": the component cannot be dragged.

An Example

Here's an example when axis = "x": draghor.gif

2. Track the position of the draggable

The onDrag event handler is triggered whenever the component is being dragged. We can use it to track the position of our component.

First, import the useState hook:

import React, { useState } from "react";

Then, initialize the position state to store our position.

const [position, setPosition] = useState({ x: 0, y: 0 });

Next, our 'trackPos' function which will update our position whenever onDrag is triggered.

const trackPos = (data) => {
    setPosition({ x: data.x, y: data.y });
 };

And we will call this function when onDrag is triggered.

<Draggable onDrag={(e, data) => trackPos(data)}>
   <div className="box">
       <div>Here's my position...</div>
       <div>
            x: {position.x.toFixed(0)}, y: {position.y.toFixed(0)}
       </div>
   </div>
</Draggable>

And the result...

ezgif.com-video-to-gif.gif

3. Draggable only on handle

We can include the handle property to allow drag only on that handle. For example:

<Draggable handle="#handle">
   <div className="box">
      <span id="handle">Drag here</span>
         <div style={{ padding: "1em" }}>Cannot drag here</div>
   </div>
</Draggable>

And the result...

ezgif.com-video-to-gif (1).gif

Conclusion

In this article, we are introduced to react-draggable and how we use it to make draggable components. We have also discussed a few of its many properties that can further customize the draggable component. Having draggable elements is useful to build interactive apps. Check out this mini project I made of a bulletin board app that utilizes draggable features. See its repo for the code.

gif.gif

For more information regarding react-draggable, check out its documentation here. I hope this article has been helpful. Please like and share if it is. Feel free to ask any questions or share any projects you've made with this package in the comments below. Cheers!

Comments (12)

Join the discussion
S

Hi, i love this , i just want to know how can i do drag and drop with other element ? like when I move 1 div another div will adjust itself or take the space of previous.

S

Thank you for the amazing article Victoria Lo, loving this. This will help me a lot for my next side project 🥳

1
V

Thanks Savio! I'm glad it's helpful!

M

I try to customize it with my project, hope be useful

1
M

How did you created the bulletin board application? is there any tutorial of yours on it? thanks in advance

V

Hi Manas Garg, I just created it to showcase draggable components, if you'd like a tutorial on it, I'll be happy to write one :)

M

Hey Victoria Lo I would love to, if you can make it possible and is it fine if we can get connected on LinkedIn?

V

Manas Garg Sure, you can connect with me https://www.linkedin.com/in/victoria2666/

S

How to you create a gif and embed.

1
V

I screen recorded, export it as mp4 and convert it to gif using this tool (https://ezgif.com/video-to-gif) and embed it on Hashnode:

![myGIF](myGif.gif)

1
L
LookRain5y ago

you can probably checkout Giphy Capture, pretty handy! Victoria Lo

1
S

Nice one! Simple to follow... 😀

1
V

Yayy thanks!

S

Very intuitive write-up. Def gonna use it in a project I'm working on. It really helps the user. Thanks

1
V

Thanks glad its helpful :)

C

Very cool, And looks way easier then I would have thought

1
V

Haha yes, it's very easy and intuitive to use :)

R

I was about to skip this article, thinking it would be for beginners to learn react using some easy draggable component interface but woah!! Glad I stumbled over it. Very informative and nicely written.

1
V

Thanks! I hope to see you use it in your projects :)

R
Rahul5y ago

Amazing Post.

1
V

Thanks Rahul!