跳到主要内容
版本:0.83

使用 Flexbox 进行布局

组件可以使用 Flexbox 算法来指定其子元素的布局。Flexbox 旨在在不同屏幕尺寸上提供一致的布局。

通常你会结合使用 flexDirectionalignItemsjustifyContent 来实现正确的布局。

警告

Flexbox 在 React Native 中的工作方式与它在 Web 端 CSS 中的工作方式相同,但有一些例外。 默认值不同:flexDirection 默认是 column 而不是 rowalignContent 默认是 flex-start 而不是 stretchflexShrink 默认是 0 而不是 1flex 参数只支持单个数字。

Flex

flex 将定义你的项目如何沿主轴 “填充” 可用空间。空间会根据每个元素的 flex 属性进行分配。

在下面的示例中,红色、橙色和绿色视图都是容器视图的子元素,并且容器设置了 flex: 1。红色视图使用 flex: 1,橙色视图使用 flex: 2,绿色视图使用 flex: 31+2+3 = 6,这意味着红色视图将获得空间的 1/6,橙色视图获得 2/6,绿色视图获得 3/6

Flex Direction

flexDirection 控制节点子元素的布局方向。这也被称为主轴。交叉轴是与主轴垂直的轴,或者说是换行内容所在的轴。

  • column (默认值) 将子元素从上到下排列。如果启用了换行,那么下一行将从容器顶部第一个项目的右侧开始。

  • row 将子元素从左到右排列。如果启用了换行,那么下一行将从容器左侧第一个项目的下方开始。

  • column-reverse 将子元素从下到上排列。如果启用了换行,那么下一行将从容器底部第一个项目的右侧开始。

  • row-reverse 将子元素从右到左排列。如果启用了换行,那么下一行将从容器右侧第一个项目的下方开始。

你可以在 这里 了解更多。

布局方向

布局 direction 指定层次结构中的子元素和文本应如何布局。布局方向还会影响 startend 所指的边。默认情况下,React Native 使用 LTR 布局方向。在此模式下,start 指左边,end 指右边。

  • LTR (默认值) 文本和子元素从左到右布局。应用于元素起始位置的 margin 和 padding 会作用在左侧。

  • RTL 文本和子元素从右到左布局。应用于元素起始位置的 margin 和 padding 会作用在右侧。

主轴对齐

justifyContent 描述了如何在容器的主轴上对齐子元素。例如,当 flexDirection 设置为 row 时,你可以使用此属性让子元素在容器中水平居中;当 flexDirection 设置为 column 时,可以让子元素在容器中垂直居中。

  • flex-start默认值)将容器的子元素对齐到容器主轴的起点。

  • flex-end 将容器的子元素对齐到容器主轴的终点。

  • center 将容器的子元素对齐到容器主轴的中心。

  • space-between 在容器主轴上均匀分布子元素,在子元素之间分配剩余空间。

  • space-around 在容器主轴上均匀分布子元素,在子元素周围分配剩余空间。与 space-between 相比,使用 space-around 会在第一个子元素的起始位置和最后一个子元素的末尾位置分配空间。

  • space-evenly 沿主轴在对齐容器内均匀分布子元素。每一对相邻项目之间、主轴起始边缘与第一个项目之间,以及主轴结束边缘与最后一个项目之间的间距都完全相同。

你可以在这里了解更多。

交叉轴对齐

alignItems 描述了如何沿着容器的交叉轴对齐子元素。它与 justifyContent 非常相似,但 justifyContent 作用于主轴,而 alignItems 作用于交叉轴。

  • stretch默认值)拉伸容器的子元素,使其与容器交叉轴的 height 匹配。

  • flex-start 将容器的子元素对齐到容器交叉轴的起点。

  • flex-end 将容器的子元素对齐到容器交叉轴的终点。

  • center 将容器的子元素对齐到容器交叉轴的中心。

  • baseline 沿着共同的基线对齐容器的子元素。单个子元素可以被设置为其父元素的参考基线。

信息

要让 stretch 生效,子元素在次轴上不能有固定尺寸。在下面的示例中,在子元素上移除 width: 50 之前,设置 alignItems: stretch 不会产生任何效果。

你可以在这里了解更多。

自身对齐

alignSelfalignItems 具有相同的选项和效果,但不同的是,它不是影响容器内的子元素,而是可以将此属性应用于单个子元素,以改变它在其父元素中的对齐方式。alignSelf 会覆盖父元素通过 alignItems 设置的任何选项。

对齐内容

alignContent 定义了沿着交叉轴的行分布方式。仅当项目使用 flexWrap 换行到多行时才会生效。

  • flex-start (默认值) 将换行后的各行对齐到容器交叉轴的起始位置。

  • flex-end 将换行后的各行对齐到容器交叉轴的末尾位置。

  • stretch (在 web 上使用 Yoga 时的默认值) 使换行后的各行拉伸,以匹配容器交叉轴的高度。

  • center 将换行后的各行居中对齐到容器交叉轴。

  • space-between 将换行后的各行沿容器交叉轴均匀分布,并在各行之间分配剩余空间。

  • space-around 将换行后的各行沿容器交叉轴均匀分布,并在各行周围分配剩余空间。容器两端的空间大小是项目之间空间的一半。

  • space-evenly 将换行后的各行沿容器交叉轴均匀分布,并在各行周围分配剩余空间。每个间隔大小相同。

你可以在这里了解更多。

Flex Wrap

flexWrap 属性设置在容器上,用于控制子元素在主轴方向上超出容器尺寸时会发生什么。默认情况下,子元素会被强制放在单行中(这可能会使元素收缩)。如果允许换行,则项目会在需要时沿主轴换成多行。

当进行换行时,可以使用 alignContent 来指定各行在容器中的排列方式。了解更多 这里

Flex Basis、Grow 和 Shrink

  • flexBasis 是一种与轴无关的方式,用于提供项目在主轴上的默认尺寸。为子元素设置 flexBasis,类似于当其父元素是 flexDirection: row 的容器时设置该子元素的 width,或者当其父元素是 flexDirection: column 的容器时设置该子元素的 height。项目的 flexBasis 是该项目的默认尺寸,即在执行任何 flexGrowflexShrink 计算之前的尺寸。

  • flexGrow 描述了容器内的空间应如何沿主轴分配给其子元素。在布局完成子元素后,容器会根据子元素指定的 flexGrow 值分配任何剩余空间。

    flexGrow 接受任何大于等于 0 的浮点值,默认值为 0。容器会按照子元素的 flexGrow 值加权分配任何剩余空间。

  • flexShrink 描述了在子元素总尺寸沿主轴超过容器尺寸时,如何沿主轴压缩子元素。flexShrinkflexGrow 非常相似,如果将任何溢出的尺寸视为负的剩余空间,也可以用同样的方式来理解它。这两个属性也能很好地协同工作,使子元素能够按需要增长和收缩。

    flexShrink 接受任何大于等于 0 的浮点值,默认值为 0(在 web 上,默认值为 1)。容器会按照子元素的 flexShrink 值加权压缩其子元素。

你可以在 这里 了解更多。

行间距、列间距和间距

  • rowGap 设置元素各行之间的间隙(gutter)大小。

  • columnGap 设置元素各列之间的间隙(gutter)大小。

  • gap 设置行与列之间的间隙(gutter)大小。它是 rowGapcolumnGap 的简写。

你可以将 flexWrapalignContentgap 一起使用,在项目之间添加一致的间距。

宽度和高度

width 属性指定元素内容区域的宽度。类似地,height 属性指定元素内容区域的高度。

widthheight 都可以取以下值:

  • auto默认值)React Native 会根据元素的内容计算其宽度/高度,无论内容是其他子元素、文本还是图像。

  • pixels 以绝对像素定义宽度/高度。根据组件上设置的其他样式,这可能是也可能不是节点的最终尺寸。

  • percentage 以父元素宽度或高度的百分比来定义宽度或高度。

位置

元素的 position 类型定义了它相对于自身、其父元素,或其 包含块 的定位方式。

  • relative默认值)默认情况下,元素采用相对定位。这意味着元素会先按照布局的正常流进行定位,然后再根据 toprightbottomleft 的值相对于该位置进行偏移。这个偏移不会影响任何兄弟元素或父元素的位置。

  • absolute 绝对定位时,元素不会参与正常的布局流。它会独立于其兄弟元素进行布局。其位置由 toprightbottomleft 的值决定。这些值会将元素相对于其包含块进行定位。

  • static 静态定位时,元素会按照布局的正常流进行定位,并会忽略 toprightbottomleft 的值。这个 position 还会导致该元素不会为绝对定位的后代形成包含块,除非存在某些其他优先级更高的样式属性(例如 transform)。这使得 absolute 元素可以相对于不是其父元素的对象进行定位。请注意,static 仅在新架构中可用

包含块

元素的包含块是一个祖先元素,它会控制该元素的位置和大小。React Native 中包含块的工作方式与 Web 上的工作方式 非常相似,但由于缺少某些 Web 特性而做了一些简化。

绝对定位元素的 toprightbottomleft 值将相对于其包含块。

应用于绝对定位元素的百分比长度(例如:width: '50%'padding: '10%')将根据其包含块的大小按比例计算。例如,如果包含块宽度为 100 点,那么绝对定位元素上的 width: 50% 将使其宽度变为 50 点。

下面的列表将帮助你确定任意元素的包含块:

  • 如果该元素的 position 类型是 relativestatic,那么它的包含块就是其父元素。
  • 如果该元素的 position 类型是 absolute,那么它的包含块就是最近的满足以下任一条件的祖先元素:
    • 它的 position 类型不是 static
    • 它具有 transform

深入了解

查看可交互的 yoga playground,你可以通过它更好地理解 flexbox。

我们已经介绍了基础知识,但布局中你可能还需要许多其他样式。控制布局的完整属性列表记录在 这里

此外,你还可以查看来自 Wix Engineers 的一些示例。