ArkUI Row / Column:主轴想不明白,布局一定乱

举报
蓝瘦的蜕变 发表于 2026/07/28 14:22:19 2026/07/28
【摘要】 Row 和 Column 是 ArkUI 布局里最常用的两个容器。它们不难,但很多页面乱,往往就是主轴和交叉轴没想清楚。 先分清主轴 Column 从上往下排,所以它的主轴是垂直方向。Row 从左往右排,所以它的主轴是水平方向。 justifyContent 管主轴方向怎么排,alignItems 管交叉轴方向怎么对齐

ArkUI Row / Column:主轴想不明白,布局一定乱

RowColumn 是 ArkUI 布局里最常用的两个容器。它们不难,但很多页面乱,往往就是主轴和交叉轴没想清楚。

先分清主轴

Column 从上往下排,所以它的主轴是垂直方向。Row 从左往右排,所以它的主轴是水平方向。

justifyContent 管主轴方向怎么排,alignItems 管交叉轴方向怎么对齐。这个关系记住以后,很多布局问题不用猜。

Row({ space: 10 }) {
  this.colorBlock('左', '#7C3AED')
  this.colorBlock('中', '#1D4ED8')
  this.colorBlock('右', '#0F766E')
}
.justifyContent(FlexAlign.SpaceEvenly)
.alignItems(VerticalAlign.Center)

剩余空间交给 layoutWeight

如果一行里有左右两块内容,别总想着写死宽度。layoutWeight 可以按比例分剩余空间。

Text('1')
  .layoutWeight(1)

Text('2')
  .layoutWeight(2)

这就是 1:2 的宽度分配。实际页面里,标题区域和操作区域经常会用到这种思路。

先别套太深

Row / Column 很好用,但不是越套越稳。能用一个 Row 表达“左边内容、右边操作”,就不要为了对齐再包三四层。布局优化后面会单独讲,这一篇先把基础手感练出来。

你平时最容易卡在横向对齐,还是纵向间距?把问题拆成主轴和交叉轴以后,通常会好判断很多。

参考文档: https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-build-layout

完整示例代码

文件位置:entry/src/main/ets/pages/arkUI/layout/ArkUIRowColumnDemo.ets

@Entry
@Component
struct ArkUIRowColumnDemo {
  @Builder
  sectionTitle(title: string, desc: string) {
    Column({ space: 4 }) {
      Text(title)
        .width('100%')
        .fontSize(16)
        .fontWeight(700)
        .fontColor('#0F172A')

      Text(desc)
        .width('100%')
        .fontSize(13)
        .fontColor('#64748B')
        .lineHeight(20)
    }
    .width('100%')
    .alignItems(HorizontalAlign.Start)
  }

  @Builder
  colorBlock(text: string, color: string) {
    Text(text)
      .width(62)
      .height(48)
      .fontSize(14)
      .fontWeight(700)
      .fontColor('#FFFFFF')
      .textAlign(TextAlign.Center)
      .backgroundColor(color)
      .borderRadius(8)
  }

  build() {
    Scroll() {
      Column({ space: 18 }) {
        Text('ArkUI Row / Column')
          .width('100%')
          .fontSize(24)
          .fontWeight(700)
          .fontColor('#0F172A')

        Text('主轴想不明白,布局一定乱')
          .width('100%')
          .fontSize(22)
          .fontWeight(700)
          .fontColor('#111827')

        Text('这一页只看 Row 和 Column。先把主轴、交叉轴、间距和剩余空间分配想清楚,后面写 Flex、Stack、RelativeContainer 才不会乱。')
          .width('100%')
          .fontSize(14)
          .fontColor('#64748B')
          .lineHeight(22)

        Column({ space: 12 }) {
          this.sectionTitle('Column 负责从上往下排', 'Column 的主轴是垂直方向。space 是主轴间距,alignItems 控制水平方向怎么对齐。')

          Column({ space: 10 }) {
            this.colorBlock('A', '#2563EB')
            this.colorBlock('B', '#0F766E')
            this.colorBlock('C', '#C2410C')
          }
          .width('100%')
          .height(210)
          .justifyContent(FlexAlign.Center)
          .alignItems(HorizontalAlign.Center)
          .backgroundColor('#FFFFFF')
          .border({ width: 1, color: '#DBEAFE' })
          .borderRadius(8)
        }
        .width('100%')
        .padding(16)
        .backgroundColor('#EFF6FF')
        .borderRadius(8)

        Column({ space: 12 }) {
          this.sectionTitle('Row 负责从左往右排', 'Row 的主轴是水平方向。justifyContent 控制横向分布,alignItems 控制垂直方向对齐。')

          Row({ space: 10 }) {
            this.colorBlock('左', '#7C3AED')
            this.colorBlock('中', '#1D4ED8')
            this.colorBlock('右', '#0F766E')
          }
          .width('100%')
          .height(110)
          .justifyContent(FlexAlign.SpaceEvenly)
          .alignItems(VerticalAlign.Center)
          .backgroundColor('#FFFFFF')
          .border({ width: 1, color: '#DDD6FE' })
          .borderRadius(8)
        }
        .width('100%')
        .padding(16)
        .backgroundColor('#F5F3FF')
        .borderRadius(8)

        Column({ space: 12 }) {
          this.sectionTitle('layoutWeight 负责分剩余空间', '两个子组件都设置 layoutWeight 后,Row 会按权重分配剩余宽度。这里是 1:2。')

          Row({ space: 10 }) {
            Text('1')
              .height(58)
              .fontSize(18)
              .fontWeight(700)
              .fontColor('#FFFFFF')
              .textAlign(TextAlign.Center)
              .backgroundColor('#C2410C')
              .borderRadius(8)
              .layoutWeight(1)

            Text('2')
              .height(58)
              .fontSize(18)
              .fontWeight(700)
              .fontColor('#FFFFFF')
              .textAlign(TextAlign.Center)
              .backgroundColor('#0F766E')
              .borderRadius(8)
              .layoutWeight(2)
          }
          .width('100%')
          .padding(10)
          .backgroundColor('#FFFFFF')
          .border({ width: 1, color: '#FED7AA' })
          .borderRadius(8)
        }
        .width('100%')
        .padding(16)
        .backgroundColor('#FFF7ED')
        .borderRadius(8)

        Column({ space: 12 }) {
          this.sectionTitle('先别什么都嵌套', 'Row 和 Column 很好用,但不是越套越稳。能用一个 Row 解决的,就别再包三层 Column。')

          Row({ space: 12 }) {
            Column({ space: 4 }) {
              Text('标题')
                .fontSize(15)
                .fontWeight(700)
                .fontColor('#0F172A')

              Text('副标题自然跟着标题纵向排列')
                .fontSize(12)
                .fontColor('#64748B')
            }
            .layoutWeight(1)
            .alignItems(HorizontalAlign.Start)

            Text('操作')
              .width(64)
              .height(34)
              .fontSize(13)
              .fontWeight(700)
              .fontColor('#2563EB')
              .textAlign(TextAlign.Center)
              .backgroundColor('#DBEAFE')
              .borderRadius(8)
          }
          .width('100%')
          .padding({ left: 14, right: 14, top: 14, bottom: 14 })
          .backgroundColor('#FFFFFF')
          .border({ width: 1, color: '#E2E8F0' })
          .borderRadius(8)
          .alignItems(VerticalAlign.Center)
        }
        .width('100%')
        .padding(16)
        .backgroundColor('#F8FAFC')
        .borderRadius(8)
      }
      .width('100%')
      .padding(20)
      .alignItems(HorizontalAlign.Start)
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#FFFFFF')
  }
}
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。