在这里插入图片描述
在这里插入图片描述

一、概念说明

ColumnSpaceEvenly 是指将 Column 容器的 justifyContent 属性设置为 FlexAlign.SpaceEvenly,使子组件在主轴(垂直方向)上均匀等距分布:所有间距——包括首尾子组件与容器边缘的间距、子组件之间的间距——完全相等,是三种 Space* 分布中最「均匀」、数学上最对称的一种。

┌─────────────────────┐
│                     │  ← 等间距
│     ①  子组件A      │
│                     │  ← 等间距(与上间距相同)
│     ②  子组件B      │
│                     │  ← 等间距(与上间距相同)
│     ③  子组件C      │
│                     │  ← 等间距(与上间距相同)
└─────────────────────┘

SpaceEvenly 的核心特点是**“绝对均匀”**——所有间距完全相等,没有例外。视觉效果上子组件在容器中均匀散布,适用于需要严格对称的布局场景。


二、核心属性对照

属性 作用轴 取值 效果
justifyContent 主轴(垂直方向) FlexAlign.SpaceEvenly 子组件均匀等距分布:所有间距完全相等
alignItems 交叉轴(水平方向) ItemAlign.Start 子组件在水平方向左端对齐

关键认知:SpaceEvenly 是三种 Space* 分布中唯一让所有间距(含首尾)完全相等的模式。SpaceBetween 首尾无间距,SpaceAround 首尾半倍间距,SpaceEvenly 所有间距相等。


三、三种 Space* 分布的详细对比

SpaceBetween                    SpaceAround                     SpaceEvenly
(首尾无间距)                   (首尾半倍间距)                  (所有间距相等)
┌──────────────────┐           ┌──────────────────┐           ┌──────────────────┐
│ ①  子组件A       │           │                  │           │                  │
│                   │           │   ①  子组件A      │           │   ①  子组件A      │
│ ②  子组件B       │           │                  │           │                  │
│                   │           │   ②  子组件B      │           │   ②  子组件B      │
│ ③  子组件C       │           │                  │           │                  │
│                   │           │   ③  子组件C      │           │   ③  子组件C      │
└──────────────────┘           │                  │           │                  │
                               └──────────────────┘           └──────────────────┘

间距数学表达(假设容器高度 H,子组件总高度 C,N 个子组件):
  间距 = (H - C) / (N - 1)         间距 = (H - C) / (N * 2)         间距 = (H - C) / (N + 1)
  首尾间距 = 0                     首尾间距 = 间距 / 2              首尾间距 = 间距

四、代码结构(.ets 文件)

ColumnSpaceEvenlyDemo.ets
├── import 语句
├── @Entry @Component struct ColumnSpaceEvenlyDemo
│   ├── @State 状态变量
│   └── build()
│       ├── Scroll 全屏滚动容器
│       │   └── Column({ space: 24 })
│       │       ├── [区域1] TitleSection ── 标题 + 布局要点说明
│       │       ├── [区域2.1] 基础示例 ── 三段 SpaceEvenly 等距展示
│       │       ├── [区域2.2] 五种对比 ── Start/Center/End/SpaceBetween/SpaceAround
│       │       ├── [区域2.3] 三种 Space 对比 ── Between/ Around/ Evenly 并排对比
│       │       ├── [区域2.4] 底部导航菜单 ── 菜单项均匀等距分布
│       │       ├── [区域2.5] 选择题选项 ── 选项均匀排列
│       │       ├── [区域2.6] 星级评分 ── 五颗星均匀等距
│       │       └── [区域2.7] 参数总结 ── 属性对比表格
│       └── 底部留白
├── [子组件] TitleSection
├── [子组件] SectionTitle
├── [子组件] AlignCompareCard
└── [子组件] SpaceCompareCard

五、核心代码片段

5.1 基础 ColumnSpaceEvenly

Column() {
  // 子组件 1:顶部区块(距容器上边缘 = 间距)
  Row() {
    Circle().width(10).height(10).fill('#3b82f6')
    Text('  顶部 —— 距容器上边缘 = 间距').fontSize(15)
  }.padding(10).width('100%')

  // 子组件 2:中间区块(间距相等)
  Row() {
    Circle().width(10).height(10).fill('#8b5cf6')
    Text('  中间 —— 间距相等').fontSize(15)
  }.padding(10).width('100%')

  // 子组件 3:底部区块(距容器下边缘 = 间距)
  Row() {
    Circle().width(10).height(10).fill('#06b6d4')
    Text('  底部 —— 距容器下边缘 = 间距').fontSize(15)
  }.padding(10).width('100%')
}
// ★★★ 核心属性:主轴 SpaceEvenly(均匀等距)★★★
.justifyContent(FlexAlign.SpaceEvenly)
.alignItems(ItemAlign.Start)
.width('100%').height(300).padding(16)
.backgroundColor('#f8fafc')
.border({ width: 1, color: '#e2e8f0' }).borderRadius(12)

5.2 底部导航菜单场景

Column() {
  ForEach(this.menuList, (item: string, index: number) => {
    Column({ space: 4 }) {
      Text(index === 0 ? '🏠' : index === 1 ? '🔍' :
           index === 2 ? '💬' : '👤')
        .fontSize(28).textAlign(TextAlign.Center).width('100%')

      Text(item)
        .fontSize(12)
        .fontColor(index === 0 ? '#3b82f6' : '#94a3b8')
        .textAlign(TextAlign.Center).width('100%')
    }
    .width('100%').alignItems(ItemAlign.Center).padding(8)
    .backgroundColor(index === 0 ? '#eff6ff' : 'transparent')
    .borderRadius(8)
  })
}
// ★★★ 核心:SpaceEvenly — 菜单项均匀等距分布 ★★★
.justifyContent(FlexAlign.SpaceEvenly)
.alignItems(ItemAlign.Start)
.width('100%').height(280).padding(16)
.backgroundColor('#ffffff').borderRadius(12)

5.3 三种 Space 分布并排对比

Row({ space: 8 }) {
  // 左:SpaceBetween
  SpaceCompareCard({
    title: 'SpaceBetween', alignValue: FlexAlign.SpaceBetween,
    desc: '首尾无间距', bgColor: '#fef3c7', borderColor: '#f59e0b',
    blockColors: ['#f59e0b', '#fbbf24', '#fcd34d']
  })

  // 中:SpaceAround
  SpaceCompareCard({
    title: 'SpaceAround', alignValue: FlexAlign.SpaceAround,
    desc: '首尾半倍间距', bgColor: '#d1fae5', borderColor: '#10b981',
    blockColors: ['#10b981', '#34d399', '#6ee7b7']
  })

  // 右:SpaceEvenly
  SpaceCompareCard({
    title: 'SpaceEvenly', alignValue: FlexAlign.SpaceEvenly,
    desc: '所有间距完全相等', bgColor: '#fae8ff', borderColor: '#c026d3',
    blockColors: ['#c026d3', '#d946ef', '#e879f9']
  })
}
.width('100%').alignItems(VerticalAlign.Top)

5.4 星级评分场景

Column() {
  // 五颗星使用 SpaceEvenly 均匀等距排列
  Column() {
    Text('⭐').fontSize(32).textAlign(TextAlign.Center).width('100%')
    Text('⭐').fontSize(32).textAlign(TextAlign.Center).width('100%')
    Text('⭐').fontSize(36).textAlign(TextAlign.Center).width('100%')
    Text('☆').fontSize(32).textAlign(TextAlign.Center).width('100%').fontColor('#cbd5e1')
    Text('☆').fontSize(32).textAlign(TextAlign.Center).width('100%').fontColor('#cbd5e1')
  }
  // ★★★ 核心:SpaceEvenly — 星星均匀等距 ★★★
  .justifyContent(FlexAlign.SpaceEvenly)
  .alignItems(ItemAlign.Center)
  .width('100%').height(260).padding(12)
  .backgroundColor('#fffbeb')
  .border({ width: 1, color: '#fde68a' }).borderRadius(12)

  Text('3 / 5 星')
    .fontSize(14).fontColor('#f59e0b')
    .textAlign(TextAlign.Center).width('100%')
}
.width('100%').padding(16)
.backgroundColor('#ffffff').borderRadius(12)

六、子组件详解

6.1 TitleSection(标题区域)

显示页面大标题、副标题(属性说明)和一个灰底文本框,详细列出三种 Space 分布的核心区别对比表。

6.2 SectionTitle(段落小标题)

轻量级可复用组件,接收 @Prop label 属性,fontSize: 16 中等粗细文字。

6.3 AlignCompareCard(对比卡片)

用于五种 FlexAlign 对比展示——内部包含三个彩色方块,通过 justifyContent(this.alignValue) 动态设置主轴排列方式。

6.4 SpaceCompareCard(三种 Space 对比卡片)

专门用于 SpaceBetween / SpaceAround / SpaceEvenly 三栏对比的子组件:

@Component
struct SpaceCompareCard {
  @Prop title: string = '';
  @Prop alignValue: FlexAlign = FlexAlign.SpaceBetween;
  @Prop desc: string = '';
  @Prop bgColor: string = '#fef3c7';
  @Prop borderColor: string = '#f59e0b';
  @Prop blockColors: string[] = ['#f59e0b', '#fbbf24', '#fcd34d'];
  • 内部包含三个彩色方块(带序号①②③)
  • 通过 justifyContent(this.alignValue) 动态设置主轴排列方式
  • 支持自定义颜色数组,每种分布使用不同色系便于区分

七、适用场景

场景 说明
底部导航菜单 多个菜单项在容器中均匀等距分布,视觉对称
选择题选项 A/B/C/D 选项均匀排列,间距完全一致
星级评分 多颗星在垂直方向上均匀等距排列
仪表盘数据点 多个数据点在垂直轴上均匀分布
导航项等间距 导航链接项均匀散布在容器中
进度步骤指示器 多个步骤点均匀等距排列

八、注意事项

  1. 必须显式设置容器高度,否则 SpaceEvenly 无法分配剩余空间,效果等同于 FlexAlign.Start

  2. 三种 Space 分布的间距计算方式*:

    属性 首尾间距 中间间距 间距公式(H:容器高, C:子组件总高, N:子组件数)
    SpaceBetween 0 (H-C)/(N-1) 首尾贴边,中间均分
    SpaceAround (H-C)/(N*2) (H-C)/N 首尾半倍间距
    SpaceEvenly (H-C)/(N+1) (H-C)/(N+1) 所有间距完全相等
  3. SpaceEvenly 最适合需要绝对对称的场景,如底部导航栏、选择题选项、星级评分等。但在子组件数量较多(>=5)时,首尾间距可能会显得较大。

  4. Column({ space: X }) 的区别Column({ space: 10 }) 只在子组件之间添加固定间距,子组件从顶部开始排列,首尾无间距。而 SpaceEvenly 会动态计算间距让子组件均匀分布在整个容器中。


九、相关资源


文档生成日期:2026-06-23

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐