Space 间距

虽然我们拥有 Divider 组件,但很多时候我们需要不是一个被 Divider 组件 分割开的页面结构,因此我们会重复的使用很多的 Divider 组件,这在我们的开发效率上造成了一定的困扰。 间距组件就是为了解决这种困扰应运而生的。

基础用法

最基础的用法,通过这个组件来给组件之间提供统一的间距。

通过间距组件来给多个组件之间提供间距

Space 间距 - 图1

  1. <template>
  2. <el-space wrap>
  3. <el-card v-for="i in 3" :key="i" class="box-card" style="width: 250px">
  4. <template #header>
  5. <div class="card-header">
  6. <span>Card name</span>
  7. <el-button class="button" text>Operation button</el-button>
  8. </div>
  9. </template>
  10. <div v-for="o in 4" :key="o" class="text item">
  11. {{ 'List item ' + o }}
  12. </div>
  13. </el-card>
  14. </el-space>
  15. </template>

垂直布局

使用 direction 来控制布局的方式, 背后实际上是利用了 flex-direction 来控制.

我们也提供垂直布局方式。

Space 间距 - 图2

  1. <template>
  2. <el-space direction="vertical">
  3. <el-card v-for="i in 2" :key="i" class="box-card" style="width: 250px">
  4. <template #header>
  5. <div class="card-header">
  6. <span>Card name</span>
  7. <el-button class="button" text>Operation button</el-button>
  8. </div>
  9. </template>
  10. <div v-for="o in 4" :key="o" class="text item">
  11. {{ 'List item ' + o }}
  12. </div>
  13. </el-card>
  14. </el-space>
  15. </template>

控制间距的大小

通过调整 size 的值来控制间距的大小

通过 size 控制组件大小 small, default, large, 分别对应 8px, 12px, 16px的间距. 默认的间距大小为 small,也就是 8px

您也可以通过自定义的 size 来控制大小, 参见下一个部分。

Space 间距 - 图3

  1. <template>
  2. <el-space direction="vertical" alignment="start" :size="30">
  3. <el-radio-group v-model="size">
  4. <el-radio :label="'large'">large</el-radio>
  5. <el-radio :label="'default'">default</el-radio>
  6. <el-radio :label="'small'">small</el-radio>
  7. </el-radio-group>
  8. <el-space wrap :size="size">
  9. <el-card v-for="i in 3" :key="i" class="box-card" style="width: 250px">
  10. <template #header>
  11. <div class="card-header">
  12. <span>Card name</span>
  13. <el-button class="button" text>Operation button</el-button>
  14. </div>
  15. </template>
  16. <div v-for="o in 4" :key="o" class="text item">
  17. {{ 'List item ' + o }}
  18. </div>
  19. </el-card>
  20. </el-space>
  21. </el-space>
  22. </template>
  23. <script lang="ts" setup>
  24. import { ref } from 'vue'
  25. const size = ref('default')
  26. </script>

自定义 Size

很多时候, 内建的大小不满足设计师的要求, 我们可以通过传入自己定义的大小 (数字类型) 来设置

Space 间距 - 图4

  1. <template>
  2. <el-slider v-model="size" />
  3. <el-space wrap :size="size">
  4. <el-card v-for="i in 2" :key="i" class="box-card" style="width: 250px">
  5. <template #header>
  6. <div class="card-header">
  7. <span>Card name</span>
  8. <el-button class="button" text>Operation button</el-button>
  9. </div>
  10. </template>
  11. <div v-for="o in 4" :key="o" class="text item">
  12. {{ 'List item ' + o }}
  13. </div>
  14. </el-card>
  15. </el-space>
  16. </template>
  17. <script lang="ts" setup>
  18. import { ref } from 'vue'
  19. const size = ref(20)
  20. </script>

TIP

不要让 ElSpace 与使用依赖父元素百分比宽度 (高度) 的元素一起使用, 例如 ElSlider, 这样会造成光标不同步

自动换行

水平 (horizontal) ** 模式下, 通过控制 wrap(布尔类型)**来控制是否自动换行

利用 wrap 属性控制换行

Space 间距 - 图5

  1. <template>
  2. <el-space wrap>
  3. <div v-for="i in 20" :key="i">
  4. <el-button text> Text button </el-button>
  5. </div>
  6. </el-space>
  7. </template>

行间分隔符

有时候,仅仅在行间加空白并不能满足我们的日常需求,此时分隔符 (spacer) 就可以发挥非常好的作用了。

字母数字类型分隔符

Space 间距 - 图6

  1. <template>
  2. <el-space :size="size" spacer="|">
  3. <div v-for="i in 2" :key="i">
  4. <el-button> button {{ i }} </el-button>
  5. </div>
  6. </el-space>
  7. </template>
  8. <script lang="ts" setup>
  9. import { ref } from 'vue'
  10. const size = ref(10)
  11. </script>

分隔符还可以是 VNode 类型

Space 间距 - 图7

  1. <template>
  2. <el-space :size="size" :spacer="spacer">
  3. <div v-for="i in 2" :key="i">
  4. <el-button> button {{ i }} </el-button>
  5. </div>
  6. </el-space>
  7. </template>
  8. <script lang="ts" setup>
  9. import { h, ref } from 'vue'
  10. import { ElDivider } from 'element-plus'
  11. const size = ref(10)
  12. const spacer = h(ElDivider, { direction: 'vertical' })
  13. </script>

对齐方式

设置该值可以调整所有子节点在容器内的对齐方式,可设置的值与 align-items Space 间距 - 图8 一致。

使用 alignment 属性来对齐

Space 间距 - 图9

  1. <template>
  2. <div class="alignment-container">
  3. <el-space>
  4. string
  5. <el-button> button </el-button>
  6. <el-card>
  7. <template #header> header </template>
  8. body
  9. </el-card>
  10. </el-space>
  11. </div>
  12. <div class="alignment-container">
  13. <el-space alignment="flex-start">
  14. string
  15. <el-button> button </el-button>
  16. <el-card>
  17. <template #header> header </template>
  18. body
  19. </el-card>
  20. </el-space>
  21. </div>
  22. <div class="alignment-container">
  23. <el-space alignment="flex-end">
  24. string
  25. <el-button> button </el-button>
  26. <el-card>
  27. <template #header> header </template>
  28. body
  29. </el-card>
  30. </el-space>
  31. </div>
  32. </template>
  33. <style>
  34. .alignment-container {
  35. width: 240px;
  36. margin-bottom: 20px;
  37. padding: 8px;
  38. border: 1px solid var(--el-border-color);
  39. }
  40. </style>

填充容器

通过 fill (Boolean Type) 参数,您可以控制子节点是否自动填充容器。

下面的例子中,当设置为 fill 时,子节点的宽度会自动适配容器的宽度。

用 fill 属性让子节点自动填充容器

Space 间距 - 图10

  1. <template>
  2. <div>
  3. <div style="margin-bottom: 15px">fill: <el-switch v-model="fill" /></div>
  4. <el-space :fill="fill" wrap>
  5. <el-card v-for="i in 3" :key="i" class="box-card">
  6. <template #header>
  7. <div class="card-header">
  8. <span>Card name</span>
  9. <el-button class="button" text>Operation button</el-button>
  10. </div>
  11. </template>
  12. <div v-for="o in 4" :key="o" class="text item">
  13. {{ 'List item ' + o }}
  14. </div>
  15. </el-card>
  16. </el-space>
  17. </div>
  18. </template>
  19. <script lang="ts" setup>
  20. import { ref } from 'vue'
  21. const fill = ref(true)
  22. </script>

也可以使用 fillRatio 参数,自定义填充的比例, 默认值为 100,代表基于父容器宽度的 100% 进行填充

需要注意的是,水平布局和垂直布局的表现形式稍有不同,具体的效果可以查看下面的例子

用 fillRatio 自定义填充比例

Space 间距 - 图11

  1. <template>
  2. <div>
  3. <div style="margin-bottom: 15px">
  4. direction:
  5. <el-radio v-model="direction" label="horizontal">horizontal</el-radio>
  6. <el-radio v-model="direction" label="vertical">vertical</el-radio>
  7. </div>
  8. <div style="margin-bottom: 15px">
  9. fillRatio:<el-slider v-model="fillRatio" />
  10. </div>
  11. <el-space
  12. fill
  13. wrap
  14. :fill-ratio="fillRatio"
  15. :direction="direction"
  16. style="width: 100%"
  17. >
  18. <el-card v-for="i in 5" :key="i" class="box-card">
  19. <template #header>
  20. <div class="card-header">
  21. <span>Card name</span>
  22. <el-button class="button" text>Operation button</el-button>
  23. </div>
  24. </template>
  25. <div v-for="o in 4" :key="o" class="text item">
  26. {{ 'List item ' + o }}
  27. </div>
  28. </el-card>
  29. </el-space>
  30. </div>
  31. </template>
  32. <script lang="ts" setup>
  33. import { ref } from 'vue'
  34. const direction = ref('horizontal')
  35. const fillRatio = ref(30)
  36. </script>

Space 属性

属性说明类型可选值默认值
alignment对齐的方式stringalign-items Space 间距 - 图12‘center’
class类名string / Array<Record<string, boolean> \String> / Record<string, boolean>-
direction排列的方向stringvertical/horizontalhorizontal
prefix-cls给 space-items 的类名前缀stringel-space-
style额外样式string / Array<Object | String> / Object--
spacer间隔符string / number / VNode--
size间隔大小string / number / [number, number]-‘small’
wrap设置是否自动折行booleantrue / falsefalse
fill子元素是否填充父容器booleantrue / falsefalse
fill-ratio填充父容器的比例number-100

Space 插槽

名称说明
default需要添加间隔的元素

源代码

组件 Space 间距 - 图13 文档 Space 间距 - 图14

贡献者

Space 间距 - 图15 三咲智子

Space 间距 - 图16 jeremywu

Space 间距 - 图17 云游君

Space 间距 - 图18 Hefty

Space 间距 - 图19 zz

Space 间距 - 图20 kooriookami

Space 间距 - 图21 MonsterPi

Space 间距 - 图22 Delyan Haralanov

Space 间距 - 图23 bqy

Space 间距 - 图24 啝裳

Space 间距 - 图25 C.Y.Kun

Space 间距 - 图26 0song