在HarmonyOS应用开发中,布局是构建用户界面的核心。Row和Column作为ArkUI框架中最基础、最常用的线性布局容器,掌握它们能帮你快速搭建出结构清晰、视觉统一的页面。本文将带你从零开始,深入剖析这两个组件的属性、用法及最佳实践,助你高效开发。
Column:垂直布局的核心
Column(Column)是鸿蒙ArkUI中用于在垂直方向上排列子组件的容器,其主轴为纵轴,交叉轴为水平轴。它类似于Android中的LinearLayout(orientation=vertical)或Web开发中的flex-direction: column。Column适合构建列表项、表单、卡片式布局等需要纵向堆叠的场景。通过灵活配置其属性,开发者可以精确控制子组件的位置、间距与对齐方式。
通用属性详解
Column容器自身支持多种通用属性,包括宽度(width)、高度(height)、边框(border)、内边距(padding)、外边距(margin)等。这些属性与Web开发中的CSS类似,但需注意单位选择。
宽度与高度:支持px、vp、百分比(%)及常量如100%(占满父容器)。例如:
Column() {
// 子组件
}
.width('100%') // 占满父容器宽度
提示:若未显式设置宽度,默认会根据子组件的最大宽度自适应。


高度:用法与宽度类似,常用于限制容器高度或配合滚动组件(Scroll)。
Column() { /* ... */ }
.height(200) // 固定高度 200vp

边框与间距设置
边框(border):通过border设置,参数类型为BorderOptions接口,包含粗细(width)、颜色(color)、圆角半径(radius)及样式(style)。
.border({
width: 2,
color: '#FF0000',
radius: 10
})
源码视角: 是一个接口,意味着你可以只传入需要的属性,其余使用默认值。




内边距(padding):设置容器内部边距,即子组件与容器边框之间的距离。
.padding(10) // 四周内边距均为 10vp
.padding({ left: 5, right: 15 }) // 精确控制各方向
关键区别: 是“内边距”, 是“外边距”。


外边距(margin):控制当前Column与其外部兄弟组件或父容器的距离。
.margin(20) // 外边距 20vp
⚠️ 注意: 不会影响子组件之间的间距,仅作用于当前容器整体。

间距与对齐
子组件间距(space):使用space属性统一设置所有子组件之间的垂直间距,比逐个设置margin更高效。
Column({ space: 10 }) { // 所有子组件之间间隔 10vp
Text('Item 1')
Text('Item 2')
Text('Item 3')
}
✅ 最佳实践:优先使用 而非为每个子项加 ,代码更简洁且语义明确。

交叉轴对齐(alignItems):控制子组件在水平方向上的对齐方式。可选值来自HorizontalAlign枚举:
- HorizontalAlign.Start:左对齐
- HorizontalAlign.Center:居中
- HorizontalAlign.End:右对齐



记忆技巧: → 垂直排列 → 控制左右对齐 → 使用 。


主轴对齐(justifyContent):控制子组件在垂直方向上的分布方式。可选值包括:
- FlexAlign.Start:顶部对齐(默认)
- FlexAlign.Center:垂直居中
- FlexAlign.End:底部对齐
- FlexAlign.SpaceBetween:首尾贴边,中间均匀分布
- FlexAlign.SpaceAround:每个元素上下间距相等,首尾留一半
- FlexAlign.SpaceEvenly:所有间距完全相等






应用场景:
- :常用于页脚按钮(“取消”在左,“确定”在右);
- :用于居中弹窗内容;
- :用于均匀分布导航图标。


单位选择:px vs vp
在HarmonyOS开发中,合理选择尺寸单位对适配多设备至关重要。与Java、Python、JavaScript等语言中处理屏幕适配的思路类似,鸿蒙提供了两种主要单位:
- px(像素):物理像素单位,不随屏幕密度缩放。适用于1px分割线、细边框等绝对精确场景。
- vp(虚拟像素):鸿蒙推荐的逻辑像素单位,系统根据设备DPI自动换算。1vp = 1px @ 160 DPI。适用于绝大多数UI元素,如字体、按钮、间距、容器尺寸等。
❌ 风险:在不同设备上视觉大小不一致,可能导致 UI 错位。
| 场景 | 推荐单位 |
|---|---|
| 文字大小、按钮、容器宽高、间距 | ✅ |
| 1px 分割线、极细边框 | ✅ |
| 设计稿标注(通常基于 vp) | ✅ 直接使用 vp |
注意事项:设计师提供的HarmonyOS设计稿通常以vp为单位;避免混用px和vp;使用px时,可通过px2vp()工具函数转换。在TypeScript或ArkTS中,这些单位转换逻辑可以封装成工具函数,类似Go语言中的类型转换模式。
↔️ Row:水平布局的精髓
Row(Row)是Column的“水平兄弟”,用于在水平方向上排列子组件。它同样基于Flex布局模型,默认从左到右排列。
核心区别: 主轴为垂直, 主轴为水平。因此,两者的对齐属性所作用的方向互换。
对比效果:Column垂直排列,Row水平排列。


代码复用提示:同一套子组件,仅需将 替换为 ,即可实现横向布局,极大提升开发效率。
Row的对齐属性
交叉轴对齐(alignItems):在Row中,主轴为水平,交叉轴变为垂直方向,因此使用VerticalAlign枚举:
- VerticalAlign.Top:顶部对齐
- VerticalAlign.Center:垂直居中
- VerticalAlign.Bottom:底部对齐



记忆技巧: → 水平排列 → 控制上下对齐 → 使用 。
主轴对齐(justifyContent):控制水平方向分布,取值与Column相同(FlexAlign枚举),但作用方向变为左右。
Start:左对齐(默认)Center:水平居中End:右对齐SpaceBetween/SpaceAround/SpaceEvenly:水平间距分布
✅ 无需重复学习:只要理解主轴方向, 的行为逻辑完全一致。

总结与建议
| 布局 | 主轴方向 | alignItems 方向 | justifyContent 方向 |
|---|---|---|---|
| 垂直 ↓ | 水平() | 垂直() | |
| 水平 → | 垂直() | 水平() |
️ 开发口诀:
- “Column 看左右,Row 看上下” —— 指 ;
- “主轴用 justifyContent,交叉轴用 alignItems”。
掌握Row与Column的异同,是构建鸿蒙应用UI的第一步。结合space、padding、margin和对齐属性,几乎可以实现所有常见的线性布局需求。
全套代码示例
以下是一个完整的示例,展示了Row和Column的常见用法:
@Entry
@Component
struct Index {
build() {
/*
Column({space:10}){
Text('你好,VON')
.width(100)
.height(100)
.border({width:1,color:'red',radius:50})
Text('你好,VON')
.width(100)
.height(100)
.border({width:1,color:'red',radius:50})
Text('你好,VON')
.width(100)
.height(100)
.border({width:1,color:'red',radius:50})
}
.width('100%')
.height('100%')
.border({width:1,color:'green',radius:50})
.alignItems(HorizontalAlign.End)
.justifyContent(FlexAlign.SpaceEvenly)
* */
Row({space:10}){
Text('你好,VON')
.width(100)
.height(100)
.border({width:1,color:'red',radius:50})
Text('你好,VON')
.width(100)
.height(100)
.border({width:1,color:'red',radius:50})
Text('你好,VON')
.width(100)
.height(100)
.border({width:1,color:'red',radius:50})
}
.width('100%')
.height('100%')
.border({width:1,color:'green',radius:50})
.alignItems(VerticalAlign.Center)
.justifyContent(FlexAlign.)
}
}
✨ 结语
本文从Column和Row的核心概念出发,详细讲解了它们的通用属性、对齐方式及单位选择。通过实际代码示例,你应该能够快速上手这两个基础布局组件。在后续开发中,合理搭配这些属性,就能构建出适配多设备的精美界面。持续实践,你的HarmonyOS开发技能将不断提升!
BorderOptionspaddingmarginmarginspacemarginColumnalignItemsHorizontalAlignSpaceBetweenCenterSpaceEvenlyvppxColumnRowColumnRowRowalignItemsVerticalAlignjustifyContentColumnHorizontalAlignFlexAlignRowVerticalAlignFlexAlignalignItems
浙公网安备 33010602011771号