• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 层叠布局
2
3
4## 概述
5
6层叠布局(StackLayout)用于在屏幕上预留一块区域来显示组件中的元素,提供元素可以重叠的布局。层叠布局通过[Stack](https://docs.openharmony.cn/pages/v3.2Beta/zh-cn/application-dev/reference/arkui-ts/ts-container-stack.md/)容器组件实现位置的固定定位与层叠,容器中的子元素(子组件)依次入栈,后一个子元素覆盖前一个子元素,子元素可以叠加,也可以设置位置。
7
8层叠布局具有较强的页面层叠、位置定位能力,其使用场景有广告、卡片层叠效果等。
9
10如图1,Stack作为容器,容器内的子元素(子组件)的顺序为Item1->Item2->Item3。
11
12
13  **图1** 层叠布局  
14
15![stack-layout](figures/stack-layout.png)
16
17
18## 开发布局
19
20Stack组件为容器组件,容器内可包含各种子组件。其中的子组件根据自己的大小默认进行居中堆叠。子元素被约束在Stack下,进行自己的样式定义以及排列。
21
22
23
24```ts
25Column(){
26  Stack({ }) {
27    Column(){}.width('90%').height('100%').backgroundColor('#ff58b87c')
28    Text('text').width('60%').height('60%').backgroundColor('#ffc3f6aa')
29    Button('button').width('30%').height('30%').backgroundColor('#ff8ff3eb').fontColor('#000')
30  }.width('100%').height(150).margin({ top: 50 })
31}
32```
33
34
35![stack-layout-sample](figures/stack-layout-sample.png)
36
37
38## 对齐方式
39
40Stack组件通过[alignContent参数](../reference/arkui-ts/ts-appendix-enums.md#alignment)实现位置的相对移动。如图2所示,支持九种对齐方式。
41
42  **图2** Stack容器内元素的对齐方式  
43
44![zh-cn_image_0000001562940621](figures/zh-cn_image_0000001562940621.png)
45
46
47## Z序控制
48
49Stack容器中兄弟组件显示层级关系可以通过[Z序控制](../reference/arkui-ts/ts-universal-attributes-z-order.md)的zIndex属性改变。zIndex值越大,显示层级越高,即zIndex值大的组件会覆盖在zIndex值小的组件上方。
50
51  在层叠布局中,如果后面子元素尺寸大于前面子元素尺寸,则前面子元素完全隐藏。
52
53```ts
54Stack({ alignContent: Alignment.BottomStart }) {
55  Column() {
56    Text('Stack子元素1').textAlign(TextAlign.End).fontSize(20)
57  }.width(100).height(100).backgroundColor(0xffd306)
58
59  Column() {
60    Text('Stack子元素2').fontSize(20)
61  }.width(150).height(150).backgroundColor(Color.Pink)
62
63  Column() {
64    Text('Stack子元素3').fontSize(20)
65  }.width(200).height(200).backgroundColor(Color.Grey)
66}.margin({ top: 100 }).width(350).height(350).backgroundColor(0xe0e0e0)
67```
68
69![zh-cn_image_0000001511900544](figures/zh-cn_image_0000001511900544.png)
70
71下图中,最后的子元素3的尺寸大于前面的所有子元素,所以,前面两个元素完全隐藏。改变子元素1,子元素2的zIndex属性后,可以将元素展示出来。
72
73
74```ts
75Stack({ alignContent: Alignment.BottomStart }) {
76  Column() {
77    Text('Stack子元素1').fontSize(20)
78  }.width(100).height(100).backgroundColor(0xffd306).zIndex(2)
79
80  Column() {
81    Text('Stack子元素2').fontSize(20)
82  }.width(150).height(150).backgroundColor(Color.Pink).zIndex(1)
83
84  Column() {
85    Text('Stack子元素3').fontSize(20)
86  }.width(200).height(200).backgroundColor(Color.Grey)
87}.margin({ top: 100 }).width(350).height(350).backgroundColor(0xe0e0e0)
88```
89
90![zh-cn_image_0000001563060797](figures/zh-cn_image_0000001563060797.png)
91
92
93## 场景示例
94
95使用层叠布局快速搭建页面显示模型。
96
97
98```ts
99@Entry
100@Component
101struct StackSample {
102  private arr: string[] = ['APP1', 'APP2', 'APP3', 'APP4', 'APP5', 'APP6', 'APP7', 'APP8'];
103
104  build() {
105    Stack({ alignContent: Alignment.Bottom }) {
106      Flex({ wrap: FlexWrap.Wrap }) {
107        ForEach(this.arr, (item) => {
108          Text(item)
109            .width(100)
110            .height(100)
111            .fontSize(16)
112            .margin(10)
113            .textAlign(TextAlign.Center)
114            .borderRadius(10)
115            .backgroundColor(0xFFFFFF)
116        }, item => item)
117      }.width('100%').height('100%')
118
119      Flex({ justifyContent: FlexAlign.SpaceAround, alignItems: ItemAlign.Center }) {
120        Text('联系人').fontSize(16)
121        Text('设置').fontSize(16)
122        Text('短信').fontSize(16)
123      }
124      .width('50%')
125      .height(50)
126      .backgroundColor('#16302e2e')
127      .margin({ bottom: 15 })
128      .borderRadius(15)
129    }.width('100%').height('100%').backgroundColor('#CFD0CF')
130  }
131}
132```
133
134
135![zh-cn_image_0000001511421368](figures/zh-cn_image_0000001511421368.png)
136