表单布局用 Flex 还是 Grid 更合适?

上官艺菲 阅读 53

我在写一个用户信息编辑表单,想让 label 和 input 左右对齐,但用 Flex 布局总感觉间距控制不好,试过 Grid 又担心兼容性。有没有更稳妥的方案?

目前代码是这样写的:

const UserInfoForm = () => (
  <div style={{ display: 'flex', flexDirection: 'column', gap: '12px' }}>
    <div style={{ display: 'flex', alignItems: 'center' }}>
      <label style={{ width: '80px' }}>姓名</label>
      <input style={{ flex: 1 }} />
    </div>
    <div style={{ display: 'flex', alignItems: 'center' }}>
      <label style={{ width: '80px' }}>邮箱</label>
      <input style={{ flex: 1 }} />
    </div>
  </div>
);

但输入框长度不一致时,label 对不齐,看着很乱,求指点!

我来解答 赞 10 收藏
二维码
手机扫码查看
2 条解答
迷人的佳佳
你这问题我太懂了,Flex布局搞表单对齐就是容易翻车。给你两个靠谱方案:

方案1:用Grid,别怕兼容性。现在Grid支持度已经很高了(96%+),性能上比Flex还轻量点。这么改:

const UserInfoForm = () => (
<div style={{
display: 'grid',
gridTemplateColumns: '80px 1fr',
gap: '12px',
alignItems: 'center'
}}>
<label>姓名</label>
<input />
<label>邮箱</label>
<input />
</div>
);


方案2:非要Flex的话,用CSS变量保证宽度一致:
const UserInfoForm = () => (
<div style={{
'--label-width': '80px',
display: 'flex',
flexDirection: 'column',
gap: '12px'
}}>
<div style={{ display: 'flex' }}>
<label style={{ width: 'var(--label-width)' }}>姓名</label>
<input style={{ flex: 1 }} />
</div>
</div>
);


个人推荐Grid方案,代码量少渲染性能更好。实在担心兼容性就加个autoprefixer。
点赞
2026-03-09 11:09
UI春光
UI春光 Lv1
别纠结 Flex 了,这场景就是 Grid 的强项。现在 Grid 兼容性早就不成问题了,除非你要支持 IE。直接把外层容器改成 Grid,定义好列宽,label 和 input 自动对齐,不用每个 label 单独写 width。

直接上代码,把外层容器设为 Grid,两列布局:第一列固定宽度给 label,第二列自动伸缩给 input。

const UserInfoForm = () => (
<div style={{
display: 'grid',
// 第一列固定80px,第二列占满剩余空间
gridTemplateColumns: '80px 1fr',
gap: '12px',
alignItems: 'center'
}}>
<label>姓名</label>
<input />

<label>邮箱</label>
<input />

<label>备注</label>
<input />
</div>
);


这样写,所有 label 都在同一列,宽度统一,input 也在同一列,长度也统一。维护起来也简单,想改 label 宽度只需要改 gridTemplateColumns 一个地方,不用去遍历改样式。
点赞 1
2026-03-04 16:04