使用 Flexbox 进行布局
组件可以使用 Flexbox 算法指定其子组件的布局。Flexbox 旨在在不同的屏幕尺寸上提供一致的布局。
¥A component can specify the layout of its children using the Flexbox algorithm. Flexbox is designed to provide a consistent layout on different screen sizes.
你通常会使用 flexDirection、alignItems 和 justifyContent 的组合来实现正确的布局。
¥You will normally use a combination of flexDirection, alignItems, and justifyContent to achieve the right layout.
Flexbox 在 React Native 中的工作方式与在 Web 上的 CSS 中的工作方式相同,但有一些例外。默认值不同,flexDirection 默认为 column 而不是 row,alignContent 默认为 flex-start 而不是 stretch,flexShrink 默认为 0 而不是 1,flex 参数仅支持单个数字。
¥Flexbox works the same way in React Native as it does in CSS on the web, with a few exceptions.
The defaults are different, with flexDirection defaulting to column instead of row, alignContent defaulting to flex-start instead of stretch, flexShrink defaulting to 0 instead of 1, the flex parameter only supporting a single number.
弹性
¥Flex
flex 将定义你的物品将如何“填充”沿主轴线的可用空间。空间将根据每个元素的 flex 属性进行划分。
¥flex will define how your items are going to “fill” over the available space along your main axis. Space will be divided according to each element's flex property.
在以下示例中,红色、橙色和绿色视图都是设置了 flex: 1 的容器视图中的子视图。红色视图使用 flex: 1 ,橙色视图使用 flex: 2 ,绿色视图使用 flex: 3 。 1+2+3 = 6,这意味着红色视图将获得空间的 1/6,橙色视图的空间的 2/6,以及绿色视图的空间的 3/6。
¥In the following example, the red, orange, and green views are all children in the container view that has flex: 1 set. The red view uses flex: 1 , the orange view uses flex: 2, and the green view uses flex: 3 . 1+2+3 = 6, which means that the red view will get 1/6 of the space, the orange 2/6 of the space, and the green 3/6 of the space.
弯曲方向
¥Flex Direction
flexDirection 控制节点子节点的布局方向。这也称为主轴。横轴是垂直于主轴的轴,或者是缠绕线布置的轴。
¥flexDirection controls the direction in which the children of a node are laid out. This is also referred to as the main axis. The cross axis is the axis perpendicular to the main axis, or the axis which the wrapping lines are laid out in.
-
column(默认值)从上到下对齐子项。如果启用了换行,则下一行将从容器顶部第一个项目的右侧开始。¥
column(default value) Align children from top to bottom. If wrapping is enabled, then the next line will start to the right of the first item on the top of the container. -
row从左到右对齐子项。如果启用了换行,则下一行将从容器左侧的第一个项目下方开始。¥
rowAlign children from left to right. If wrapping is enabled, then the next line will start under the first item on the left of the container. -
column-reverse从下到上对齐子项。如果启用换行,则下一行将从容器底部第一个项目的右侧开始。¥
column-reverseAlign children from bottom to top. If wrapping is enabled, then the next line will start to the right of the first item on the bottom of the container. -
row-reverse从右到左对齐子项。如果启用了换行,则下一行将从容器右侧的第一个项目下方开始。¥
row-reverseAlign children from right to left. If wrapping is enabled, then the next line will start under the first item on the right of the container.
你可以了解更多 此处。
¥You can learn more here.
- TypeScript
- JavaScript
布局方向
¥Layout Direction
布局 direction 指定层次结构中子项和文本的布局方向。布局方向也会影响边 start 和 end 所指的内容。默认情况下,React Native 采用 LTR 布局方向进行布局。在此模式下,start 指左,end 指右。
¥Layout direction specifies the direction in which children and text in a hierarchy should be laid out. Layout direction also affects what edge start and end refer to. By default, React Native lays out with LTR layout direction. In this mode start refers to left and end refers to right.
-
LTR(默认值)文本和子项从左到右排列。应用于元素开头的边距和填充将应用于左侧。¥
LTR(default value) Text and children are laid out from left to right. Margin and padding applied to the start of an element are applied on the left side. -
RTL文本和子项从右到左排列。应用于元素开头的边距和填充将应用于右侧。¥
RTLText and children are laid out from right to left. Margin and padding applied to the start of an element are applied on the right side.
- TypeScript
- JavaScript
证明内容合理
¥Justify Content
justifyContent 描述了如何在其容器的主轴内对齐子项。例如,你可以使用此属性将子项在容器内水平居中(将 flexDirection 设置为 row)或在容器内将子项垂直居中(将 flexDirection 设置为 column)。
¥justifyContent describes how to align children within the main axis of their container. For example, you can use this property to center a child horizontally within a container with flexDirection set to row or vertically within a container with flexDirection set to column.
-
flex-start(默认值)将容器的子项与容器主轴的起点对齐。¥
flex-start(default value) Align children of a container to the start of the container's main axis. -
flex-end将容器的子级与容器主轴的末端对齐。¥
flex-endAlign children of a container to the end of the container's main axis. -
center将容器的子项与容器主轴的中心对齐。¥
centerAlign children of a container in the center of the container's main axis. -
space-between将子项均匀地分布在容器的主轴上,在子项之间分配剩余空间。¥
space-betweenEvenly space off children across the container's main axis, distributing the remaining space between the children. -
space-around将子项均匀地分布在容器的主轴上,将剩余空间分布在子项周围。与space-between相比,使用space-around将导致空间分配到第一个子项的开头和最后一个子项的末尾。¥
space-aroundEvenly space off children across the container's main axis, distributing the remaining space around the children. Compared tospace-between, usingspace-aroundwill result in space being distributed to the beginning of the first child and end of the last child. -
space-evenly将子项沿主轴均匀分布在对齐容器内。每对相邻项目之间的间距、主起始边缘和第一个项目、以及主结束边缘和最后一个项目之间的间距都完全相同。¥
space-evenlyEvenly distribute children within the alignment container along the main axis. The spacing between each pair of adjacent items, the main-start edge and the first item, and the main-end edge and the last item, are all exactly the same.
你可以了解更多 此处。
¥You can learn more here.
- TypeScript
- JavaScript
对齐项目
¥Align Items
alignItems 描述了如何沿着容器的横轴对齐子项。它与 justifyContent 非常相似,但 alignItems 不应用于主轴,而是应用于交叉轴。
¥alignItems describes how to align children along the cross axis of their container. It is very similar to justifyContent but instead of applying to the main axis, alignItems applies to the cross axis.
-
stretch(默认值)拉伸容器的子项以匹配容器横轴的height。¥
stretch(default value) Stretch children of a container to match theheightof the container's cross axis. -
flex-start将容器的子项与容器横轴的起点对齐。¥
flex-startAlign children of a container to the start of the container's cross axis. -
flex-end将容器的子项与容器横轴的末端对齐。¥
flex-endAlign children of a container to the end of the container's cross axis. -
center将容器的子项与容器横轴的中心对齐。¥
centerAlign children of a container in the center of the container's cross axis. -
baseline将容器的子级沿公共基线对齐。可以将个别子级设置为父级的参考基线。¥
baselineAlign children of a container along a common baseline. Individual children can be set to be the reference baseline for their parents.
为了使 stretch 发挥作用,子项沿辅助轴不得具有固定尺寸。在以下示例中,在从子级中删除 width: 50 之前,设置 alignItems: stretch 不会执行任何操作。
¥For stretch to have an effect, children must not have a fixed dimension along the secondary axis. In the following example, setting alignItems: stretch does nothing until the width: 50 is removed from the children.
你可以了解更多 此处。
¥You can learn more here.
- TypeScript
- JavaScript
自我对齐
¥Align Self
alignSelf 具有与 alignItems 相同的选项和效果,但你可以将此属性应用于单个子项以更改其在其父项中的对齐方式,而不是影响容器内的子项。alignSelf 会覆盖父级使用 alignItems 设置的任何选项。
¥alignSelf has the same options and effect as alignItems but instead of affecting the children within a container, you can apply this property to a single child to change its alignment within its parent. alignSelf overrides any option set by the parent with alignItems.
- TypeScript
- JavaScript
对齐内容
¥Align Content
alignContent 定义线沿横轴的分布。仅当使用 flexWrap 将项目换行为多行时,这才有效。
¥alignContent defines the distribution of lines along the cross-axis. This only has effect when items are wrapped to multiple lines using flexWrap.
-
flex-start(默认值)将换行线与容器横轴的起点对齐。¥
flex-start(default value) Align wrapped lines to the start of the container's cross axis. -
flex-end将换行线与容器横轴的末端对齐。¥
flex-endAlign wrapped lines to the end of the container's cross axis. -
stretch(在网络上使用 Yoga 时的默认值)拉伸封装线以匹配容器横轴的高度。¥
stretch(default value when using Yoga on the web) Stretch wrapped lines to match the height of the container's cross axis. -
center将缠绕线与容器横轴的中心对齐。¥
centerAlign wrapped lines in the center of the container's cross axis. -
space-between在容器的横轴上均匀分布线条,分布线条之间的剩余空间。¥
space-betweenEvenly space wrapped lines across the container's cross axis, distributing the remaining space between the lines. -
space-around在容器的横轴上均匀分布线条,将剩余空间分布在线条周围。容器的每一端都有与项目之间的空间相比一半大小的空间。¥
space-aroundEvenly space wrapped lines across the container's cross axis, distributing the remaining space around the lines. Each end of the container has a half-sized space compared to the space between items. -
space-evenly在容器的横轴上均匀分布线条,将剩余空间分布在线条周围。每个空间大小相同。¥
space-evenlyEvenly space wrapped lines across the container's cross axis, distributing the remaining space around the lines. Each space is the same size.
你可以了解更多 此处。
¥You can learn more here.
- TypeScript
- JavaScript
弹性封装
¥Flex Wrap
flexWrap 属性在容器上设置,它控制当子项沿主轴溢出容器大小时会发生什么情况。默认情况下,子元素被强制排成一行(这可以缩小元素)。如果允许换行,则项目会根据需要沿主轴换行成多行。
¥The flexWrap property is set on containers and it controls what happens when children overflow the size of the container along the main axis. By default, children are forced into a single line (which can shrink elements). If wrapping is allowed, items are wrapped into multiple lines along the main axis if needed.
换行时,alignContent 可用于指定如何将线放置在容器中。了解更多 此处。
¥When wrapping lines, alignContent can be used to specify how the lines are placed in the container. Learn more here.
- TypeScript
- JavaScript
弹性基础、增长和收缩
¥Flex Basis, Grow, and Shrink
-
flexBasis是一种与轴无关的方式,提供项目沿主轴的默认大小。设置子级的flexBasis类似于如果其父级是具有flexDirection: row的容器则设置该子级的width,或者如果其父级是具有flexDirection: column的容器则设置子级的height。项目的flexBasis是该项目的默认尺寸,即执行任何flexGrow和flexShrink计算之前的项目尺寸。¥
flexBasisis an axis-independent way of providing the default size of an item along the main axis. Setting theflexBasisof a child is similar to setting thewidthof that child if its parent is a container withflexDirection: rowor setting theheightof a child if its parent is a container withflexDirection: column. TheflexBasisof an item is the default size of that item, the size of the item before anyflexGrowandflexShrinkcalculations are performed. -
flexGrow描述容器内应沿主轴在其子级之间分配多少空间。布置其子级后,容器将根据其子级指定的 Flex Growth 值分配任何剩余空间。¥
flexGrowdescribes how much space within a container should be distributed among its children along the main axis. After laying out its children, a container will distribute any remaining space according to the flex grow values specified by its children.flexGrow接受任何 >= 0 的浮点值,其中 0 是默认值。容器将根据子级的flexGrow值在其子级之间分配任何剩余空间。¥
flexGrowaccepts any floating point value >= 0, with 0 being the default value. A container will distribute any remaining space among its children weighted by the children’sflexGrowvalues. -
flexShrink描述了在子项总大小超出主轴上容器大小的情况下,如何沿主轴收缩子项。flexShrink与flexGrow非常相似,如果任何溢出的大小被认为是负剩余空间,则可以以相同的方式进行思考。这两个属性也可以很好地协同工作,让子级根据需要成长和缩小。¥
flexShrinkdescribes how to shrink children along the main axis in the case in which the total size of the children overflows the size of the container on the main axis.flexShrinkis very similar toflexGrowand can be thought of in the same way if any overflowing size is considered to be negative remaining space. These two properties also work well together by allowing children to grow and shrink as needed.flexShrink接受任何 >= 0 的浮点值,其中 0 是默认值(在 Web 上,默认值为 1)。容器将根据子项的flexShrink值加权缩小其子项。¥
flexShrinkaccepts any floating point value >= 0, with 0 being the default value (on the web, the default is 1). A container will shrink its children weighted by the children’sflexShrinkvalues.
你可以了解更多 此处。
¥You can learn more here.
- TypeScript
- JavaScript
行间隙、列间隙和间隙
¥Row Gap, Column Gap and Gap
-
rowGap设置元素行之间间隙(装订线)的大小。¥
rowGapsets the size of the gap (gutter) between an element's rows. -
columnGap设置元素列之间的间隙(装订线)的大小。¥
columnGapsets the size of the gap (gutter) between an element's columns. -
gap设置行和列之间的间隙(装订线)的大小。它是rowGap和columnGap的简写。¥
gapsets the size of the gap (gutter) between rows and columns. It is a shorthand forrowGapandcolumnGap.
你可以使用 flexWrap 和 alignContent 以及 gap 在项目之间添加一致的间距。
¥You can use flexWrap and alignContent along with gap to add consistent spacing between items.
- TypeScript
- JavaScript
宽度和高度
¥Width and Height
width 属性指定元素内容区域的宽度。同样,height 属性指定元素内容区域的高度。
¥The width property specifies the width of an element's content area. Similarly, the height property specifies the height of an element's content area.
width 和 height 都可以采用以下值:
¥Both width and height can take the following values:
-
auto(默认值)React Native 根据元素的内容计算元素的宽度/高度,无论是其他子元素、文本还是图片。¥
auto(default value) React Native calculates the width/height for the element based on its content, whether that is other children, text, or an image. -
pixels定义绝对像素的宽度/高度。根据组件上设置的其他样式,这可能是也可能不是节点的最终尺寸。¥
pixelsDefines the width/height in absolute pixels. Depending on other styles set on the component, this may or may not be the final dimension of the node. -
percentage分别定义其父级宽度或高度的百分比的宽度或高度。¥
percentageDefines the width or height in percentage of its parent's width or height, respectively.
- TypeScript
- JavaScript
位置
¥Position
元素的 position 类型定义它相对于自身、其父级或其 包含块 的定位方式。
¥The position type of an element defines how it is positioned relative to either itself, its parent, or its containing block.
-
relative(默认值) 默认情况下,元素是相对定位的。这意味着元素根据布局的正常流程定位,然后根据top、right、bottom和left的值相对于该位置进行偏移。偏移量不会影响任何同级或父元素的位置。¥
relative(default value) By default, an element is positioned relatively. This means an element is positioned according to the normal flow of the layout, and then offset relative to that position based on the values oftop,right,bottom, andleft. The offset does not affect the position of any sibling or parent elements. -
absolute当绝对定位时,元素不会参与正常的布局流程。相反,它的布局独立于其兄弟姐妹。该位置是根据top、right、bottom和left值确定的。这些值将相对于其包含块定位元素。¥
absoluteWhen positioned absolutely, an element doesn't take part in the normal layout flow. It is instead laid out independent of its siblings. The position is determined based on thetop,right,bottom, andleftvalues. These values will position the element relative to its containing block. -
static静态定位时,元素将根据正常的布局流程进行定位,并将忽略top、right、bottom和left值。此position还会导致元素不形成绝对后代的包含块,除非存在其他替代样式属性(例如transform)。这允许将absolute元素定位到不是其父级的某个位置。请注意,static仅在新架构上可用。¥
staticWhen positioned statically, an element is positioned according to the normal flow of layout, and will ignore thetop,right,bottom, andleftvalues. Thispositionwill also cause the element to not form a containing block for absolute descendants, unless some other superceding style prop is present (e.g.transform). This allowsabsoluteelements to be positioned to something that is not their parent. Note thatstaticis only available on the New Architecture.
- TypeScript
- JavaScript
包含块
¥The Containing Block
元素的包含块是控制其位置和大小的祖级元素。React Native 中包含块的工作方式与 它们在网络上的工作原理 非常相似,由于缺少一些 Web 功能而进行了一些简化。
¥The containing block of an element is an ancestor element which controls its position and size. The way containing blocks work in React Native is very similar to how they work on the web, with some simplifications due to the lack of some web features.
绝对定位元素的 top、right、bottom 和 left 值将相对于其包含块。
¥The top, right, bottom, and left values of an absolutely positioned element will be
relative to its containing block.
应用于绝对定位元素的百分比长度(例如:width: '50%' 或 padding: '10%')将相对于其包含块的大小进行计算。例如,如果包含块的宽度为 100 点,则绝对定位元素上的 width: 50% 将使其宽度为 50 点。
¥Percentage lengths (e.g.: width: '50%' or padding: '10%') applied to absolutely positioned elements will be calculated relatively to the size of its containing block. For example, if the containing block is 100 points wide, then width: 50% on an absolutely positioned element will cause it to be 50 points wide.
以下列表将帮助你确定任何给定元素的包含块:
¥The following list will help you determine the containing block of any given element:
-
如果该元素的
position类型为relative或static,则其包含块是其父级。¥If that element has a
positiontype ofrelativeorstatic, then its containing block is its parent. -
如果该元素的
position类型为absolute,则其包含块是以下之一为真的最近祖级:¥If that element has a
positiontype ofabsolute, then its containing block is the nearest ancestor in which one of the following is true:-
它具有除
static之外的position类型¥It has a
positiontype other thanstatic -
它有一个
transform¥It has a
transform
-
更深入
¥Going Deeper
查看交互式 yoga 在线运行,你可以使用它来更好地了解 Flexbox。
¥Check out the interactive yoga playground that you can use to get a better understanding of flexbox.
我们已经介绍了基础知识,但布局可能还需要许多其他样式。控制布局的 props 的完整列表记录在 此处 中。
¥We've covered the basics, but there are many other styles you may need for layouts. The full list of props that control layout is documented here.
此外,你还可以看到 Wix 工程师 中的一些示例。
¥Additionally, you can see some examples from Wix Engineers.