
相对布局 (RelativeContainer)
RelativeContainer 是 ArkUI 中一种基于相对定位规则 的布局容器,允许子组件通过与其他组件或容器边缘的相对关系来确定自身位置。每个子组件需通过 id 标识,并通过 alignRules 属性声明其相对于其他元素的对齐规则(如"位于 A 的右侧"、"底部对齐 B"等)。
尽管功能强大,但 RelativeContainer 在实际项目中使用频率较低,主要原因包括:
- 学习成本高:需理解复杂的对齐规则链;
- 维护难度大:组件间耦合紧密,修改一处可能影响多处布局;
- 响应式支持弱:难以适配多尺寸屏幕;
- 性能开销:布局计算复杂度高于线性或弹性布局。
因此,除非有特殊需求(如自定义复杂仪表盘、拖拽编辑器、游戏 UI 等),一般推荐优先使用 Column、Row、Flex 或 Stack。
📚 深入学习 :
若您对高级布局感兴趣,可查阅官方文档:相对布局
栅格布局 (GridRow / GridCol)
栅格布局是构建响应式、跨设备适配界面 的核心方案。ArkTS 通过 GridRow(行容器)与 GridCol(列单元)组合,实现类似 Bootstrap 的 12 栅格系统,支持断点控制、列数自适应、间距调节、元素排序等能力,特别适用于卡片列表、仪表盘、表单布局等场景。
栅格容器 GridRow
GridRow 定义了一行栅格的上下文,其内部只能包含 GridCol 子组件。它通过断点(Breakpoint)机制,根据设备屏幕宽度自动切换布局策略。
以下示例来自官方文档,展示了自定义断点配置下的响应式行为:
ts
GridRow({
breakpoints: {
sm: 4, // 小屏:4列
md: 8, // 中屏:8列
lg: 12 // 大屏:12列
}
}) {
// GridCol 子项
}
💡 预览说明:由于模拟器设备有限,以下截图均基于 DevEco Studio 自带预览器,展示不同断点下的布局效果。

sm(小型设备,4列)
当屏幕宽度落入 sm 断点范围(通常 < 520vp),栅格被划分为 4 列 ,每个 GridCol 默认占满整行(若未指定 span)。

md(中型设备,8列)
在中等屏幕(如平板横屏,520vp ~ 840vp),栅格扩展为 8 列,可容纳更多并排内容,提升信息密度。

布局的总列数(columns)
GridRow 的 columns 属性决定了每个断点下栅格系统的总列数,其默认值随 API 版本变化:
-
API version < 20 :
columns = 12(全局统一 12 列,不区分设备); -
API version ≥ 20 :
columns = { xs: 2, sm: 4, md: 8, lg: 12, xl: 12, xxl: 12 }(响应式默认值)。
🔍 当前环境 :
您使用的是 API version 17 ,因此默认为 12 列,且不随设备变化。
这意味着即使在小屏设备上,栅格仍按 12 列划分,若 GridCol 未指定 span,则默认 span=12,表现为单列全宽布局。

可以看到,所有子项一行排布(因 span=12 占满整行):

属性详解
columns:number(固定列数)
直接指定所有断点下的总列数为固定值。
ts
GridRow({ columns: 2 }) { /* ... */ } // 全局 2 列
2列效果:

3列效果:

✅ 适用场景:简单两栏/三栏布局,无需响应式。
columns:GridRowColumnOption(响应式列数)
通过对象形式为不同断点设置独立列数,实现真正的响应式设计。
ts
GridRow({
columns: {
sm: 4,
md: 8,
lg: 12
}
}) { /* ... */ }
此配置下,小屏 4 列、中屏 8 列、大屏 12 列,内容密度随屏幕增大而提升。

direction: GridRowDirection.Row(默认)
子项从左到右排列,符合常规阅读习惯。
ts
GridRow({ direction: GridRowDirection.Row }) { /* ... */ }

direction: GridRowDirection.RowReverse
子项从右到左排列,适用于 RTL 语言或特殊视觉动效。
ts
GridRow({ direction: GridRowDirection.RowReverse }) { /* ... */ }
⚠️ 注意:仅改变布局顺序,不影响文本方向。

gutter:number(统一间距)
设置所有 GridCol 之间的水平与垂直间距(单位:vp)。
ts
GridRow({ gutter: 10 }) { /* ... */ } // 间距 10vp

gutter: GutterOption(分向间距)
通过对象分别设置水平(x)和垂直(y)间距。
ts
GridRow({
gutter: { x: 8, y: 16 } // 水平 8vp,垂直 16vp
}) { /* ... */ }
🎯 设计价值:实现卡片式布局的经典"内边距+外间距"效果。

子组件 GridCol
GridCol 必须作为 GridRow 的直接子组件,用于定义单个栅格单元的行为。它通过三大核心属性控制布局:
span(占用列数)
决定该单元占据多少栅格列。
span: number(固定值)
ts
GridCol({ span: 6 }) { Text('占6列') }
在 12 列系统中,span=6 表示占据一半宽度。

span: GridColColumnOption(响应式)
为不同断点设置不同 span,实现内容自适应。
ts
GridCol({
span: {
sm: 4, // 小屏占满(4/4)
md: 4, // 中屏占一半(4/8)
lg: 3 // 大屏占 1/4(3/12)
}
}) { /* ... */ }


✅ 最佳实践:
- 小屏
span=断点列数→ 单列;- 大屏
span=较小值→ 多列并排。
offset(偏移列数)
在 span 之前跳过指定列数,实现留白或居中效果。
offset: number
ts
GridCol({ span: 6, offset: 3 }) // 从第4列开始(跳过3列)

offset: GridColColumnOption(响应式偏移)
ts
GridCol({
span: { sm: 4, md: 6 },
offset: { sm: 0, md: 1 }
})
小屏无偏移,中屏向右偏移 1 列。

order(显示顺序)
控制 GridCol 在视觉上的渲染顺序,不改变 DOM 结构,可用于 SEO 或无障碍优化。
order: number
ts
GridCol({ order: 2 }) // 第二个显示
GridCol({ order: 1 }) // 第一个显示

order: GridColColumnOption(响应式排序)
ts
GridCol({
order: {
sm: 2, // 小屏第二
md: 1 // 中屏第一
}
})
实现"小屏主次颠倒,大屏正常顺序"的交互策略。


总结与工程建议
| 能力 | 说明 | 推荐场景 |
|---|---|---|
| 响应式列数 | columns: { sm:4, md:8 } |
跨设备适配 |
| 动态 span/offset | 按屏幕调整宽度与位置 | 卡片网格、仪表盘 |
| order 控制 | 视觉顺序与源码解耦 | 内容优先级调整 |
| gutter 间距 | 统一管理内外边距 | 设计系统一致性 |
最佳实践:
- 优先使用响应式配置 (
GridColColumnOption),而非固定值; - 总 span 不要超过 columns,否则会换行或溢出;
- 结合
@Watch监听屏幕尺寸,动态调整复杂布局; - 避免过度嵌套 :
GridRow内不应再嵌套GridRow,可改用Flex; - 性能考量 :大量
GridCol时,确保span/offset计算高效。
通过合理运用 GridRow 与 GridCol,开发者可轻松构建出专业级响应式界面,真正实现"一次开发,多端部署"的鸿蒙愿景。