材质ui中的<grid>导致水平滚动 - React

时间:2017-08-05 07:09:32

标签: reactjs grid-layout material-ui

我正在使用由此命令安装的材料ui版本1.

npm install -S material-ui@next

每次我想使用时,页面中都会出现不需要的水平滚动。例如,这是一个简单的代码:

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


/* project imports */
import NavMenu from './Page-Parts/NavMenu';
import LoginPanel from './Login-Parts/LoginPanel';

const styleSheet = createStyleSheet('FullWidthGrid', theme => ({
  root: {
    flexGrow: 1,
    marginTop: 0,
  },
  paper: {
    padding: 16,
    textAlign: 'center',
    color: theme.palette.text.secondary,
    marginTop: "3rem"
  },
}));

function Login(props){
    const classes = props.classes;
    return (
    <div className={classes.root}>
      <Grid container gutter={24} justify='center'>
        <Grid item xs={12} md={12} sm={12} lg={12}>
          <NavMenu/>
        </Grid>
        <Grid item xs={6} sm={6} md={6} lg={6}>
          <Paper className={classes.paper}>
            <LoginPanel />
          </Paper>
        </Grid>
      </Grid>
    </div>
    );
}

Login.propTypes = {
  classes: PropTypes.object.isRequired,
};

export default withStyles(styleSheet)(Login);

我无法使用bootstrap或任何其他网格布局选项,因为它们与此库冲突。这个代码示例并不是什么大问题但是当我在组件的其他部分使用时(例如在抽屉中),水平滚动出现会让人觉得难看 NavMenu和LoginPanel是一些自制组件,它们没问题。使用它们而不会导致水平滚动

9 个答案:

答案 0 :(得分:18)

我有同样的问题。我想出了几个解决方案,但感觉不是很优雅:

禁用间距
不幸的是,这会从容器中的子网格项中删除所有填充:

<Grid container
  spacing={0}>

手动修复CSS
这就是我最终做的事情:

<Grid container
  style={{
    margin: 0,
    width: '100%',
  }}>

答案 1 :(得分:12)

从评论中复制了简单的解决方案:

xs={12} 添加到 <Grid container>

<Grid container spacing={3} xs={12}>

归功于https://github.com/mui-org/material-ui/issues/7466#issuecomment-509150645

答案 2 :(得分:4)

这是由spacing引起的。有时我们仍然可以通过限制容器下的网格来使用spacing

<Container maxWidth={false}>
  <Grid container spacing={6}>
    Omit
  </Grid>
</Container>

答案 3 :(得分:2)

这对我有用!

<Box style={{overflow: 'auto'}}>
<Grid>...</Grid>
</Box>

答案 4 :(得分:0)

我面临着同样的问题。从Grid容器中删除间距并不能解决问题。

解决方案:

设置maxWidth可以解决问题并分配所需的宽度,而不是在Grid容器的父项上进行设置。例如,如果我们在作为Grid容器父级的Box上设置maxWidth,则Grid不会水平溢出。

我们不需要在Grid容器上将宽度设置为100%,因为其目的是默认情况下适应100%的宽度。

 <Box style={{ maxWidth: 600}}>
     <Grid container spacing={3}>
     ...
     </Grid>
 </Box>

答案 5 :(得分:0)

我想到的主意是

<Grid container>
 <Grid item xs={12} md={4}>
    <div style={{width:"97%",margin:"0 auto"}}>
     .....Your content
     </div>
  </Grid>
  <Grid item xs={12} md={4}>
    <div style={{width:"97%",margin:"0 auto"}}>
     .....Your content
     </div>
  </Grid>
  <Grid item xs={12} md={4}>
    <div style={{width:"97%",margin:"0 auto"}}>
     .....Your content
     </div>
  </Grid>
 </Grid>

答案 6 :(得分:0)

最好的解决方案是将网格包装在最大宽度的容器中

<Container>
    <Grid container spacing={2}>
        <Grid item sm={6}></Grid>
        <Grid item sm={6}></Grid>
        <Grid item sm={6}></Grid>
        <Grid item sm={6}></Grid>
   </Grid>
</Container>

这样,容器会处理溢出问题,并且网格始终会响应性地扩展到父级。到目前为止,这是我找到的最优雅的解决方案。

提示:如果您正在使用该库创建类似仪表板的内容,则始终将内容区域的父级设置为<Container>,这样就永远不会发生溢出问题。试一试。在奋斗了一段时间之后,到处都找不到非常优雅的解决方案,这对我来说工作得很好。我必须说,应该在React Material UI页面中对此进行很好的记录。

答案 7 :(得分:0)

这是具有负边距的网格的已知限制。 https://material-ui.com/components/grid/#limitations

  1. 不要使用网格间距并手动配置间距。

  2. 向父级添加至少等于一半间距的填充,例如:

    12 = 3(间距)* 8(主题间距像素)/ 2

<Box p={12}> {/* or style={{ padding: 12 }} */}
  <Grid ... spacing={3}>
    ..additional configuration
  </Grid>
</Box>

这个解决方案的缺点是它改变了组件的外观。

  1. 设置溢出-x:隐藏
<Box style={{overflowX: "hidden"}}>
  <Grid ... spacing={3}>
    ..additional configuration
  </Grid>
</Box>

此解决方案的缺点是(在我的测试中)会导致触摸屏尝试垂直滚动时出现问题...

答案 8 :(得分:0)

最新版本的 Material-UI (v5.0.0-alpha.30) 现已修复了根本问题。见https://github.com/mui-org/material-ui/issues/7466#issuecomment-820736245