--- title: Space 间距 description: 为一组内联元素设置统一间距,并支持插入分隔符 --- # Space 间距 `Space` 给一组子元素之间加统一间距,省去给每个元素写 `margin` 的麻烦。 **Space 与 Grid 的分工**:`Space` 面向「一行内联元素的等距排列」(按钮行、标签行、操作区),会给每个子元素包一层包装以支持分隔符与空节点隐藏;整块页面布局请用 [Grid 栅格](/ui/general/grid)。 ## 何时使用 - 一排按钮 / 标签 / 文字之间需要统一间距时; - 需要在元素之间插入分隔符(`|`、`·`)时; - 子元素数量不确定、其中有条件渲染的节点时(空节点不会占位)。 ## 基础用法 默认水平排列、间距 `small`(8px)、交叉轴居中对齐。 ## 间距大小 `size` 支持三种写法:预设名 `small` / `middle` / `large`、数字(按 px 处理)、以及 `[水平, 垂直]` 数组。 | 写法 | 效果 | | --- | --- | | `size="small"` | 8px | | `size="middle"` | 16px(默认档,常用于行内) | | `size="large"` | 24px | | `:size="12"` | 12px | | `:size="[16, 8]"` | 列间距 16px、行间距 8px(配合 `wrap` 用) | ## 纵向排列 `vertical` 是简写;`orientation` 与它同时配置时,以 `orientation` 优先(这样上层组件透传 `orientation` 时不会被 `vertical` 覆盖)。 ## 分隔符 `#separator` 插槽会在相邻子元素之间插入内容,**不会**在首尾添加。 ## 自动换行 `wrap` 只在水平方向生效;配合 `[水平, 垂直]` 形式的 `size` 可以分别控制列间距与行间距。 ## 空节点不占位 `v-if` 关闭的节点、注释节点不会被计入间距,因此条件渲染不会留下空隙。 ## API ### Props | 名称 | 类型 | 默认值 | 说明 | | --- | --- | --- | --- | | `size` | `'small' \| 'middle' \| 'large' \| number \| string \| [SpaceSize, SpaceSize]` | `'small'` | 间距。数组按 `[水平, 垂直]` 解析;数字按 px;其他字符串原样透传给 `column-gap` / `row-gap` | | `orientation` | `'horizontal' \| 'vertical'` | 由 `vertical` 决定 | 排列方向。优先级高于 `vertical` | | `vertical` | `boolean` | `false` | 纵向排列的简写 | | `align` | `'start' \| 'end' \| 'center' \| 'baseline'` | 水平方向 `'center'`,纵向不设置 | 交叉轴对齐(`align-items`) | | `wrap` | `boolean` | `false` | 是否自动换行,仅水平方向生效 | ### Slots | 名称 | 参数 | 说明 | | --- | --- | --- | | `default` | — | 间距容器内的元素。每个有效子节点会被包一层 `g3-space__item` | | `separator` | — | 相邻元素之间插入的分隔内容 | ### 类型定义 ```ts export type SpaceSize = 'small' | 'middle' | 'large' | number | string export type SpaceOrientation = 'horizontal' | 'vertical' export type SpaceAlign = 'start' | 'end' | 'center' | 'baseline' export interface SpaceProps { size?: SpaceSize | [SpaceSize, SpaceSize] orientation?: SpaceOrientation vertical?: boolean align?: SpaceAlign wrap?: boolean } ``` ## 实现说明 - 间距用 CSS 的 `gap` 实现(`column-gap` / `row-gap`),因此**不依赖子元素是否有 margin**,也不会出现「相邻 margin 合并」的问题; - 子元素会被包一层 `inline-flex` 的 `g3-space__item`,这让分隔符有落点,同时过滤掉注释 / 文本空节点; - 纵向排列时默认不设置 `align`(即 `stretch`),这样「撑满宽度」的按钮才不会被压成内容宽度;需要居中时显式传 `align="center"`。