如何在设计系统中处理组件间距?

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 提供适用于您旅程每个阶段的云产品。 立即开始使用 $200 免费积分!

假设您有一个 <Card /> 组件。它很可能不应该紧贴其他组件,周围没有间距。这对于几乎所有组件都适用。那么,如何在设计系统中处理组件间距呢?

您是否直接在 <Card /> 上使用 margin 来应用间距?也许 margin-block-end: 1rem; margin-inline-end: 1rem; 使其从更多内容自然流动的两侧推开?这有点武断。也许卡片是在 <Grid /> 组件内的子元素,并且网格应用了 gap: 1rem。这很尴尬,因为现在 <Card /> 组件的间距将与 <Grid /> 组件的间距发生冲突,这很可能不是您想要的,更不用说间距是硬编码的了。

Example of a component spacing where a card component is to the left of an accordion component and above an article, with 50 pixels of spacing between all three elements. Lorem i-sum text throughout in a mono font. The card has a Calvin and Hobbes comic image.
向卡片组件的内联开始和块结束添加间距。

关于组件间距的不同观点

Eric Bailey 最近对此进行了研究 并查看了一些选项。

  • 您可以将间距烘焙到每个组件中,并尽力使其尽可能聪明。(但这非常有限。)
  • 您可以传入组件间距,例如 <Card space="xxl" />。(这可能是一个好方法,可能需要多个属性,甚至可能每个方向一个,这非常冗长。)
  • 您可以不使用任何组件间距,并创建一个像 <Spacer /><Layout /> 组件,专门用于组件之间的间距。(它很好地将组件的工作分解,但也可能很冗长并增加不必要的 DOM 权重。)

这场讨论的观点范围很广,有些观点甚至像 Max Stoiber 一样极端,他说 永远不要使用 margin。这对我来说有点教条主义,但我喜欢它试图重新思考问题。我喜欢将间距和布局的工作从组件本身中分离出来的想法——例如,这些内容组件应该完全不关心它们在哪里使用,并让布局发生在它们之上。

Adam Argyle 几年前预测,随着 gap 使用量的增加,CSS 中 margin 的使用量会下降。他最终可能会说对了,尤其是在 flexbox 拥有 gap 并且开发者现在都喜欢在宏观和微观层面上几乎所有东西都使用 CSS Flexbox 和 Grid 的情况下。