You need to enable JavaScript to run this app. Material UI React如何实现Box下方文本与文本按钮同行居两侧对齐
优惠活动
大模型
产品
解决方案
定价
更多

Material UI React如何实现Box下方文本与文本按钮同行居两侧对齐

问题:Material UI React中签名画布下方文本与按钮两端对齐问题

在Material UI React框架中,我目前很难将文本和文本按钮对齐到Box下方的同一行,当前实现效果见截图:
对齐问题示意图

我需要实现的效果是:“Sign using your mouse or touchpad.”文本和“Redo signature”按钮位于Box下方的同一行,分别居于行的两侧。

我尝试了多种方案,目前的代码是最接近预期的,但还是无法让按钮固定在Box下方、和文本分别处于行的两端,代码如下:

React代码:

<Box className={classes.counterSignatureContainer}>
          <Box className={classes.canvasContainer}>
            <canvas ref={canvasRef} height={158} width={510} />
          </Box>
        </Box>
        <Grid container spacing={3}>
          <Grid
            container
            direction="row"
            justify="space-between"
            alignItems="center"
          >
            <Grid item xs={6}>
              <Box className={classes.instructionContainer}>
                <Typography variant="caption">
                  <FormattedMessage
                    defaultMessage={'Sign using your mouse or touch pad.'}
                  />
                </Typography>
              </Box>
            </Grid>
            <Grid item xs={3}>
              <Box className={classes.redoContainer}>
                <Button
                  disabled={!signatureData}
                  color="primary"
                  title="Redo signature"
                  onClick={clear}
                  fullWidth={false}
                >
                  <FormattedMessage defaultMessage={'Redo signature'} />
                </Button>
              </Box>
            </Grid>
          </Grid>
        </Grid>
        <Box className={classes.countersignButtonContainer}>
          <Button
            disabled={!signatureData}
            color="primary"
            variant="outlined"
            title="Countersign"
            onClick={handleCountersign}
            fullWidth={false}
          >
            <FormattedMessage defaultMessage={'Countersign'} />
          </Button>
        </Box>

对应样式代码:

counterSignatureContainer: {
    textAlign: 'center',
    position: 'relative',
    margin: theme.spacing(8, 0, 0, 5),
    width: SIGNATURE_CONTAINER_WIDTH,
    height: 160,
    backgroundColor: '#E1E1E1',
  },
  canvasContainer: {
    position: 'relative',
    display: 'flex',
    flex: 1,
  },
  instructionContainer: {
    margin: theme.spacing(1, 6),
    color: '#393939',
  },
  countersignButtonContainer: {
    margin: theme.spacing(1, 6),
  },
  signatureContainer: {
    textAlign: 'center',
    position: 'relative',
    margin: theme.spacing(3, 5),
    width: 512,
    height: 160,
    backgroundColor: '#0000000A',
  },
  signature: {
    maxWidth: '100%',
    maxHeight: '100%',
  },
  redoContainer: {
    margin: theme.spacing(1, 0, 0, -1),
  },

解决方案

你遇到的布局问题核心有两点:一是嵌套了多余的Grid容器导致有效宽度被限制,二是固定了Grid项的宽度,留白太多导致按钮无法靠到最右侧。按以下步骤修改即可实现预期效果:

1. 简化布局结构

删掉外层多余的Grid container spacing={3}容器,不要固定子Grid项的xs宽度,让内容自适应:

<Box className={classes.counterSignatureContainer}>
  <Box className={classes.canvasContainer}>
    <canvas ref={canvasRef} height={158} width={510} />
  </Box>
</Box>
<Grid
  container
  direction="row"
  justify="space-between"
  alignItems="center"
  className={classes.bottomRowContainer}
>
  <Grid item>
    <Box className={classes.instructionContainer}>
      <Typography variant="caption">
        <FormattedMessage
          defaultMessage={'Sign using your mouse or touch pad.'}
        />
      </Typography>
    </Box>
  </Grid>
  <Grid item>
    <Box className={classes.redoContainer}>
      <Button
        disabled={!signatureData}
        color="primary"
        title="Redo signature"
        onClick={clear}
        fullWidth={false}
      >
        <FormattedMessage defaultMessage={'Redo signature'} />
      </Button>
    </Box>
  </Grid>
</Grid>
<Box className={classes.countersignButtonContainer}>
  <Button
    disabled={!signatureData}
    color="primary"
    variant="outlined"
    title="Countersign"
    onClick={handleCountersign}
    fullWidth={false}
  >
    <FormattedMessage defaultMessage={'Countersign'} />
  </Button>
</Box>

注:如果你使用的是MUI v5版本,需要把Grid容器的justify属性替换为justifyContent,对应API有调整。

2. 调整样式匹配宽度

给新增的bottomRowContainer设置和上方签名框一致的宽度,调整边距避免错位:

counterSignatureContainer: {
    textAlign: 'center',
    position: 'relative',
    margin: theme.spacing(8, 0, 0, 5),
    width: SIGNATURE_CONTAINER_WIDTH,
    height: 160,
    backgroundColor: '#E1E1E1',
  },
  // 新增底部行样式,和上方签名框宽度、边距对齐
  bottomRowContainer: {
    width: SIGNATURE_CONTAINER_WIDTH,
    margin: theme.spacing(1, 0, 0, 5),
    padding: '0 16px',
  },
  canvasContainer: {
    position: 'relative',
    display: 'flex',
    flex: 1,
  },
  instructionContainer: {
    margin: 0,
    color: '#393939',
  },
  countersignButtonContainer: {
    margin: theme.spacing(1, 6),
  },
  signatureContainer: {
    textAlign: 'center',
    position: 'relative',
    margin: theme.spacing(3, 5),
    width: 512,
    height: 160,
    backgroundColor: '#0000000A',
  },
  signature: {
    maxWidth: '100%',
    maxHeight: '100%',
  },
  redoContainer: {
    margin: 0,
  },

如果不想用Grid布局,也可以直接用Box的flex属性实现,代码更简洁:把中间的Grid容器替换为<Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>即可,效果完全一致。


内容的提问来源于stack exchange,提问作者Jakub

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 19:36:03