react-burger-menu vs react-navigation-drawer vs react-pro-sidebar vs react-sidebar
React Sidebar Libraries
react-burger-menureact-navigation-drawerreact-pro-sidebarreact-sidebar

React Sidebar Libraries

These libraries provide various implementations of sidebar navigation components for React applications. They enable developers to create responsive and interactive side menus that enhance user experience by organizing navigation links effectively. Each library offers unique features and design principles, catering to different use cases and aesthetic preferences in web development.

Npm Package Weekly Downloads Trend

3 Years

Github Stars Ranking

Stat Detail

Package
Downloads
Stars
Size
Issues
Publish
License
react-burger-menu05,099185 kB9a year agoMIT
react-navigation-drawer0144384 kB2-MIT
react-pro-sidebar01,802449 kB22 years agoMIT
react-sidebar01,459-368 years agoMIT

Feature Comparison: react-burger-menu vs react-navigation-drawer vs react-pro-sidebar vs react-sidebar

Customization

  • react-burger-menu:

    react-burger-menu offers extensive customization options, allowing developers to change styles, animations, and menu items easily. It supports various predefined styles and animations, making it easy to match the sidebar with the overall design of the application.

  • react-navigation-drawer:

    react-navigation-drawer provides limited customization options compared to others, focusing more on functionality and integration with React Navigation. However, it allows for some styling through props and theming, making it adaptable to different design requirements.

  • react-pro-sidebar:

    react-pro-sidebar excels in customization, offering a wide range of props for styling and layout adjustments. Developers can easily create collapsible menus, change colors, and adjust sizes, making it suitable for complex UI designs.

  • react-sidebar:

    react-sidebar allows for basic customization, focusing on functionality rather than extensive styling options. It provides a simple API for toggling the sidebar and adjusting its position, making it easy to implement without deep customization.

Integration

  • react-burger-menu:

    react-burger-menu is designed to be easily integrated into any React application without dependencies on other libraries. It works well with both functional and class components, making it versatile for various project structures.

  • react-navigation-drawer:

    react-navigation-drawer is tightly integrated with React Navigation, making it the best choice for applications that already use this navigation library. It provides a seamless experience for managing navigation stacks and drawer interactions.

  • react-pro-sidebar:

    react-pro-sidebar can be integrated into any React application but is particularly beneficial for projects that require a more complex sidebar structure. It can work independently or alongside other libraries, providing flexibility in implementation.

  • react-sidebar:

    react-sidebar is straightforward to integrate into any React project, requiring minimal setup. It is suitable for developers looking for a quick and easy solution without complex dependencies.

Performance

  • react-burger-menu:

    react-burger-menu is lightweight and optimized for performance, ensuring smooth animations and transitions without significant overhead. It is ideal for applications where performance is a priority, especially on mobile devices.

  • react-navigation-drawer:

    react-navigation-drawer is optimized for mobile performance, leveraging React Navigation's capabilities to ensure fast and responsive interactions. It efficiently manages state and navigation transitions, making it suitable for larger applications.

  • react-pro-sidebar:

    react-pro-sidebar maintains good performance even with complex menus, as it is designed to handle multiple nested items efficiently. However, extensive customization may impact performance if not managed properly.

  • react-sidebar:

    react-sidebar is lightweight and performs well for simple use cases. However, its performance may vary with more complex implementations, depending on how the sidebar is structured and used.

User Experience

  • react-burger-menu:

    react-burger-menu enhances user experience with its visually appealing animations and intuitive design. It provides a modern look and feel, making it suitable for applications targeting a younger audience or those looking for a trendy interface.

  • react-navigation-drawer:

    react-navigation-drawer focuses on providing a native-like experience for mobile applications, ensuring smooth transitions and interactions that users expect from mobile apps. It is designed to be user-friendly and easy to navigate.

  • react-pro-sidebar:

    react-pro-sidebar offers a professional user experience with its clean design and responsive layout. It is ideal for applications that require a polished interface, providing users with an organized and accessible navigation structure.

  • react-sidebar:

    react-sidebar provides a straightforward user experience, focusing on functionality over aesthetics. It is suitable for applications that prioritize usability and simplicity, making it easy for users to navigate without distractions.

Learning Curve

  • react-burger-menu:

    react-burger-menu has a gentle learning curve, making it easy for developers to implement and customize. Its straightforward API allows for quick integration, even for those new to React.

  • react-navigation-drawer:

    react-navigation-drawer may require a bit of learning if you are not familiar with React Navigation, but once understood, it provides a powerful tool for managing navigation effectively. The learning curve is moderate, especially for those already using React Navigation.

  • react-pro-sidebar:

    react-pro-sidebar has a moderate learning curve due to its extensive features and customization options. Developers may need some time to explore its capabilities fully, but it rewards with flexibility and functionality.

  • react-sidebar:

    react-sidebar is easy to learn and implement, making it a good choice for beginners. Its simple API allows developers to get started quickly without needing extensive knowledge of React.

How to Choose: react-burger-menu vs react-navigation-drawer vs react-pro-sidebar vs react-sidebar

  • react-burger-menu:

    Choose react-burger-menu if you need a lightweight, customizable sidebar that can be easily integrated into your project. It is ideal for applications that require a simple and attractive sliding menu with various animation options.

  • react-navigation-drawer:

    Opt for react-navigation-drawer if you are building a mobile application using React Navigation and need a robust drawer navigation system. It provides seamless integration with navigation stacks and is well-suited for complex applications with multiple screens.

  • react-pro-sidebar:

    Select react-pro-sidebar for a professional-looking sidebar that offers a rich set of features, including collapsible menus and customizable styles. It is perfect for applications that require a more sophisticated and responsive sidebar layout.

  • react-sidebar:

    Use react-sidebar if you want a straightforward and flexible sidebar solution that allows for easy toggling and positioning. It is great for applications that need a simple sidebar without extensive customization.

README for react-burger-menu

react-burger-menu Build Status code style: prettier

An off-canvas sidebar React component with a collection of effects and styles using CSS transitions and SVG path animations.

Using Redux? Check out redux-burger-menu for easy integration of react-burger-menu into your project.

Demo & examples

Live demo: negomi.github.io/react-burger-menu

To build the examples locally, first make sure you're using Node <11.0.0. Then run:

npm install
npm start

Then open localhost:8000 in a browser.

Tests

The test suite uses Mocha, Chai and Sinon, with jsdom.

To run the tests once, run:

npm test

To run them with a watcher, run:

npm run test:watch

Installation

The easiest way to use react-burger-menu is to install it from npm and include it in your own React build process (using Browserify, Webpack, etc).

You can also use the standalone build by including dist/react-burger-menu.js in your page. If you use this, make sure you have already included React, and it is available as a global variable.

Version 3.x uses Hooks, so if you're using React 16.8+:

npm install react-burger-menu --save

If you're using an earlier version of React:

npm install react-burger-menu@^2.9.2 --save

Usage

Items for the sidebar should be passed as child elements of the component using JSX.

import { slide as Menu } from 'react-burger-menu'

class Example extends React.Component {
  showSettings (event) {
    event.preventDefault();
    .
    .
    .
  }

  render () {
    // NOTE: You also need to provide styles, see https://github.com/negomi/react-burger-menu#styling
    return (
      <Menu>
        <a id="home" className="menu-item" href="/">Home</a>
        <a id="about" className="menu-item" href="/about">About</a>
        <a id="contact" className="menu-item" href="/contact">Contact</a>
        <a onClick={ this.showSettings } className="menu-item--small" href="">Settings</a>
      </Menu>
    );
  }
}

Animations

The example above imported slide which renders a menu that slides in on the page when the burger icon is clicked. To use a different animation you can substitute slide with any of the following (check out the demo to see the animations in action):

  • slide
  • stack
  • elastic
  • bubble
  • push
  • pushRotate
  • scaleDown
  • scaleRotate
  • fallDown
  • reveal

Properties

Some animations require certain other elements to be on your page:

  • Page wrapper - an element wrapping the rest of the content on your page (except elements with fixed positioning - see the wiki for details), placed after the menu component

    <Menu pageWrapId={ "page-wrap" } />
    <main id="page-wrap">
      .
      .
      .
    </main>
    
  • Outer container - an element containing everything, including the menu component

    <div id="outer-container">
      <Menu pageWrapId={ "page-wrap" } outerContainerId={ "outer-container" } />
      <main id="page-wrap">
        .
        .
        .
      </main>
    </div>
    

If you are using an animation that requires either/both of these elements, you need to give the element an ID, and pass that ID to the menu component as the pageWrapId and outerContainerId props respectively.

Check this table to see which animations require these elements:

AnimationpageWrapIdouterContainerId
slide
stack
elastic
bubble
push
pushRotate
scaleDown
scaleRotate
fallDown
reveal

Position

The menu opens from the left by default. To have it open from the right, use the right prop. It's just a boolean so you don't need to specify a value. Then set the position of the button using CSS.

<Menu right />

Width

You can specify the width of the menu with the width prop. The default is 300.

<Menu width={ 280 } />
<Menu width={ '280px' } />
<Menu width={ '20%' } />

Open state

You can control whether the sidebar is open or closed with the isOpen prop. This is useful if you need to close the menu after a user clicks on an item in it, for example, or if you want to open the menu from some other button in addition to the standard burger icon. The default value is false.

// To render the menu open
<Menu isOpen />
<Menu isOpen={ true } />

// To render the menu closed
<Menu isOpen={ false } />

You can see a more detailed example of how to use isOpen here.

Note: If you want to render the menu open initially, you will need to set this property in your parent component's componentDidMount() function.

Open menu handler

If you keep the menu state yourself it might be convenient to pass a custom function to be used when the user triggers something that should open the menu.

Called when:

  • The user clicks on the burger icon
<Menu onOpen={ handleOnOpen } />

Note: The menu will NOT open automatically if you pass this prop, so you must handle it yourself.

Close menu handler

If you keep the menu state yourself it might be convenient to pass a custom function to be used when the user triggers something that should close the menu.

Called when:

  • The user clicks on the cross icon
  • The user clicks on the overlay
  • The user hits the escape key
<Menu onClose={ handleOnClose } />

Note: The menu will NOT close automatically if you pass this prop, so you must handle it yourself.

State change

You can detect whether the sidebar is open or closed by passing a callback function to onStateChange. The callback will receive an object containing the new state as its first argument.

var isMenuOpen = function(state) {
  return state.isOpen;
};

<Menu onStateChange={ isMenuOpen } />

Close on Escape

By default, the menu will close when the Escape key is pressed. To disable this behavior, you can pass the disableCloseOnEsc prop. This is useful in cases where you want the menu to be open all the time, for example if you're implementing a responsive menu that behaves differently depending on the browser width.

<Menu disableCloseOnEsc />

Custom keydown handler

For more control over global keypress functionality, you can override the handler that this component sets for window.addEventListener('keydown', handler), and pass a custom function. This could be useful if you are using multiple instances of this component, for example, and want to implement functionality to ensure that a single press of the Escape key closes them all.

const closeAllMenusOnEsc = (e) => {
  e = e || window.event;

  if (e.key === 'Escape' || e.keyCode === 27) {
    this.setState({areMenusOpen: false});
  }
};

<MenuOne customOnKeyDown={closeAllMenusOnEsc} isOpen={areMenusOpen} />
<MenuTwo customOnKeyDown={closeAllMenusOnEsc} isOpen={areMenusOpen} />

Note: Using this prop will disable all the default 'close on Escape' functionality, so you will need to handle this (including determining which key was pressed) yourself.

Overlay

You can turn off the default overlay with noOverlay.

<Menu noOverlay />

You can disable the overlay click event (i.e. prevent overlay clicks from closing the menu) with disableOverlayClick. This can either be a boolean, or a function that returns a boolean.

<Menu disableOverlayClick />
<Menu disableOverlayClick={() => shouldDisableOverlayClick()} />

Transitions

You can disable all transitions/animations by passing noTransition.

<Menu noTransition />

This is useful if you want the menu to remain open across re-mounts, for example during SPA route changes.

Custom icons

You can replace the default bars that make up the burger and cross icons with custom ReactElements. Pass them as the customBurgerIcon and customCrossIcon props respectively.

<Menu customBurgerIcon={ <img src="img/icon.svg" /> } />
<Menu customCrossIcon={ <img src="img/cross.svg" /> } />

You should adjust their size using the .bm-burger-button and .bm-cross-button classes, but the element itself will have the class .bm-icon or .bm-cross if you need to access it directly.

You can also disable the icon elements so they won't be included at all, by passing false to these props.

<Menu customBurgerIcon={ false } />
<Menu customCrossIcon={ false } />

This can be useful if you want exclusive external control of the menu, using the isOpen prop.

Custom ID and/or classNames

There are optional id and className props, which will simply add an ID or custom className to the rendered menu's outermost element. This is not required for any functionality, but could be useful for things like styling with CSS modules.

<Menu id={ "sidebar" } className={ "my-menu" } />

You can also pass custom classNames to the other elements:

<Menu burgerButtonClassName={ "my-class" } />
<Menu burgerBarClassName={ "my-class" } />
<Menu crossButtonClassName={ "my-class" } />
<Menu crossClassName={ "my-class" } />
<Menu menuClassName={ "my-class" } />
<Menu morphShapeClassName={ "my-class" } />
<Menu itemListClassName={ "my-class" } />
<Menu overlayClassName={ "my-class" } />

And to the html and body elements (applied when the menu is open):

<Menu htmlClassName={ "my-class" } />
<Menu bodyClassName={ "my-class" } />

Note: Passing these props will prevent the menu from applying styles to the html or body elements automatically. See here for more explanation.

Focusing the first menu item

By default, the menu will set focus on the first item when opened. This is to help with keyboard navigation. If you don't want this functionality, you can pass the disableAutoFocus prop.

<Menu disableAutoFocus />

Custom item list element

The menu's children are all wrapped in a nav element by default, as navigation is likely the most common use case for this component. However, it's a general purpose sidebar, so you can change this to a div if you're not using it for navigation:

<Menu itemListElement="div" />

Styling

All the animations are handled internally by the component. However, the visual styles (colors, fonts etc.) are not, and need to be supplied, either with CSS or with a JavaScript object passed as the styles prop.

CSS

The component has the following helper classes:

/* Position and sizing of burger button */
.bm-burger-button {
  position: fixed;
  width: 36px;
  height: 30px;
  left: 36px;
  top: 36px;
}

/* Color/shape of burger icon bars */
.bm-burger-bars {
  background: #373a47;
}

/* Color/shape of burger icon bars on hover*/
.bm-burger-bars-hover {
  background: #a90000;
}

/* Position and sizing of clickable cross button */
.bm-cross-button {
  height: 24px;
  width: 24px;
}

/* Color/shape of close button cross */
.bm-cross {
  background: #bdc3c7;
}

/*
Sidebar wrapper styles
Note: Beware of modifying this element as it can break the animations - you should not need to touch it in most cases
*/
.bm-menu-wrap {
  position: fixed;
  height: 100%;
}

/* General sidebar styles */
.bm-menu {
  background: #373a47;
  padding: 2.5em 1.5em 0;
  font-size: 1.15em;
}

/* Morph shape necessary with bubble or elastic */
.bm-morph-shape {
  fill: #373a47;
}

/* Wrapper for item list */
.bm-item-list {
  color: #b8b7ad;
  padding: 0.8em;
}

/* Individual item */
.bm-item {
  display: inline-block;
}

/* Styling of overlay */
.bm-overlay {
  background: rgba(0, 0, 0, 0.3);
}

JavaScript

The same styles can be written as a JavaScript object like this:

var styles = {
  bmBurgerButton: {
    position: 'fixed',
    width: '36px',
    height: '30px',
    left: '36px',
    top: '36px'
  },
  bmBurgerBars: {
    background: '#373a47'
  },
  bmBurgerBarsHover: {
    background: '#a90000'
  },
  bmCrossButton: {
    height: '24px',
    width: '24px'
  },
  bmCross: {
    background: '#bdc3c7'
  },
  bmMenuWrap: {
    position: 'fixed',
    height: '100%'
  },
  bmMenu: {
    background: '#373a47',
    padding: '2.5em 1.5em 0',
    fontSize: '1.15em'
  },
  bmMorphShape: {
    fill: '#373a47'
  },
  bmItemList: {
    color: '#b8b7ad',
    padding: '0.8em'
  },
  bmItem: {
    display: 'inline-block'
  },
  bmOverlay: {
    background: 'rgba(0, 0, 0, 0.3)'
  }
}

<Menu styles={ styles } />

Browser support

Because this project uses CSS3 features, it's only meant for modern browsers. Some browsers currently fail to apply some of the animations correctly.

Chrome and Firefox have full support, but Safari and IE have strange behavior for some of the menus.

Help

Check the FAQ (https://github.com/negomi/react-burger-menu/wiki/FAQ) to see if your question has been answered already, or open a new issue.

License

MIT