全宽 Material-UI 网格无法正常工作

Posted

技术标签:

【中文标题】全宽 Material-UI 网格无法正常工作【英文标题】:Full Width Material-UI Grid not working as it should 【发布时间】:2018-09-22 15:34:14 【问题描述】:

我正在尝试了解 Material-UI@next 网格布局系统。

我的目标是让两张纸在整个屏幕宽度上展开,并在屏幕变小到只有一张纸时中断。 documentation 的代码如下:sn-p:

  <Container>
    <Grid container spacing=24>
      <Grid item xs=12>
        <Paper>xs=12</Paper>
      </Grid>
      <Grid item xs=12 sm=6>
        <Paper>xs=12 sm=6</Paper>
      </Grid>
      <Grid item xs=12 sm=6>
        <Paper>xs=12 sm=6</Paper>
      </Grid>
      <Grid item xs=6 sm=3>
        <Paper>xs=6 sm=3</Paper>
      </Grid>
      <Grid item xs=6 sm=3>
        <Paper>xs=6 sm=3</Paper>
      </Grid>
      <Grid item xs=6 sm=3>
        <Paper>xs=6 sm=3</Paper>
      </Grid>
      <Grid item xs=6 sm=3>
        <Paper>xs=6 sm=3</Paper>
      </Grid>
    </Grid>
  </Container>

这会导致以下结果:

然后我修改了代码以尝试实现我只写两篇论文的目标,如下所示:

  <Container>
    <Grid container spacing=24>
      <Grid item xs=12 sm=6>
        <Paper>xs=12 sm=6</Paper>
      </Grid>
      <Grid item xs=12 sm=6>
        <Paper>xs=12 sm=6</Paper>
      </Grid>
    </Grid>
  </Container>

但正如您所见,这会导致两篇论文没有占据整个屏幕:

有人可以给我指出一个工作示例 sn-p,它允许我拥有两个占据整个宽度的元素吗?

【问题讨论】:

【参考方案1】:

我知道这是个老问题,但只是想分享一下。

您的代码的问题是 spacing=24 基于文档 Spacing 。默认情况下,两个网格项之间的间距遵循线性函数:output(spacing) = spacing * 8px

例如spacing=24 创建一个 192px 宽的间隙。所以最后,可用于内容的空间非常小。

<Grid container spacing=2> //  usually 2 or 3  is quite enough for me
  <Grid item xs=12 sm=6>
    <Paper>xs=12 sm=6</Paper>
  </Grid>
  <Grid item xs=12 sm=6>
    <Paper>xs=12 sm=6</Paper>
  </Grid>
</Grid>

【讨论】:

【参考方案2】:

最佳实践是测试所有断点并为每个屏幕宽度指定空间分配。

<Grid item xs=12 sm=12 md=12 lg=6 xl=4>

</Grid>

xs,超小0px

sm,小:600px

md,中:960px

lg,大:1280px。

xl,超大:1920px

https://material-ui.com/customization/breakpoints/

xs 定义组件要使用的网格数。它适用于所有优先级最低的屏幕尺寸。

sm 定义组件要使用的网格数。如果没有被覆盖,它适用于 sm 断点和更宽的屏幕。

md 定义组件要使用的网格数。如果没有被覆盖,它适用于 md 断点和更宽的屏幕。

(等等) 更多:https://material-ui.com/api/grid/

【讨论】:

【参考方案3】:

对于那些使用 styled-components 的 Material UI 的用户,我可以通过以下方式使网格项目正确增长:

import GridBase from "@material-ui/core/Grid";

const Grid = styled(GridBase)`
  .MuiGrid-root 
    flex-grow: 1;
  
`

现在您可以在组件中正常使用Grid

【讨论】:

【参考方案4】:

我怀疑 Container 组件给您带来了问题。由于您尚未链接其实现,请参阅下面的工作示例以了解您想要的内容。

由于 Material 使用 flexbox,它们使用属性 flexGrow

flex-grow CSS 属性指定弹性项目的弹性增长因子。它指定项目应占用的弹性容器内的空间量。弹性项目的弹性增长因子与弹性容器中其他子项的大小有关。

这是控制网格中元素增长的属性。

import React from 'react';
import PropTypes from 'prop-types';
import  withStyles  from 'material-ui/styles';
import Paper from 'material-ui/Paper';
import Grid from 'material-ui/Grid';

const styles = theme => (
  root: 
    flexGrow: 1,
  ,
  paper: 
    padding: theme.spacing.unit * 2,
    textAlign: 'center',
    color: theme.palette.text.secondary,
  ,
);

function CenteredGrid(props) 
  const  classes  = props;

  return (
    <div className=classes.root>
        <Grid container spacing=24>
          <Grid item xs=12 sm=6>
            <Paper>xs=12 sm=6</Paper>
          </Grid>
          <Grid item xs=12 sm=6>
            <Paper>xs=12 sm=6</Paper>
          </Grid>
        </Grid>
    </div>
  );


CenteredGrid.propTypes = 
  classes: PropTypes.object.isRequired,
;

export default withStyles(styles)(CenteredGrid);

【讨论】:

我不明白你的 flex-grow:1 的角色。它仅适用于弹性项目,这里这个 div 是一个***标签...没有它的工作示例...codesandbox.io/s/mm2vwpljr9 @Tomek 我没有看到您的示例中的间距。 谢谢哥们……但我不认为 id 需要 flexGrow

以上是关于全宽 Material-UI 网格无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

Material-UI 应用 backgroundColor 不起作用

使用 react 和 material-ui,我可以让一些纸在容器外扩展到全宽吗?

使用 Material-UI 嵌套网格

如何使 Material-UI Dialog 在 React 中工作

./src/App.js 模块未找到:无法解析 xxx 中的“@material-ui/data-grid”

Material-ui 数据网格过滤器在临时抽屉中不起作用