【问题标题】:How to correctly implement this layout using Material-UI Grid component如何使用 Material-UI Grid 组件正确实现此布局
【发布时间】:2020-05-09 12:08:42
【问题描述】:

我正在尝试使用 Grid 组件在 Material-UI 中实现此布局。

我用红色突出显示了容器边框,以便更清楚地看到边界在哪里。

  • 添加按钮应位于容器的右端
  • 芯片应在左侧对齐,并在水平方向占用尽可能多的空间

  • 筹码堆叠时,添加按钮应与容器底部垂直对齐

我已经设法使用嵌套网格来实现这一点,如下例所示:

import React, { useState } from 'react'
import { Button, Grid, Chip, Box } from '@material-ui/core'

export default function App() {
  const [chips, setChips] = useState(1)

  const addChip = () => setChips(c => c + 1)
  const removeChip = i => setChips(c => c - 1)

  const renderChips = () =>
    Array(chips)
      .fill(null)
      .map((_, i) => (
        <Grid item key={i}>
          <Chip label={`Chip ${i}`} onDelete={() => removeChip(i)} />
        </Grid>
      ))

  return (
    <Box border="1px solid red">
      <Grid container wrap="nowrap" spacing={2}>
        <Grid item xs>
          <Grid container spacing={1}>
            {renderChips()}
          </Grid>
        </Grid>
        <Grid item display="flex" component={Box}>
          <Grid container alignItems="flex-end">
            <Grid item>
              <Button variant="contained" color="primary" onClick={addChip}>
                Add
              </Button>
            </Grid>
          </Grid>
        </Grid>
      </Grid>
    </Box>
  )
}

我希望避免不必要地嵌套 Grid 组件。更具体地说,我想使用&lt;Grid item container&gt; 而不是包含&lt;Grid item&gt;&lt;Grid container&gt;,但是使用这种方法我无法实现这种扩展左侧芯片部分并保持右侧按钮的布局,同时保持它垂直对齐底部。

【问题讨论】:

    标签: css layout material-ui


    【解决方案1】:

    尝试使用以下块

    <Box border="1px solid red" style={{'postion':'relative'}}>
          <Grid container spacing={2} style={{'padding': '1px 80px 1px 1px'}}>
                {renderChips()}
          </Grid>
          <Button variant="contained" color="primary" onClick={addChip} style={{'position':'relative', 'float': 'right', 'bottom': '35px'}}>
                    Add
          </Button>    
    </Box>
    

    而不是

    <Box border="1px solid red">
          <Grid container wrap="nowrap" spacing={2}>
            <Grid item xs>
              <Grid container spacing={1}>
                {renderChips()}
              </Grid>
            </Grid>
            <Grid item display="flex" component={Box}>
              <Grid container alignItems="flex-end">
                <Grid item>
                  <Button variant="contained" color="primary" onClick={addChip}>
                    Add
                  </Button>
                </Grid>
              </Grid>
            </Grid>
          </Grid>
        </Box>
    

    【讨论】:

    • 静态填充和定位听起来不是一个好的解决方案。
    • 是的。我同意,但有时它不会伤害,对吧?例如,在这种情况下,您不认为这可以吗。说,您的按钮大小不会随窗口大小而变化,所以静态定位对我来说似乎没问题。我将根据您的父 div 进行定位(即在这种情况下,相对于您的输入 div)。我会用按钮长度的大小和更多一点来填充您的输入。我会在右下角浮动你的按钮。无论如何,这就是我所做的,我也可能是错的。
    • 那么让我澄清一下这个问题的意图。我不是在寻找使用 MUI 网格的替代方法,我会知道如何使用 flexbox 或其他 CSS 来实现它,我想了解是否有更好(换句话说,嵌套较少)的方法来实现什么我需要使用 Grid 组件
    • 道歉。我误解了你的意图。
    【解决方案2】:

    你的网格结构与你想要得到的不一致:

    |-----------------------------|-----|
    | item1 | item2 | item3 |     |     |  
    | item4 | item... | item 20   |     |
    | item 21 ...                 | Add |
    |-----------------------------|-----|
    

    如果您将其分成两列 - Add 按钮将永远不会按照您的意愿对齐。

    相反 - Add 不应该拥有它自己的列 - 但应该是主块的一部分(相同的元素流)。您唯一需要做的就是确保它位于右侧,您可以通过margin-left: auto 获得它:

    <Box border="1px solid red">
      <Grid container wrap="nowrap" spacing={2}>
        <Grid item xs>
          <Grid container spacing={1}>
            {renderChips()}
            <Grid item style={{ marginLeft: "auto" }}>
              <Button variant="contained" color="primary" onClick={addChip}>
                Add
              </Button>
            </Grid>
          </Grid>
        </Grid>
      </Grid>
    </Box>
    

    这是基于您的原始沙箱的上述实现:https://codesandbox.io/s/grid-item-stick-to-right-3xzj2?file=/src/App.js

    【讨论】:

    • 我不确定您为什么说“添加”按钮永远不会像我想要的那样对齐,正如您在链接示例中看到的那样,它正确对齐。另请注意,您的示例没有达到我想要实现的效果,因为原始示例在芯片之间的间距为 1,在芯片部分和按钮之间的间距为 2。最后,您示例中的大部分 Grid 代码都是多余的,因为您基本上没有使用 Grid。如果您更仔细地阅读问题,我的意图是使用 Grid 但避免多重嵌套。
    • 主要是因为在您的示例中,如果您有两行 - 第 1 行的最后一项不会位于“添加”按钮的正上方,因此您将拥有:i.stack.imgur.com/3Z0Yx.png 而不是:@987654323 @你在找那个吗?关于多重嵌套 - 我想这是一个需要解决的小问题。
    • 我对问题中显示的布局非常满意,我不需要按钮位于芯片下方,我希望它位于不同的列中。问题只是关于在没有那么多嵌套的情况下实现布局的更好方法。
    猜你喜欢
    • 2020-05-02
    • 2019-09-09
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    相关资源
    最近更新 更多