• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Flex Layout (Flex)
2
3
4## Overview
5
6The flex layout, implemented using the [\<Flex>](../reference/arkui-ts/ts-container-flex.md) container component, provides simple and powerful tools for flexibly distributing space and aligning items. The flex layout is widely used in scenarios such as the navigation bar distribution on the page header, page framework setup, and arrangement of multiple lines of data.
7
8By default, the flex container has a main axis and a cross axis, and child elements are arranged along the main axis. The size of a child element along the main axis is referred to as its main axis size. Similarly, the size of a child element along the cross axis is referred to as its cross axis size.
9
10
11
12  **Figure 1** Flex container whose main axis runs in the horizontal direction
13
14![flex-layout](figures/flex-layout.png)
15
16
17## Basic Concepts
18
19- Main axis: axis along which child elements are placed in the **\<Flex>** component. Child elements are laid out along the main axis by default. The start point of the main axis is referred to as main-start, and the end point is referred to as main-end.
20
21- Cross axis: axis that runs perpendicular to the main axis. The start point of the cross axis is referred to as cross-start, and the end point is referred to as cross-end.
22
23
24## Layout Direction
25
26In the flex layout, the child elements can be arranged in any direction. You can set the **direction** parameter to define the direction of the main axis and thereby control the arrangement of child elements.
27
28  **Figure 2** Flex layout direction
29
30![flex-layout-direction](figures/flex-layout-direction.png)
31
32- **FlexDirection.Row** (default value): The main axis runs along the row horizontally, and the child elements are laid out from the start edge of the main axis.
33
34
35  ```ts
36  Flex({ direction: FlexDirection.Row }) {
37    Text('1').width('33%').height(50).backgroundColor(0xF5DEB3)
38    Text('2').width('33%').height(50).backgroundColor(0xD2B48C)
39    Text('3').width('33%').height(50).backgroundColor(0xF5DEB3)
40  }
41  .height(70)
42  .width('90%')
43  .padding(10)
44  .backgroundColor(0xAFEEEE)
45  ```
46
47  ![en-us_image_0000001562820817](figures/en-us_image_0000001562820817.png)
48
49- **FlexDirection.RowReverse**: The main axis runs along the row horizontally, and the child elements are laid out from the end edge of the main axis, in a direction opposite to **FlexDirection.Row**.
50
51
52  ```ts
53  Flex({ direction: FlexDirection.RowReverse }) {
54    Text('1').width('33%').height(50).backgroundColor(0xF5DEB3)
55    Text('2').width('33%').height(50).backgroundColor(0xD2B48C)
56    Text('3').width('33%').height(50).backgroundColor(0xF5DEB3)
57  }
58  .height(70)
59  .width('90%')
60  .padding(10)
61  .backgroundColor(0xAFEEEE)
62  ```
63
64  ![en-us_image_0000001511900464](figures/en-us_image_0000001511900464.png)
65
66- **FlexDirection.Column**: The main axis runs along the column vertically, and the child elements are laid out from the start edge of the main axis.
67
68
69  ```ts
70  Flex({ direction: FlexDirection.Column }) {
71    Text('1').width('100%').height(50).backgroundColor(0xF5DEB3)
72    Text('2').width('100%').height(50).backgroundColor(0xD2B48C)
73    Text('3').width('100%').height(50).backgroundColor(0xF5DEB3)
74  }
75  .height(70)
76  .width('90%')
77  .padding(10)
78  .backgroundColor(0xAFEEEE)
79  ```
80
81  ![en-us_image_0000001511580884](figures/en-us_image_0000001511580884.png)
82
83- **FlexDirection.ColumnReverse**: The main axis runs along the column vertically, and the child elements are laid out from the end edge of the main axis, in a direction opposite to **FlexDirection.Column**.
84
85
86  ```ts
87  Flex({ direction: FlexDirection.ColumnReverse }) {
88    Text('1').width('100%').height(50).backgroundColor(0xF5DEB3)
89    Text('2').width('100%').height(50).backgroundColor(0xD2B48C)
90    Text('3').width('100%').height(50).backgroundColor(0xF5DEB3)
91  }
92  .height(70)
93  .width('90%')
94  .padding(10)
95  .backgroundColor(0xAFEEEE)
96  ```
97
98  ![en-us_image_0000001562940541](figures/en-us_image_0000001562940541.png)
99
100
101## Wrapping in the Flex Layout
102
103In the flex layout, child elements can be laid on a single line or on multiple lines. By default, child elements in the flex container are laid out on a single line (also called an axis). You can use the **wrap** attribute to set whether child elements can wrap onto multiple lines when the total main axis size of the child elements is greater than the main axis size of the container. When wrapped onto multiple lines, the child elements on the new line are aligned based on the cross axis direction.
104
105- **FlexWrap.NoWrap** (default value): Child elements are laid out on a single line. This may cause the child elements to shrink to fit the container when their total width is greater than the container width.
106
107
108  ```ts
109  Flex({ wrap: FlexWrap.NoWrap }) {
110    Text('1').width('50%').height(50).backgroundColor(0xF5DEB3)
111    Text('2').width('50%').height(50).backgroundColor(0xD2B48C)
112    Text('3').width('50%').height(50).backgroundColor(0xF5DEB3)
113  }
114  .width('90%')
115  .padding(10)
116  .backgroundColor(0xAFEEEE)
117  ```
118
119  ![en-us_image_0000001562700425](figures/en-us_image_0000001562700425.png)
120
121- **FlexWrap.Wrap**: Child elements break into multiple lines and are aligned along the main axis.
122
123
124  ```ts
125  Flex({ wrap: FlexWrap.Wrap }) {
126    Text('1').width('50%').height(50).backgroundColor(0xF5DEB3)
127    Text('2').width('50%').height(50).backgroundColor(0xD2B48C)
128    Text('3').width('50%').height(50).backgroundColor(0xD2B48C)
129  }
130  .width('90%')
131  .padding(10)
132  .backgroundColor(0xAFEEEE)
133  ```
134
135  ![en-us_image_0000001511740468](figures/en-us_image_0000001511740468.png)
136
137- **FlexWrap.WrapReverse**: Child elements break into multiple lines and are aligned in the reverse direction to the main axis.
138
139
140  ```ts
141  Flex({ wrap: FlexWrap.WrapReverse}) {
142    Text('1').width('50%').height(50).backgroundColor(0xF5DEB3)
143    Text('2').width('50%').height(50).backgroundColor(0xD2B48C)
144    Text('3').width('50%').height(50).backgroundColor(0xF5DEB3)
145  }
146  .width('90%')
147  .padding(10)
148  .backgroundColor(0xAFEEEE)
149  ```
150
151  ![en-us_image_0000001562940521](figures/en-us_image_0000001562940521.png)
152
153
154## Alignment on the Main Axis
155
156Use the **justifyContent** parameter to set alignment of child elements on the main axis.
157
158![flex-spindle-alignment](figures/flex-spindle-alignment.png)
159
160
161- **FlexAlign.Start** (default value): The child elements are aligned with each other toward the start edge of the container along the main axis.
162
163
164  ```ts
165  let PTopBottom:Record<string,number> = { 'top': 10, 'bottom': 10 }
166  Flex({ justifyContent: FlexAlign.Start }) {
167    Text('1').width('20%').height(50).backgroundColor(0xF5DEB3)
168    Text('2').width('20%').height(50).backgroundColor(0xD2B48C)
169    Text('3').width('20%').height(50).backgroundColor(0xF5DEB3)
170  }
171  .width('90%')
172  .padding(PTopBottom)
173  .backgroundColor(0xAFEEEE)
174  ```
175
176  ![en-us_image_0000001511421280](figures/en-us_image_0000001511421280.png)
177
178- **FlexAlign.Center**: The child elements are aligned with each other toward the center of the container along the main axis.
179
180
181  ```ts
182  let PTopBottom:Record<string,number> = { 'top': 10, 'bottom': 10 }
183  Flex({ justifyContent: FlexAlign.Center }) {
184    Text('1').width('20%').height(50).backgroundColor(0xF5DEB3)
185    Text('2').width('20%').height(50).backgroundColor(0xD2B48C)
186    Text('3').width('20%').height(50).backgroundColor(0xF5DEB3)
187  }
188  .width('90%')
189  .padding(PTopBottom)
190  .backgroundColor(0xAFEEEE)
191  ```
192
193  ![en-us_image_0000001563060681](figures/en-us_image_0000001563060681.png)
194
195- **FlexAlign.End**: The child elements are aligned with each other toward the end edge of the container along the main axis.
196
197
198  ```ts
199  let PTopBottom:Record<string,number> = { 'top': 10, 'bottom': 10 }
200  Flex({ justifyContent: FlexAlign.End }) {
201    Text('1').width('20%').height(50).backgroundColor(0xF5DEB3)
202    Text('2').width('20%').height(50).backgroundColor(0xD2B48C)
203    Text('3').width('20%').height(50).backgroundColor(0xF5DEB3)
204  }
205  .width('90%')
206  .padding(PTopBottom)
207  .backgroundColor(0xAFEEEE)
208  ```
209
210  ![en-us_image_0000001562820809](figures/en-us_image_0000001562820809.png)
211
212- **FlexAlign.SpaceBetween**: The child elements are evenly distributed within the container along the main axis. The first and last child elements are aligned with the edges of the container.
213
214
215  ```ts
216  let PTopBottom1:Record<string,number> = { 'top': 10, 'bottom': 10 }
217  Flex({ justifyContent: FlexAlign.SpaceBetween }) {
218    Text('1').width('20%').height(50).backgroundColor(0xF5DEB3)
219    Text('2').width('20%').height(50).backgroundColor(0xD2B48C)
220    Text('3').width('20%').height(50).backgroundColor(0xF5DEB3)
221  }
222  .width('90%')
223  .padding(PTopBottom1)
224  .backgroundColor(0xAFEEEE)
225  ```
226
227  ![en-us_image_0000001511421288](figures/en-us_image_0000001511421288.png)
228
229- **FlexAlign.SpaceAround**: The child elements are evenly distributed within the container along the main axis. The space between the first child element and main-start, and that between the last child element and main-end are both half of the space between two adjacent child elements.
230
231
232  ```ts
233  let PTopBottom:Record<string,number> = { 'top': 10, 'bottom': 10 }
234  Flex({ justifyContent: FlexAlign.SpaceAround }) {
235    Text('1').width('20%').height(50).backgroundColor(0xF5DEB3)
236    Text('2').width('20%').height(50).backgroundColor(0xD2B48C)
237    Text('3').width('20%').height(50).backgroundColor(0xF5DEB3)
238  }
239  .width('90%')
240  .padding(PTopBottom)
241  .backgroundColor(0xAFEEEE)
242  ```
243
244  ![en-us_image_0000001511900436](figures/en-us_image_0000001511900436.png)
245
246- **FlexAlign.SpaceEvenly**: The child elements are evenly distributed within the container along the main axis. The space between the first child element and main-start, the space between the last child element and main-end, and the space between two adjacent child elements are the same.
247
248
249  ```ts
250  let PTopBottom:Record<string,number> = { 'top': 10, 'bottom': 10 }
251  Flex({ justifyContent: FlexAlign.SpaceEvenly }) {
252    Text('1').width('20%').height(50).backgroundColor(0xF5DEB3)
253    Text('2').width('20%').height(50).backgroundColor(0xD2B48C)
254    Text('3').width('20%').height(50).backgroundColor(0xF5DEB3)
255  }
256  .width('90%')
257  .padding(PTopBottom)
258  .backgroundColor(0xAFEEEE)
259  ```
260
261  ![en-us_image_0000001563060713](figures/en-us_image_0000001563060713.png)
262
263
264## Alignment on the Cross Axis
265
266Alignment on the cross axis can be set for both the container and child elements, with that set for child elements having a higher priority.
267
268
269### Setting Alignment on the Cross Axis for the Container
270
271Use the **alignItems** parameter of the **\<Flex>** component to set alignment of child elements on the cross axis.
272
273
274- **ItemAlign.Auto**: The child elements are automatically aligned in the flex container.
275
276
277  ```ts
278  let SWh:Record<string,number|string> = { 'width': '90%', 'height': 80 }
279  Flex({ alignItems: ItemAlign.Auto }) {
280    Text('1').width('33%').height(30).backgroundColor(0xF5DEB3)
281    Text('2').width('33%').height(40).backgroundColor(0xD2B48C)
282    Text('3').width('33%').height(50).backgroundColor(0xF5DEB3)
283  }
284  .size(SWh)
285  .padding(10)
286  .backgroundColor(0xAFEEEE)
287  ```
288
289  ![en-us_image_0000001563060677](figures/en-us_image_0000001563060677.png)
290
291- **ItemAlign.Start**: The child elements are aligned with the start edge of the container along the cross axis.
292
293
294  ```ts
295  let SWh:Record<string,number|string> = { 'width': '90%', 'height': 80 }
296  Flex({ alignItems: ItemAlign.Start }) {
297    Text('1').width('33%').height(30).backgroundColor(0xF5DEB3)
298    Text('2').width('33%').height(40).backgroundColor(0xD2B48C)
299    Text('3').width('33%').height(50).backgroundColor(0xF5DEB3)
300  }
301  .size(SWh)
302  .padding(10)
303  .backgroundColor(0xAFEEEE)
304  ```
305
306  ![en-us_image_0000001562700453](figures/en-us_image_0000001562700453.png)
307
308- **ItemAlign.Start**: The child elements are aligned with the center of the container along the cross axis.
309
310
311  ```ts
312  let SWh:Record<string,number|string> = { 'width': '90%', 'height': 80 }
313  Flex({ alignItems: ItemAlign.Center }) {
314    Text('1').width('33%').height(30).backgroundColor(0xF5DEB3)
315    Text('2').width('33%').height(40).backgroundColor(0xD2B48C)
316    Text('3').width('33%').height(50).backgroundColor(0xF5DEB3)
317  }
318  .size(SWh)
319  .padding(10)
320  .backgroundColor(0xAFEEEE)
321  ```
322
323  ![en-us_image_0000001511740484](figures/en-us_image_0000001511740484.png)
324
325- **ItemAlign.End**: The child elements are aligned with the end edge of the container along the cross axis.
326
327
328  ```ts
329  let SWh:Record<string,number|string> = { 'width': '90%', 'height': 80 }
330  Flex({ alignItems: ItemAlign.End }) {
331    Text('1').width('33%').height(30).backgroundColor(0xF5DEB3)
332    Text('2').width('33%').height(40).backgroundColor(0xD2B48C)
333    Text('3').width('33%').height(50).backgroundColor(0xF5DEB3)
334  }
335  .size(SWh)
336  .padding(10)
337  .backgroundColor(0xAFEEEE)
338  ```
339
340  ![en-us_image_0000001511580876](figures/en-us_image_0000001511580876.png)
341
342- **ItemAlign.Stretch**: The child elements are stretched along the cross axis. If no constraints are set, the child elements are stretched to fill the size of the container on the cross axis.
343
344
345  ```ts
346  let SWh:Record<string,number|string> = { 'width': '90%', 'height': 80 }
347  Flex({ alignItems: ItemAlign.Stretch }) {
348    Text('1').width('33%').height(30).backgroundColor(0xF5DEB3)
349    Text('2').width('33%').height(40).backgroundColor(0xD2B48C)
350    Text('3').width('33%').height(50).backgroundColor(0xF5DEB3)
351  }
352  .size(SWh)
353  .padding(10)
354  .backgroundColor(0xAFEEEE)
355  ```
356
357  ![en-us_image_0000001511421252](figures/en-us_image_0000001511421252.png)
358
359- **ItemAlign.Baseline**: The child elements are aligned at the baseline of the cross axis.
360
361
362  ```ts
363  let SWh:Record<string,number|string> = { 'width': '90%', 'height': 80 }
364  Flex({ alignItems: ItemAlign.Baseline }) {
365    Text('1').width('33%').height(30).backgroundColor(0xF5DEB3)
366    Text('2').width('33%').height(40).backgroundColor(0xD2B48C)
367    Text('3').width('33%').height(50).backgroundColor(0xF5DEB3)
368  }
369  .size(SWh)
370  .padding(10)
371  .backgroundColor(0xAFEEEE)
372  ```
373
374  ![en-us_image_0000001511900440](figures/en-us_image_0000001511900440.png)
375
376
377### Setting Alignment on the Cross Axis for Child Elements
378
379Use the [alignSelf](../reference/arkui-ts/ts-universal-attributes-flex-layout.md) attribute of child elements to set their alignment in the container on the cross axis. The settings overwrite the default **alignItems** settings in the flex container. The sample code is as follows:
380
381
382
383```ts
384Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center }) { // The child elements are aligned with the center of the container.
385  Text('alignSelf Start').width('25%').height(80)
386    .alignSelf(ItemAlign.Start)
387    .backgroundColor(0xF5DEB3)
388  Text('alignSelf Baseline')
389    .alignSelf(ItemAlign.Baseline)
390    .width('25%')
391    .height(80)
392    .backgroundColor(0xD2B48C)
393  Text('alignSelf Baseline').width('25%').height(100)
394    .backgroundColor(0xF5DEB3)
395    .alignSelf(ItemAlign.Baseline)
396  Text('no alignSelf').width('25%').height(100)
397    .backgroundColor(0xD2B48C)
398  Text('no alignSelf').width('25%').height(100)
399    .backgroundColor(0xF5DEB3)
400
401}.width('90%').height(220).backgroundColor(0xAFEEEE)
402```
403
404
405![en-us_image_0000001562940533](figures/en-us_image_0000001562940533.png)
406
407
408In the preceding example, the **alignItems** parameter of the **\<Flex>** container and the **alignSelf** attribute of the child element are both set. In this case, the **alignSelf** settings take effect.
409
410
411### Content Alignment
412
413Use the [alignContent](../reference/arkui-ts/ts-container-flex.md) parameter to set how space is distributed between and around child elements along the cross axis. This parameter is effective only for a multi-line flex layout. Its available options are as follows:
414
415- **FlexAlign.Start**: The child elements are aligned toward the start edge of the cross axis in the container.
416
417
418  ```ts
419  Flex({ justifyContent: FlexAlign.SpaceBetween, wrap: FlexWrap.Wrap, alignContent: FlexAlign.Start }) {
420    Text('1').width('30%').height(20).backgroundColor(0xF5DEB3)
421    Text('2').width('60%').height(20).backgroundColor(0xD2B48C)
422    Text('3').width('40%').height(20).backgroundColor(0xD2B48C)
423    Text('4').width('30%').height(20).backgroundColor(0xF5DEB3)
424    Text('5').width('20%').height(20).backgroundColor(0xD2B48C)
425  }
426  .width('90%')
427  .height(100)
428  .backgroundColor(0xAFEEEE)
429  ```
430
431  ![en-us_image_0000001511900460](figures/en-us_image_0000001511900460.png)
432
433- **FlexAlign.Center**: The child elements are aligned toward the center of the cross axis in the container.
434
435
436  ```ts
437  Flex({ justifyContent: FlexAlign.SpaceBetween, wrap: FlexWrap.Wrap, alignContent: FlexAlign.Center }) {
438    Text('1').width('30%').height(20).backgroundColor(0xF5DEB3)
439    Text('2').width('60%').height(20).backgroundColor(0xD2B48C)
440    Text('3').width('40%').height(20).backgroundColor(0xD2B48C)
441    Text('4').width('30%').height(20).backgroundColor(0xF5DEB3)
442    Text('5').width('20%').height(20).backgroundColor(0xD2B48C)
443  }
444  .width('90%')
445  .height(100)
446  .backgroundColor(0xAFEEEE)
447  ```
448
449  ![en-us_image_0000001511421256](figures/en-us_image_0000001511421256.png)
450
451- **FlexAlign.End**: The child elements are aligned toward the end edge of the cross axis in the container.
452
453
454  ```ts
455  Flex({ justifyContent: FlexAlign.SpaceBetween, wrap: FlexWrap.Wrap, alignContent: FlexAlign.End }) {
456    Text('1').width('30%').height(20).backgroundColor(0xF5DEB3)
457    Text('2').width('60%').height(20).backgroundColor(0xD2B48C)
458    Text('3').width('40%').height(20).backgroundColor(0xD2B48C)
459    Text('4').width('30%').height(20).backgroundColor(0xF5DEB3)
460    Text('5').width('20%').height(20).backgroundColor(0xD2B48C)
461  }
462  .width('90%')
463  .height(100)
464  .backgroundColor(0xAFEEEE)
465  ```
466
467  ![en-us_image_0000001562820801](figures/en-us_image_0000001562820801.png)
468
469- **FlexAlign.SpaceBetween**: The child elements are evenly distributed within the container along the cross axis. The first and last child elements are aligned with the edges of the container.
470
471
472  ```ts
473  Flex({ justifyContent: FlexAlign.SpaceBetween, wrap: FlexWrap.Wrap, alignContent: FlexAlign.SpaceBetween }) {
474    Text('1').width('30%').height(20).backgroundColor(0xF5DEB3)
475    Text('2').width('60%').height(20).backgroundColor(0xD2B48C)
476    Text('3').width('40%').height(20).backgroundColor(0xD2B48C)
477    Text('4').width('30%').height(20).backgroundColor(0xF5DEB3)
478    Text('5').width('20%').height(20).backgroundColor(0xD2B48C)
479  }
480  .width('90%')
481  .height(100)
482  .backgroundColor(0xAFEEEE)
483  ```
484
485  ![en-us_image_0000001511900448](figures/en-us_image_0000001511900448.png)
486
487- **FlexAlign.SpaceAround**: The child elements are evenly distributed within the container along the cross axis. The space between the first child element and cross-start, and that between the last child element and cross-end are both half of the space between two adjacent child elements.
488
489
490  ```ts
491  Flex({ justifyContent: FlexAlign.SpaceBetween, wrap: FlexWrap.Wrap, alignContent: FlexAlign.SpaceAround }) {
492    Text('1').width('30%').height(20).backgroundColor(0xF5DEB3)
493    Text('2').width('60%').height(20).backgroundColor(0xD2B48C)
494    Text('3').width('40%').height(20).backgroundColor(0xD2B48C)
495    Text('4').width('30%').height(20).backgroundColor(0xF5DEB3)
496    Text('5').width('20%').height(20).backgroundColor(0xD2B48C)
497  }
498  .width('90%')
499  .height(100)
500  .backgroundColor(0xAFEEEE)
501  ```
502
503  ![en-us_image_0000001562700445](figures/en-us_image_0000001562700445.png)
504
505- **FlexAlign.SpaceEvenly**: The child elements are evenly distributed within the container along the cross axis. The space between the first child element and cross-start, the space between the last child element and cross-end, and the space between two adjacent child elements are the same.
506
507
508  ```ts
509  Flex({ justifyContent: FlexAlign.SpaceBetween, wrap: FlexWrap.Wrap, alignContent: FlexAlign.SpaceEvenly }) {
510    Text('1').width('30%').height(20).backgroundColor(0xF5DEB3)
511    Text('2').width('60%').height(20).backgroundColor(0xD2B48C)
512    Text('3').width('40%').height(20).backgroundColor(0xD2B48C)
513    Text('4').width('30%').height(20).backgroundColor(0xF5DEB3)
514    Text('5').width('20%').height(20).backgroundColor(0xD2B48C)
515  }
516  .width('90%')
517  .height(100)
518  .backgroundColor(0xAFEEEE)
519  ```
520
521  ![en-us_image_0000001511580864](figures/en-us_image_0000001511580864.png)
522
523
524## Adaptive Scaling
525
526When the size of the flex container is not large enough, the following attributes of the child element can be used to achieve adaptive layout:
527
528- **flexBasis**: base size of the child element in the container along the main axis. It sets the space occupied by the child element. If this attribute is not set, the space occupied by the child element is the value of width/height.
529
530
531  ```ts
532  Flex() {
533    Text('flexBasis("auto")')
534      .flexBasis('auto') // When width is not set and flexBasis is set to auto, the content is loose.
535      .height(100)
536      .backgroundColor(0xF5DEB3)
537    Text('flexBasis("auto")'+' width("40%")')
538      .width('40%')
539      .flexBasis('auto') // When width is set and flexBasis is set to auto, the value of width is used.
540      .height(100)
541      .backgroundColor(0xD2B48C)
542
543    Text('flexBasis(100)') // When width is not set and flexBasis is set to 100, the width is 100 vp.
544      .flexBasis(100)
545      .height(100)
546      .backgroundColor(0xF5DEB3)
547
548    Text('flexBasis(100)')
549      .flexBasis(100)
550      .width(200) // When both width and flexBasis are set, flexBasis takes precedence, and the width is 100 vp.
551      .height(100)
552      .backgroundColor(0xD2B48C)
553  }.width('90%').height(120).padding(10).backgroundColor(0xAFEEEE)
554  ```
555
556  ![en-us_image_0000001562940505](figures/en-us_image_0000001562940505.png)
557
558- **flexGrow**: percentage of the flex container's remaining space that is allocated to the child element. In other words, it is the grow factor of the child element.
559
560  ```ts
561  Flex() {
562    Text('flexGrow(2)')
563      .flexGrow(2)
564      .width(100)
565      .height(100)
566      .backgroundColor(0xF5DEB3)
567    Text('flexGrow(3)')
568      .flexGrow(3)
569      .width(100)
570      .height(100)
571      .backgroundColor(0xD2B48C)
572
573    Text('no flexGrow')
574      .width(100)
575      .height(100)
576      .backgroundColor(0xF5DEB3)
577  }.width(400).height(120).padding(10).backgroundColor(0xAFEEEE)
578  ```
579
580  ![en-us_image_0000001562700449](figures/en-us_image_0000001562700449.png)
581
582  In the preceding figure, the width of the flex container is 400 vp, the original width of the three child elements is 100 vp each, which adds up to the total width of 300 vp. The flex container's remaining 100 vp space is allocated to the child elements based on their **flexGrow** settings. The third child element does not have **flexGrow** set and therefore does not participate in the allocation of remaining space.
583
584  After receiving their share of remaining space at the 2:3 ratio, the first and second child elements are at a width of 140 vp (100 vp + 100 vp x 2/5) and 160 vp (100 vp + 100 vp x 3/5), respectively.
585
586- **flexShrink**: shrink factor of the child element when the size of all child elements is larger than the flex container.
587
588
589  ```ts
590  Flex({ direction: FlexDirection.Row }) {
591    Text('flexShrink(3)')
592      .flexShrink(3)
593      .width(200)
594      .height(100)
595      .backgroundColor(0xF5DEB3)
596
597    Text('no flexShrink')
598      .width(200)
599      .height(100)
600      .backgroundColor(0xD2B48C)
601
602    Text('flexShrink(2)')
603      .flexShrink(2)
604      .width(200)
605      .height(100)
606      .backgroundColor(0xF5DEB3)
607  }.width(400).height(120).padding(10).backgroundColor(0xAFEEEE)
608  ```
609
610  ![en-us_image_0000001562820813](figures/en-us_image_0000001562820813.png)
611
612
613## Example
614
615In this example, child elements are arranged horizontally in the flex layout, aligned at both edges, evenly spaced, and centered in the vertical direction.
616
617
618```ts
619@Entry
620@Component
621struct FlexExample {
622  build() {
623    Column() {
624      Column({ space: 5 }) {
625        Flex({ direction: FlexDirection.Row, wrap: FlexWrap.NoWrap, justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Center }) {
626          Text('1').width('30%').height(50).backgroundColor(0xF5DEB3)
627          Text('2').width('30%').height(50).backgroundColor(0xD2B48C)
628          Text('3').width('30%').height(50).backgroundColor(0xF5DEB3)
629        }
630        .height(70)
631        .width('90%')
632        .backgroundColor(0xAFEEEE)
633      }.width('100%').margin({ top: 5 })
634    }.width('100%')
635 }
636}
637```
638
639![en-us_image_0000001511900452](figures/en-us_image_0000001511900452.png)
640