react-responsive vs react-media
Responsive Design Libraries for React Comparison
1 Year
react-responsivereact-mediaSimilar Packages:
What's Responsive Design Libraries for React?

Responsive design libraries for React facilitate the creation of applications that adapt seamlessly to various screen sizes and devices. These libraries provide tools and components that help developers implement media queries and responsive layouts more efficiently. By leveraging these packages, developers can ensure that their applications deliver an optimal user experience across a wide range of devices, from mobile phones to desktop computers. Both react-media and react-responsive offer unique approaches to handling responsive design, making them valuable tools in a developer's toolkit.

Package Weekly Downloads Trend
Github Stars Ranking
Stat Detail
Package
Downloads
Stars
Size
Issues
Publish
License
react-responsive733,1737,08156.6 kB54 days agoMIT
react-media110,4432,436-85 years agoMIT
Feature Comparison: react-responsive vs react-media

Media Query Handling

  • react-responsive:

    react-responsive offers a more declarative syntax for media queries, allowing you to define breakpoints directly in your JSX. It provides a set of components that automatically adjust rendering based on the screen size, making it easier to manage responsive layouts.

  • react-media:

    react-media provides a simple API for defining media queries and allows you to render components conditionally based on the current viewport size. It supports both CSS media queries and custom breakpoints, making it flexible for various use cases.

Flexibility and Customization

  • react-responsive:

    react-responsive provides a higher-level abstraction, which can simplify the implementation of responsive designs. It allows for easier management of breakpoints and responsive components, making it suitable for larger applications.

  • react-media:

    react-media is lightweight and allows for granular control over how components render based on media queries. This flexibility is beneficial for developers who want to implement specific logic for different screen sizes without a lot of overhead.

Performance

  • react-responsive:

    react-responsive also focuses on performance, but its higher-level abstraction may introduce some overhead compared to react-media. However, it still maintains good performance by optimizing re-renders based on screen size changes.

  • react-media:

    react-media is optimized for performance, as it only re-renders components when the media query conditions change. This minimizes unnecessary renders and improves the overall efficiency of your application.

Ease of Use

  • react-responsive:

    react-responsive's declarative approach can be easier for developers to use, especially those familiar with JSX. It allows for a more intuitive way to implement responsive designs directly within the component structure.

  • react-media:

    react-media has a straightforward API that is easy to understand, making it suitable for developers who prefer a minimalistic approach to responsive design without additional complexity.

Community and Ecosystem

  • react-responsive:

    react-responsive has a larger community and ecosystem, providing more resources, examples, and third-party integrations. This can be beneficial for developers seeking support and additional tools for responsive design.

  • react-media:

    react-media has a smaller community compared to react-responsive, but it is still well-maintained and offers sufficient documentation for developers looking to implement media queries in their applications.

How to Choose: react-responsive vs react-media
  • react-responsive:

    Choose react-responsive if you prefer a more comprehensive and feature-rich solution that provides a higher-level abstraction for responsive design. It offers a more declarative approach to media queries and includes additional features like responsive images and breakpoints, making it suitable for larger projects that require extensive responsive capabilities.

  • react-media:

    Choose react-media if you need a lightweight solution that focuses on media query handling and allows for conditional rendering based on screen size. It is ideal for projects where you want to implement specific components or styles based on the current viewport without a complex setup.

README for react-responsive

react-responsive NPM version Downloads

Information

Packagereact-responsive
DescriptionMedia queries in react for responsive design
Browser Version>= IE6*
Demo

The best supported, easiest to use react media query module.

Install

$ npm install react-responsive --save

Example Usage

With Hooks

Hooks is a new feature available in 8.0.0!

import React from 'react'
import { useMediaQuery } from 'react-responsive'

const Example = () => {
  const isDesktopOrLaptop = useMediaQuery({
    query: '(min-width: 1224px)'
  })
  const isBigScreen = useMediaQuery({ query: '(min-width: 1824px)' })
  const isTabletOrMobile = useMediaQuery({ query: '(max-width: 1224px)' })
  const isPortrait = useMediaQuery({ query: '(orientation: portrait)' })
  const isRetina = useMediaQuery({ query: '(min-resolution: 2dppx)' })

  return (
    <div>
      <h1>Device Test!</h1>
      {isDesktopOrLaptop && <p>You are a desktop or laptop</p>}
      {isBigScreen && <p>You have a huge screen</p>}
      {isTabletOrMobile && <p>You are a tablet or mobile phone</p>}
      <p>Your are in {isPortrait ? 'portrait' : 'landscape'} orientation</p>
      {isRetina && <p>You are retina</p>}
    </div>
  )
}

With Components

import MediaQuery from 'react-responsive'

const Example = () => (
  <div>
    <h1>Device Test!</h1>
    <MediaQuery minWidth={1224}>
      <p>You are a desktop or laptop</p>
      <MediaQuery minWidth={1824}>
        <p>You also have a huge screen</p>
      </MediaQuery>
    </MediaQuery>
    <MediaQuery minResolution="2dppx">
      {/* You can also use a function (render prop) as a child */}
      {(matches) =>
        matches ? <p>You are retina</p> : <p>You are not retina</p>
      }
    </MediaQuery>
  </div>
)

API

Using Properties

To make things more idiomatic to react, you can use camel-cased shorthands to construct media queries.

For a list of all possible shorthands and value types see https://github.com/yocontra/react-responsive/blob/master/src/mediaQuery.ts#L9.

Any numbers given as shorthand will be expanded to px (1234 will become '1234px').

The CSS media queries in the example above could be constructed like this:

import React from 'react'
import { useMediaQuery } from 'react-responsive'

const Example = () => {
  const isDesktopOrLaptop = useMediaQuery({ minWidth: 1224 })
  const isBigScreen = useMediaQuery({ minWidth: 1824 })
  const isTabletOrMobile = useMediaQuery({ maxWidth: 1224 })
  const isPortrait = useMediaQuery({ orientation: 'portrait' })
  const isRetina = useMediaQuery({ minResolution: '2dppx' })

  return <div>...</div>
}

Forcing a device with the device prop

At times you may need to render components with different device settings than what gets automatically detected. This is especially useful in a Node environment where these settings can't be detected (SSR) or for testing.

Possible Keys

orientation, scan, aspectRatio, deviceAspectRatio, height, deviceHeight, width, deviceWidth, color, colorIndex, monochrome, resolution and type

Possible Types

type can be one of: all, grid, aural, braille, handheld, print, projection, screen, tty, tv or embossed

Note: The device property always applies, even when it can be detected (where window.matchMedia exists).

import { useMediaQuery } from 'react-responsive'

const Example = () => {
  const isDesktopOrLaptop = useMediaQuery(
    { minDeviceWidth: 1224 },
    { deviceWidth: 1600 } // `device` prop
  )

  return (
    <div>
      {isDesktopOrLaptop && (
        <p>
          this will always get rendered even if device is shorter than 1224px,
          that's because we overrode device settings with 'deviceWidth: 1600'.
        </p>
      )}
    </div>
  )
}

Supplying through Context

You can also pass device to every useMediaQuery hook in the components tree through a React Context. This should ease up server-side-rendering and testing in a Node environment, e.g:

Server-Side Rendering
import { Context as ResponsiveContext } from 'react-responsive'
import { renderToString } from 'react-dom/server'
import App from './App'

...
  // Context is just a regular React Context component, it accepts a `value` prop to be passed to consuming components
  const mobileApp = renderToString(
    <ResponsiveContext.Provider value={{ width: 500 }}>
      <App />
    </ResponsiveContext.Provider>
  )
...

If you use next.js, structure your import like this to disable server-side rendering for components that use this library:

import dynamic from 'next/dynamic'
const MediaQuery = dynamic(() => import('react-responsive'), {
  ssr: false
})
Testing
import { Context as ResponsiveContext } from 'react-responsive'
import { render } from '@testing-library/react'
import ProductsListing from './ProductsListing'

describe('ProductsListing', () => {
  test('matches the snapshot', () => {
    const { container: mobile } = render(
      <ResponsiveContext.Provider value={{ width: 300 }}>
        <ProductsListing />
      </ResponsiveContext.Provider>
    )
    expect(mobile).toMatchSnapshot()

    const { container: desktop } = render(
      <ResponsiveContext.Provider value={{ width: 1000 }}>
        <ProductsListing />
      </ResponsiveContext.Provider>
    )
    expect(desktop).toMatchSnapshot()
  })
})

Note that if anything has a device prop passed in it will take precedence over the one from context.

onChange

You can use the onChange callback to specify a change handler that will be called when the media query's value changes.

import React from 'react'
import { useMediaQuery } from 'react-responsive'

const Example = () => {
  const handleMediaQueryChange = (matches) => {
    // matches will be true or false based on the value for the media query
  }
  const isDesktopOrLaptop = useMediaQuery(
    { minWidth: 1224 },
    undefined,
    handleMediaQueryChange
  )

  return <div>...</div>
}
import React from 'react'
import MediaQuery from 'react-responsive'

const Example = () => {
  const handleMediaQueryChange = (matches) => {
    // matches will be true or false based on the value for the media query
  }

  return (
    <MediaQuery minWidth={1224} onChange={handleMediaQueryChange}>
      ...
    </MediaQuery>
  )
}

Easy Mode

That's it! Now you can create your application specific breakpoints and reuse them easily. Here is an example:

import { useMediaQuery } from 'react-responsive'

const Desktop = ({ children }) => {
  const isDesktop = useMediaQuery({ minWidth: 992 })
  return isDesktop ? children : null
}
const Tablet = ({ children }) => {
  const isTablet = useMediaQuery({ minWidth: 768, maxWidth: 991 })
  return isTablet ? children : null
}
const Mobile = ({ children }) => {
  const isMobile = useMediaQuery({ maxWidth: 767 })
  return isMobile ? children : null
}
const Default = ({ children }) => {
  const isNotMobile = useMediaQuery({ minWidth: 768 })
  return isNotMobile ? children : null
}

const Example = () => (
  <div>
    <Desktop>Desktop or laptop</Desktop>
    <Tablet>Tablet</Tablet>
    <Mobile>Mobile</Mobile>
    <Default>Not mobile (desktop or laptop or tablet)</Default>
  </div>
)

export default Example

And if you want a combo (the DRY way):

import { useMediaQuery } from 'react-responsive'

const useDesktopMediaQuery = () =>
  useMediaQuery({ query: '(min-width: 1280px)' })

const useTabletAndBelowMediaQuery = () =>
  useMediaQuery({ query: '(max-width: 1279px)' })

const Desktop = ({ children }) => {
  const isDesktop = useDesktopMediaQuery()

  return isDesktop ? children : null
}

const TabletAndBelow = ({ children }) => {
  const isTabletAndBelow = useTabletAndBelowMediaQuery()

  return isTabletAndBelow ? children : null
}

Browser Support

Out of the box

Chrome9
Firefox (Gecko)6
MS EdgeAll
Internet Explorer10
Opera12.1
Safari5.1

With Polyfills

Pretty much everything. Check out these polyfills: