drag-scroll-provider

React component for click and drag scrolling

Usage no npm install needed!

<script type="module">
  import dragScrollProvider from 'https://cdn.skypack.dev/drag-scroll-provider';
</script>

README

Drag Scroll Provider

Simple react component to enable scrolling with the mouse.

Installation

yarn add drag-scroll-provider

or

npm install --save drag-scroll-provider

Usage

  • Import component
import DragScrollProvider from 'drag-scroll-provider'
  • Wrap the component you want to drag and scroll
<DragScrollProvider>
    {({ onMouseDown, ref }) => (
        <div
          className="scrollable"
          ref={ref}
          onMouseDown={onMouseDown}>
            // content that overflows the parent
        </div>
    )}
</DragScrollProvider>
  • Make sure the element has fixed width (is you want to scroll horizontally) or fixed height (if you want to scroll vertically) and has the overflow propert scroll.
.scrollable {
    width: 500px;
    overflow-x: scroll;   
}

optional: hide the scrollbar

.scrollable::-webkit-scrollbar {
    display: none;
} 

Props

  • <DragScrollProvider vertical='true'> for vertical scroll.

Available functions provided

{{
   onMouseDown: this.provisionOnMouseDown, // required
   ref: this.provisionRef, // required
   clickItem: this.clickItem, // wraps onClick events on children
   scrollTo: this.scrollTo, // scroll to specific value (useful for animations)
}}

Handle on click event on child components

When you need to handle a click events on child components you need to wrap your click event on this provided function so the scroller knows that is not a drag triggering click, mainly for avoiding weird issues with the scroll.

Lets say you have a <Card /> component that handles a click event

<Card onClick={this.handleClick}>

So we need to wrap this click event like this

<DragScrollProvider>
  {({ onMouseDown, ref, clickItem }) => (
    <div
      className="example__scroll"
      ref={ref}
      onMouseDown={onMouseDown}
    >
        <Card onClick={() => clickItem(this.handleClick)}>
    </div>
  )}
</DragScrollProvider>