相对布局 (RelativeContainer)
是 ArkUI 中一种基于的布局容器,允许子组件通过与其他组件或容器边缘的相对关系来确定自身位置。每个子组件需通过 标识,并通过 属性声明其相对于其他元素的对齐规则(如'位于 A 的右侧'、'底部对齐 B'等)。
本文讲解 HarmonyOS ArkUI 中的相对布局与栅格布局。相对布局(RelativeContainer)基于相对定位,但耦合度高,推荐优先使用 Column/Row/Flex。栅格布局(GridRow/GridCol)支持响应式断点、列数自适应及间距调节。详细介绍了 columns、gutter、span、offset、order 等核心属性,涵盖固定值与响应式配置方案,适用于卡片列表、仪表盘等多端适配场景。

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

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

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

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

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

直接指定所有断点下的总列数为固定值。
GridRow({ columns:2}){/* ... */}// 全局 2 列


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

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

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

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

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

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

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


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

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

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

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


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

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online