• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 弹性布局
2
3
4## 概述
5
6弹性布局([Flex](../reference/arkui-ts/ts-container-flex.md))提供更加有效的方式对容器中的子元素进行排列、对齐和分配剩余空间。容器默认存在主轴与交叉轴,子元素默认沿主轴排列,子元素在主轴方向的尺寸称为主轴尺寸,在交叉轴方向的尺寸称为交叉轴尺寸。弹性布局在开发场景中用例特别多,比如页面头部导航栏的均匀分布、页面框架的搭建、多行数据的排列等等。
7
8
9  **图1** 主轴为水平方向的Flex容器示意图  
10
11![flex-layout](figures/flex-layout.png)
12
13
14## 基本概念
15
16- 主轴:Flex组件布局方向的轴线,子元素默认沿着主轴排列。主轴开始的位置称为主轴起始端,结束位置称为主轴终点端。
17
18- 交叉轴:垂直于主轴方向的轴线。交叉轴起始的位置称为交叉轴首部,结束位置称为交叉轴尾部。
19
20
21## 布局方向
22
23在弹性布局中,容器的子元素可以按照任意方向排列。通过设置参数direction,可以决定主轴的方向,从而控制子组件的排列方向。
24
25  **图2** 弹性布局方向图  
26
27![flex-layout-direction](figures/flex-layout-direction.png)
28
29- FlexDirection.Row(默认值):主轴为水平方向,子组件从起始端沿着水平方向开始排布。
30
31
32  ```ts
33  Flex({ direction: FlexDirection.Row }) {
34    Text('1').width('33%').height(50).backgroundColor(0xF5DEB3)
35    Text('2').width('33%').height(50).backgroundColor(0xD2B48C)
36    Text('3').width('33%').height(50).backgroundColor(0xF5DEB3)
37  }
38  .height(70)
39  .width('90%')
40  .padding(10)
41  .backgroundColor(0xAFEEEE)
42  ```
43
44  ![zh-cn_image_0000001562820817](figures/zh-cn_image_0000001562820817.png)
45
46- FlexDirection.RowReverse:主轴为水平方向,子组件从终点端沿着FlexDirection. Row相反的方向开始排布。
47
48
49  ```ts
50  Flex({ direction: FlexDirection.RowReverse }) {
51    Text('1').width('33%').height(50).backgroundColor(0xF5DEB3)
52    Text('2').width('33%').height(50).backgroundColor(0xD2B48C)
53    Text('3').width('33%').height(50).backgroundColor(0xF5DEB3)
54  }
55  .height(70)
56  .width('90%')
57  .padding(10)
58  .backgroundColor(0xAFEEEE)
59  ```
60
61  ![zh-cn_image_0000001511900464](figures/zh-cn_image_0000001511900464.png)
62
63- FlexDirection.Column:主轴为垂直方向,子组件从起始端沿着垂直方向开始排布。
64
65
66  ```ts
67  Flex({ direction: FlexDirection.Column }) {
68    Text('1').width('100%').height(50).backgroundColor(0xF5DEB3)
69    Text('2').width('100%').height(50).backgroundColor(0xD2B48C)
70    Text('3').width('100%').height(50).backgroundColor(0xF5DEB3)
71  }
72  .height(70)
73  .width('90%')
74  .padding(10)
75  .backgroundColor(0xAFEEEE)
76  ```
77
78  ![zh-cn_image_0000001511580884](figures/zh-cn_image_0000001511580884.png)
79
80- FlexDirection.ColumnReverse:主轴为垂直方向,子组件从终点端沿着FlexDirection. Column相反的方向开始排布。
81
82
83  ```ts
84  Flex({ direction: FlexDirection.ColumnReverse }) {
85    Text('1').width('100%').height(50).backgroundColor(0xF5DEB3)
86    Text('2').width('100%').height(50).backgroundColor(0xD2B48C)
87    Text('3').width('100%').height(50).backgroundColor(0xF5DEB3)
88  }
89  .height(70)
90  .width('90%')
91  .padding(10)
92  .backgroundColor(0xAFEEEE)
93  ```
94
95  ![zh-cn_image_0000001562940541](figures/zh-cn_image_0000001562940541.png)
96
97
98## 布局换行
99
100弹性布局分为单行布局和多行布局。默认情况下,Flex容器中的子元素都排在一条线(又称“轴线”)上。wrap属性控制当子元素主轴尺寸之和大于容器主轴尺寸时,Flex是单行布局还是多行布局。在多行布局时,通过交叉轴方向,确认新行堆叠方向。
101
102- FlexWrap. NoWrap(默认值):不换行。如果子组件的宽度总和大于父元素的宽度,则子组件会被压缩宽度。
103
104
105  ```ts
106  Flex({ wrap: FlexWrap.NoWrap }) {
107    Text('1').width('50%').height(50).backgroundColor(0xF5DEB3)
108    Text('2').width('50%').height(50).backgroundColor(0xD2B48C)
109    Text('3').width('50%').height(50).backgroundColor(0xF5DEB3)
110  }
111  .width('90%')
112  .padding(10)
113  .backgroundColor(0xAFEEEE)
114  ```
115
116  ![zh-cn_image_0000001562700425](figures/zh-cn_image_0000001562700425.png)
117
118- FlexWrap. Wrap:换行,每一行子组件按照主轴方向排列。
119
120
121  ```ts
122  Flex({ wrap: FlexWrap.Wrap }) {
123    Text('1').width('50%').height(50).backgroundColor(0xF5DEB3)
124    Text('2').width('50%').height(50).backgroundColor(0xD2B48C)
125    Text('3').width('50%').height(50).backgroundColor(0xD2B48C)
126  }
127  .width('90%')
128  .padding(10)
129  .backgroundColor(0xAFEEEE)
130  ```
131
132  ![zh-cn_image_0000001511740468](figures/zh-cn_image_0000001511740468.png)
133
134- FlexWrap. WrapReverse:换行,每一行子组件按照主轴反方向排列。
135
136
137  ```ts
138  Flex({ wrap: FlexWrap.WrapReverse}) {
139    Text('1').width('50%').height(50).backgroundColor(0xF5DEB3)
140    Text('2').width('50%').height(50).backgroundColor(0xD2B48C)
141    Text('3').width('50%').height(50).backgroundColor(0xF5DEB3)
142  }
143  .width('90%')
144  .padding(10)
145  .backgroundColor(0xAFEEEE)
146  ```
147
148  ![zh-cn_image_0000001562940521](figures/zh-cn_image_0000001562940521.png)
149
150
151## 主轴对齐方式
152
153通过justifyContent参数设置在主轴方向的对齐方式。
154
155![flex-spindle-alignment](figures/flex-spindle-alignment.png)
156
157
158- FlexAlign.Start(默认值):子组件在主轴方向起始端对齐, 第一个子组件与父元素边沿对齐,其他元素与前一个元素对齐。
159
160
161  ```ts
162  Flex({ justifyContent: FlexAlign.Start }) {
163    Text('1').width('20%').height(50).backgroundColor(0xF5DEB3)
164    Text('2').width('20%').height(50).backgroundColor(0xD2B48C)
165    Text('3').width('20%').height(50).backgroundColor(0xF5DEB3)
166  }
167  .width('90%')
168  .padding({ top: 10, bottom: 10 })
169  .backgroundColor(0xAFEEEE)
170  ```
171
172  ![zh-cn_image_0000001511421280](figures/zh-cn_image_0000001511421280.png)
173
174- FlexAlign.Center:子组件在主轴方向居中对齐。
175
176
177  ```ts
178  Flex({ justifyContent: FlexAlign.Center }) {
179    Text('1').width('20%').height(50).backgroundColor(0xF5DEB3)
180    Text('2').width('20%').height(50).backgroundColor(0xD2B48C)
181    Text('3').width('20%').height(50).backgroundColor(0xF5DEB3)
182  }
183  .width('90%')
184  .padding({ top: 10, bottom: 10 })
185  .backgroundColor(0xAFEEEE)
186  ```
187
188  ![zh-cn_image_0000001563060681](figures/zh-cn_image_0000001563060681.png)
189
190- FlexAlign.End:子组件在主轴方向终点端对齐, 最后一个子组件与父元素边沿对齐,其他元素与后一个元素对齐。
191
192
193  ```ts
194  Flex({ justifyContent: FlexAlign.End }) {
195    Text('1').width('20%').height(50).backgroundColor(0xF5DEB3)
196    Text('2').width('20%').height(50).backgroundColor(0xD2B48C)
197    Text('3').width('20%').height(50).backgroundColor(0xF5DEB3)
198  }
199  .width('90%')
200  .padding({ top: 10, bottom: 10 })
201  .backgroundColor(0xAFEEEE)
202  ```
203
204  ![zh-cn_image_0000001562820809](figures/zh-cn_image_0000001562820809.png)
205
206- FlexAlign.SpaceBetween:Flex主轴方向均匀分配弹性元素,相邻子组件之间距离相同。第一个子组件和最后一个子组件与父元素边沿对齐。
207
208
209  ```ts
210  Flex({ justifyContent: FlexAlign.SpaceBetween }) {
211    Text('1').width('20%').height(50).backgroundColor(0xF5DEB3)
212    Text('2').width('20%').height(50).backgroundColor(0xD2B48C)
213    Text('3').width('20%').height(50).backgroundColor(0xF5DEB3)
214  }
215  .width('90%')
216  .padding({ top: 10, bottom: 10 })
217  .backgroundColor(0xAFEEEE)
218  ```
219
220  ![zh-cn_image_0000001511421288](figures/zh-cn_image_0000001511421288.png)
221
222- FlexAlign.SpaceAround:Flex主轴方向均匀分配弹性元素,相邻子组件之间距离相同。第一个子组件到主轴起始端的距离和最后一个子组件到主轴终点端的距离是相邻元素之间距离的一半。
223
224
225  ```ts
226  Flex({ justifyContent: FlexAlign.SpaceAround }) {
227    Text('1').width('20%').height(50).backgroundColor(0xF5DEB3)
228    Text('2').width('20%').height(50).backgroundColor(0xD2B48C)
229    Text('3').width('20%').height(50).backgroundColor(0xF5DEB3)
230  }
231  .width('90%')
232  .padding({ top: 10, bottom: 10 })
233  .backgroundColor(0xAFEEEE)
234  ```
235
236  ![zh-cn_image_0000001511900436](figures/zh-cn_image_0000001511900436.png)
237
238- FlexAlign.SpaceEvenly:Flex主轴方向元素等间距布局,相邻子组件之间的间距、第一个子组件与主轴起始端的间距、最后一个子组件到主轴终点端的间距均相等。
239
240
241  ```ts
242  Flex({ justifyContent: FlexAlign.SpaceEvenly }) {
243    Text('1').width('20%').height(50).backgroundColor(0xF5DEB3)
244    Text('2').width('20%').height(50).backgroundColor(0xD2B48C)
245    Text('3').width('20%').height(50).backgroundColor(0xF5DEB3)
246  }
247  .width('90%')
248  .padding({ top: 10, bottom: 10 })
249  .backgroundColor(0xAFEEEE)
250  ```
251
252  ![zh-cn_image_0000001563060713](figures/zh-cn_image_0000001563060713.png)
253
254
255## 交叉轴对齐方式
256
257容器和子元素都可以设置交叉轴对齐方式,且子元素设置的对齐方式优先级较高。
258
259
260### 容器组件设置交叉轴对齐
261
262可以通过Flex组件的alignItems参数设置子组件在交叉轴的对齐方式。
263
264
265- ItemAlign.Auto:使用Flex容器中默认配置。
266
267
268  ```ts
269  Flex({ alignItems: ItemAlign.Auto }) {
270    Text('1').width('33%').height(30).backgroundColor(0xF5DEB3)
271    Text('2').width('33%').height(40).backgroundColor(0xD2B48C)
272    Text('3').width('33%').height(50).backgroundColor(0xF5DEB3)
273  }
274  .size({ width: '90%', height: 80 })
275  .padding(10)
276  .backgroundColor(0xAFEEEE)
277  ```
278
279  ![zh-cn_image_0000001563060677](figures/zh-cn_image_0000001563060677.png)
280
281- ItemAlign.Start:交叉轴方向首部对齐。
282
283
284  ```ts
285  Flex({ alignItems: ItemAlign.Start }) {
286    Text('1').width('33%').height(30).backgroundColor(0xF5DEB3)
287    Text('2').width('33%').height(40).backgroundColor(0xD2B48C)
288    Text('3').width('33%').height(50).backgroundColor(0xF5DEB3)
289  }
290  .size({ width: '90%', height: 80 })
291  .padding(10)
292  .backgroundColor(0xAFEEEE)
293  ```
294
295  ![zh-cn_image_0000001562700453](figures/zh-cn_image_0000001562700453.png)
296
297- ItemAlign.Center:交叉轴方向居中对齐。
298
299
300  ```ts
301  Flex({ alignItems: ItemAlign.Center }) {
302    Text('1').width('33%').height(30).backgroundColor(0xF5DEB3)
303    Text('2').width('33%').height(40).backgroundColor(0xD2B48C)
304    Text('3').width('33%').height(50).backgroundColor(0xF5DEB3)
305  }
306  .size({ width: '90%', height: 80 })
307  .padding(10)
308  .backgroundColor(0xAFEEEE)
309  ```
310
311  ![zh-cn_image_0000001511740484](figures/zh-cn_image_0000001511740484.png)
312
313- ItemAlign.End:交叉轴方向底部对齐。
314
315
316  ```ts
317  Flex({ alignItems: ItemAlign.End }) {
318    Text('1').width('33%').height(30).backgroundColor(0xF5DEB3)
319    Text('2').width('33%').height(40).backgroundColor(0xD2B48C)
320    Text('3').width('33%').height(50).backgroundColor(0xF5DEB3)
321  }
322  .size({ width: '90%', height: 80 })
323  .padding(10)
324  .backgroundColor(0xAFEEEE)
325  ```
326
327  ![zh-cn_image_0000001511580876](figures/zh-cn_image_0000001511580876.png)
328
329- ItemAlign.Stretch:交叉轴方向拉伸填充,在未设置尺寸时,拉伸到容器尺寸。
330
331
332  ```ts
333  Flex({ alignItems: ItemAlign.Stretch }) {
334    Text('1').width('33%').height(30).backgroundColor(0xF5DEB3)
335    Text('2').width('33%').height(40).backgroundColor(0xD2B48C)
336    Text('3').width('33%').height(50).backgroundColor(0xF5DEB3)
337  }
338  .size({ width: '90%', height: 80 })
339  .padding(10)
340  .backgroundColor(0xAFEEEE)
341  ```
342
343  ![zh-cn_image_0000001511421252](figures/zh-cn_image_0000001511421252.png)
344
345- ItemAlign. Baseline:交叉轴方向文本基线对齐。
346
347
348  ```ts
349  Flex({ alignItems: ItemAlign.Baseline }) {
350    Text('1').width('33%').height(30).backgroundColor(0xF5DEB3)
351    Text('2').width('33%').height(40).backgroundColor(0xD2B48C)
352    Text('3').width('33%').height(50).backgroundColor(0xF5DEB3)
353  }
354  .size({ width: '90%', height: 80 })
355  .padding(10)
356  .backgroundColor(0xAFEEEE)
357  ```
358
359  ![zh-cn_image_0000001511900440](figures/zh-cn_image_0000001511900440.png)
360
361
362### 子组件设置交叉轴对齐
363
364子组件的[alignSelf](../reference/arkui-ts/ts-universal-attributes-flex-layout.md)属性也可以设置子组件在父容器交叉轴的对齐格式,且会覆盖Flex布局容器中alignItems配置。如下例所示:
365
366
367
368```ts
369Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center }) { // 容器组件设置子组件居中
370  Text('alignSelf Start').width('25%').height(80)
371    .alignSelf(ItemAlign.Start)
372    .backgroundColor(0xF5DEB3)
373  Text('alignSelf Baseline')
374    .alignSelf(ItemAlign.Baseline)
375    .width('25%')
376    .height(80)
377    .backgroundColor(0xD2B48C)
378  Text('alignSelf Baseline').width('25%').height(100)
379    .backgroundColor(0xF5DEB3)
380    .alignSelf(ItemAlign.Baseline)
381  Text('no alignSelf').width('25%').height(100)
382    .backgroundColor(0xD2B48C)
383  Text('no alignSelf').width('25%').height(100)
384    .backgroundColor(0xF5DEB3)
385
386}.width('90%').height(220).backgroundColor(0xAFEEEE)
387```
388
389
390![zh-cn_image_0000001562940533](figures/zh-cn_image_0000001562940533.png)
391
392
393上例中,Flex容器中alignItems设置交叉轴子组件的对齐方式为居中,子组件自身设置了alignSelf属性的情况,覆盖父组件的alignItems值,表现为alignSelf的定义。
394
395
396### 内容对齐
397
398可以通过[alignContent](../reference/arkui-ts/ts-container-flex.md)参数设置子组件各行在交叉轴剩余空间内的对齐方式,只在多行的flex布局中生效,可选值有:
399
400- FlexAlign.Start:子组件各行与交叉轴起点对齐。
401
402
403  ```ts
404  Flex({ justifyContent: FlexAlign.SpaceBetween, wrap: FlexWrap.Wrap, alignContent: FlexAlign.Start }) {
405    Text('1').width('30%').height(20).backgroundColor(0xF5DEB3)
406    Text('2').width('60%').height(20).backgroundColor(0xD2B48C)
407    Text('3').width('40%').height(20).backgroundColor(0xD2B48C)
408    Text('4').width('30%').height(20).backgroundColor(0xF5DEB3)
409    Text('5').width('20%').height(20).backgroundColor(0xD2B48C)
410  }
411  .width('90%')
412  .height(100)
413  .backgroundColor(0xAFEEEE)
414  ```
415
416  ![zh-cn_image_0000001511900460](figures/zh-cn_image_0000001511900460.png)
417
418- FlexAlign.Center:子组件各行在交叉轴方向居中对齐。
419
420
421  ```ts
422  Flex({ justifyContent: FlexAlign.SpaceBetween, wrap: FlexWrap.Wrap, alignContent: FlexAlign.Center }) {
423    Text('1').width('30%').height(20).backgroundColor(0xF5DEB3)
424    Text('2').width('60%').height(20).backgroundColor(0xD2B48C)
425    Text('3').width('40%').height(20).backgroundColor(0xD2B48C)
426    Text('4').width('30%').height(20).backgroundColor(0xF5DEB3)
427    Text('5').width('20%').height(20).backgroundColor(0xD2B48C)
428  }
429  .width('90%')
430  .height(100)
431  .backgroundColor(0xAFEEEE)
432  ```
433
434  ![zh-cn_image_0000001511421256](figures/zh-cn_image_0000001511421256.png)
435
436- FlexAlign.End:子组件各行与交叉轴终点对齐。
437
438
439  ```ts
440  Flex({ justifyContent: FlexAlign.SpaceBetween, wrap: FlexWrap.Wrap, alignContent: FlexAlign.End }) {
441    Text('1').width('30%').height(20).backgroundColor(0xF5DEB3)
442    Text('2').width('60%').height(20).backgroundColor(0xD2B48C)
443    Text('3').width('40%').height(20).backgroundColor(0xD2B48C)
444    Text('4').width('30%').height(20).backgroundColor(0xF5DEB3)
445    Text('5').width('20%').height(20).backgroundColor(0xD2B48C)
446  }
447  .width('90%')
448  .height(100)
449  .backgroundColor(0xAFEEEE)
450  ```
451
452  ![zh-cn_image_0000001562820801](figures/zh-cn_image_0000001562820801.png)
453
454- FlexAlign.SpaceBetween:子组件各行与交叉轴两端对齐,各行间垂直间距平均分布。
455
456
457  ```ts
458  Flex({ justifyContent: FlexAlign.SpaceBetween, wrap: FlexWrap.Wrap, alignContent: FlexAlign.SpaceBetween }) {
459    Text('1').width('30%').height(20).backgroundColor(0xF5DEB3)
460    Text('2').width('60%').height(20).backgroundColor(0xD2B48C)
461    Text('3').width('40%').height(20).backgroundColor(0xD2B48C)
462    Text('4').width('30%').height(20).backgroundColor(0xF5DEB3)
463    Text('5').width('20%').height(20).backgroundColor(0xD2B48C)
464  }
465  .width('90%')
466  .height(100)
467  .backgroundColor(0xAFEEEE)
468  ```
469
470  ![zh-cn_image_0000001511900448](figures/zh-cn_image_0000001511900448.png)
471
472- FlexAlign.SpaceAround:子组件各行间距相等,是元素首尾行与交叉轴两端距离的两倍。
473
474
475  ```ts
476  Flex({ justifyContent: FlexAlign.SpaceBetween, wrap: FlexWrap.Wrap, alignContent: FlexAlign.SpaceAround }) {
477    Text('1').width('30%').height(20).backgroundColor(0xF5DEB3)
478    Text('2').width('60%').height(20).backgroundColor(0xD2B48C)
479    Text('3').width('40%').height(20).backgroundColor(0xD2B48C)
480    Text('4').width('30%').height(20).backgroundColor(0xF5DEB3)
481    Text('5').width('20%').height(20).backgroundColor(0xD2B48C)
482  }
483  .width('90%')
484  .height(100)
485  .backgroundColor(0xAFEEEE)
486  ```
487
488  ![zh-cn_image_0000001562700445](figures/zh-cn_image_0000001562700445.png)
489
490- FlexAlign.SpaceEvenly:  子组件各行间距,子组件首尾行与交叉轴两端距离都相等。
491
492
493  ```ts
494  Flex({ justifyContent: FlexAlign.SpaceBetween, wrap: FlexWrap.Wrap, alignContent: FlexAlign.SpaceEvenly }) {
495    Text('1').width('30%').height(20).backgroundColor(0xF5DEB3)
496    Text('2').width('60%').height(20).backgroundColor(0xD2B48C)
497    Text('3').width('40%').height(20).backgroundColor(0xD2B48C)
498    Text('4').width('30%').height(20).backgroundColor(0xF5DEB3)
499    Text('5').width('20%').height(20).backgroundColor(0xD2B48C)
500  }
501  .width('90%')
502  .height(100)
503  .backgroundColor(0xAFEEEE)
504  ```
505
506  ![zh-cn_image_0000001511580864](figures/zh-cn_image_0000001511580864.png)
507
508
509## 自适应拉伸
510
511在弹性布局父组件尺寸不够大的时候,通过子组件的下面几个属性设置其在父容器的占比,达到自适应布局能力。
512
513- flexBasis:设置子组件在父容器主轴方向上的基准尺寸。如果设置了该值,则子项占用的空间为设置的值;如果没设置该属性,那子项的空间为width/height的值。
514
515
516  ```ts
517  Flex() {
518    Text('flexBasis("auto")')
519      .flexBasis('auto') // 未设置width以及flexBasis值为auto,内容自身宽松
520      .height(100)
521      .backgroundColor(0xF5DEB3)
522    Text('flexBasis("auto")'+' width("40%")')
523      .width('40%')
524      .flexBasis('auto') //设置width以及flexBasis值auto,使用width的值
525      .height(100)
526      .backgroundColor(0xD2B48C)
527
528    Text('flexBasis(100)')  // 未设置width以及flexBasis值为100,宽度为100vp
529      .flexBasis(100)
530      .height(100)
531      .backgroundColor(0xF5DEB3)
532
533    Text('flexBasis(100)')
534      .flexBasis(100)
535      .width(200) // flexBasis值为100,覆盖width的设置值,宽度为100vp
536      .height(100)
537      .backgroundColor(0xD2B48C)
538  }.width('90%').height(120).padding(10).backgroundColor(0xAFEEEE)
539  ```
540
541  ![zh-cn_image_0000001562940505](figures/zh-cn_image_0000001562940505.png)
542
543- flexGrow:设置父容器的剩余空间分配给此属性所在组件的比例。用于“瓜分”父组件的剩余空间。
544
545
546  ```ts
547  Flex() {
548    Text('flexGrow(1)')
549      .flexGrow(2)
550      .width(100)
551      .height(100)
552      .backgroundColor(0xF5DEB3)
553
554    Text('flexGrow(2)')
555      .flexGrow(2)
556      .width(100)
557      .height(100)
558      .backgroundColor(0xD2B48C)
559
560    Text('no flexGrow')
561      .width(100)
562      .height(100)
563      .backgroundColor(0xF5DEB3)
564  }.width(400).height(120).padding(10).backgroundColor(0xAFEEEE)
565  ```
566
567  ![zh-cn_image_0000001562700449](figures/zh-cn_image_0000001562700449.png)
568
569  父容器宽度400vp,三个子组件原始宽度为100vp,总和300vp,剩余空间100vp根据flexGrow值的占比分配给子组件,未设置flexGrow的子组件不参与“瓜分”。
570
571  第一个元素以及第二个元素以2:3分配剩下的100vp。第一个元素为100vp+100vp2/5=140vp,第二个元素为100vp+100vp3/5=160vp。
572
573- flexShrink: 当父容器空间不足时,子组件的压缩比例。
574
575
576  ```ts
577  Flex({ direction: FlexDirection.Row }) {
578    Text('flexShrink(3)')
579      .flexShrink(3)
580      .width(200)
581      .height(100)
582      .backgroundColor(0xF5DEB3)
583
584    Text('no flexShrink')
585      .width(200)
586      .height(100)
587      .backgroundColor(0xD2B48C)
588
589    Text('flexShrink(2)')
590      .flexShrink(2)
591      .width(200)
592      .height(100)
593      .backgroundColor(0xF5DEB3)
594  }.width(400).height(120).padding(10).backgroundColor(0xAFEEEE)
595  ```
596
597  ![zh-cn_image_0000001562820813](figures/zh-cn_image_0000001562820813.png)
598
599
600## 相关实例
601
602使用弹性布局,可以实现子组件沿水平方向排列,两端对齐,子组件间距平分,竖直方向上子组件居中的效果。
603
604
605```ts
606@Entry
607@Component
608struct FlexExample {
609  build() {
610    Column() {
611      Column({ space: 5 }) {
612        Flex({ direction: FlexDirection.Row, wrap: FlexWrap.NoWrap, justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Center }) {
613          Text('1').width('30%').height(50).backgroundColor(0xF5DEB3)
614          Text('2').width('30%').height(50).backgroundColor(0xD2B48C)
615          Text('3').width('30%').height(50).backgroundColor(0xF5DEB3)
616        }
617        .height(70)
618        .width('90%')
619        .backgroundColor(0xAFEEEE)
620      }.width('100%').margin({ top: 5 })
621    }.width('100%')
622 }
623}
624```
625
626![zh-cn_image_0000001511900452](figures/zh-cn_image_0000001511900452.png)
627