128

I'm playing a little bit with Material-UI. Are there any options for creating a grid layout (like in Bootstrap)?

If not, what is the way to add this functionality?

There is a GridList component but I guess it has some different purpose.

2

7 Answers 7

136

Material UI have implemented their own Flexbox layout via the Grid component.

It appears they initially wanted to keep themselves as purely a 'components' library. But one of the core developers decided it was too important not to have their own. It has now been merged into the core code and was released with v1.0.0.

You can install it via:

npm install @material-ui/core

It is now in the official documentation with code examples.

12
  • I see you posted the answer I was just going to add! lol. just responded to your comment on the current leading answer. Commented Feb 28, 2017 at 15:27
  • Just installed and using the alpha branch of Material UI now. Can confirm that the Layout system works well. Commented Apr 7, 2017 at 2:46
  • 3
    The grid system works well but, There are some components which has not been implemented yet, like Select Field. I am stuck on how to use such fields. Can you help me through this? Commented May 10, 2017 at 4:05
  • 1
    I agree with @SureshMainali as I am facing the same issues too. Most of the components have missing props and even regarding the custom theme implementation too
    – Sai Ram
    Commented May 24, 2017 at 8:13
  • @SaiRam I wouldn't say most, but indeed the Select is missing, I've just replaced it with radio buttons for now, but I'm sure it won't be long before the select is ported from trunk.
    – icc97
    Commented May 24, 2017 at 17:47
38

From the description of material design specs:

Grid Lists are an alternative to standard list views. Grid lists are distinct from grids used for layouts and other visual presentations.

If you are looking for a much lightweight Grid component library, I'm using React-Flexbox-Grid, the implementation of flexboxgrid.css in React.

On top of that, React-Flexbox-Grid played nicely with both material-ui, and react-toolbox (the alternative material design implementation).

5
  • 33
    React-Flexbox-Grid is poorly implemented at the time of this post and requires far to many external dependencies to function properly. Plus, @Roylee is the developer of it... so his opinion is a bit biased anyway ;)... Commented Nov 15, 2016 at 19:46
  • 1
    Also, react-flexbox-grid depends on flexboxgrid, which does not use the same responsive breakpoints recommended in Material Design. See: material.io/guidelines/layout/… Commented Feb 21, 2017 at 21:40
  • @Cleanshooter would this be your competing version? Perhaps you're a bit biased too :)
    – icc97
    Commented Feb 26, 2017 at 19:28
  • @icc97 yes and no. Didn't really intend to "compete" it was more of a stop gap for the app I was building. I made that after being disappointed with both... it really doesn't matter anymore though because the guys over at CallEmAll included a grid system in the latest release of Material-UI. I haven't tried it yet personally though. github.com/callemall/material-ui/pull/5808 Commented Feb 28, 2017 at 15:22
  • 1
    @Cleanshooter yours looked pretty good. I've been testing out the new Material-UI grid and it's working well so far.
    – icc97
    Commented Feb 28, 2017 at 19:06
23

I looked around for an answer to this and the best way I found was to use Flex and inline styling on different components.

For example, to make two paper components divide my full screen in 2 vertical components (in ration of 1:4), the following code works fine.

const styles = {
  div:{
    display: 'flex',
    flexDirection: 'row wrap',
    padding: 20,
    width: '100%'
  },
  paperLeft:{
    flex: 1,
    height: '100%',
    margin: 10,
    textAlign: 'center',
    padding: 10
  },
  paperRight:{
    height: 600,
    flex: 4,
    margin: 10,
    textAlign: 'center',
  }
};

class ExampleComponent extends React.Component {
  render() {
    return (
      <div>
        <div style={styles.div}>
          <Paper zDepth={3} style={styles.paperLeft}>
            <h4>First Vertical component</h4>
          </Paper>
          <Paper zDepth={3} style={styles.paperRight}>
              <h4>Second Vertical component</h4>
          </Paper>
        </div>
      </div>
    )
  }
}

Now, with some more calculations, you can easily divide your components on a page.

Further Reading on flex

1
  • 2
    I agree, using flex css properties delivered the simple formatting I needed. Commented Aug 25, 2016 at 19:08
12

I hope this is not too late to give a response.

I was also looking for a simple, robust, flexible and highly customizable bootstrap like react grid system to use in my projects.

The best I know of is react-pure-grid https://www.npmjs.com/package/react-pure-grid

react-pure-grid gives you the power to customize every aspect of your grid system, while at the same time it has built in defaults which probably suits any project

Usage

npm install react-pure-grid --save

-

import {Container, Row, Col} from 'react-pure-grid';

const App = () => (
      <Container>
        <Row>
          <Col xs={6} md={4} lg={3}>Hello, world!</Col>
        </Row>
        <Row>
            <Col xsOffset={5} xs={7}>Welcome!</Col>
        </Row>
      </Container>
);
0
10

The way I do is go to http://getbootstrap.com/customize/ and only check "grid system" to download. There are bootstrap-theme.css and bootstrap.css in downloaded files, and I only need the latter.

In this way, I can use the grid system of Bootstrap, with everything else from Material UI.

3

Below is made by purely MUI Grid system,

MUI - Grid Layout

With the code below,

// MuiGrid.js

import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import Paper from "@material-ui/core/Paper";
import Grid from "@material-ui/core/Grid";

const useStyles = makeStyles(theme => ({
  root: {
    flexGrow: 1
  },
  paper: {
    padding: theme.spacing(2),
    textAlign: "center",
    color: theme.palette.text.secondary,
    backgroundColor: "#b5b5b5",
    margin: "10px"
  }
}));

export default function FullWidthGrid() {
  const classes = useStyles();

  return (
    <div className={classes.root}>
      <Grid container spacing={0}>
        <Grid item xs={12}>
          <Paper className={classes.paper}>xs=12</Paper>
        </Grid>
        <Grid item xs={12} sm={6}>
          <Paper className={classes.paper}>xs=12 sm=6</Paper>
        </Grid>
        <Grid item xs={12} sm={6}>
          <Paper className={classes.paper}>xs=12 sm=6</Paper>
        </Grid>
        <Grid item xs={6} sm={3}>
          <Paper className={classes.paper}>xs=6 sm=3</Paper>
        </Grid>
        <Grid item xs={6} sm={3}>
          <Paper className={classes.paper}>xs=6 sm=3</Paper>
        </Grid>
        <Grid item xs={6} sm={3}>
          <Paper className={classes.paper}>xs=6 sm=3</Paper>
        </Grid>
        <Grid item xs={6} sm={3}>
          <Paper className={classes.paper}>xs=6 sm=3</Paper>
        </Grid>
      </Grid>
    </div>
  );
}

↓ CodeSandbox ↓

Edit MUI-Grid system

2
  • Nice example demo!
    – user11744573
    Commented Aug 26, 2020 at 22:54
  • The demo is a basic example. Often large projects have nested Grids and spacing does not work as desired. Commented Nov 20, 2020 at 11:52
1

Here is example of grid system with material-ui which is similar to bootstrap:

<Grid container>
    <Grid item xs={12} sm={4} md={4} lg={4}>
    </Grid>
    <Grid item xs={12} sm={4} md={4} lg={4}>
    </Grid>
 </Grid>

Not the answer you're looking for? Browse other questions tagged or ask your own question.