Макет с Flexbox¶
Компонент может задавать расположение своих дочерних элементов с помощью алгоритма Flexbox. Flexbox предназначен для обеспечения согласованного расположения на экранах разных размеров.
Обычно вы используете комбинацию flexDirection
, alignItems
и justifyContent
для достижения правильного расположения.
Flexbox работает в React Native так же, как и в CSS в Интернете, за некоторыми исключениями.
Значения по умолчанию отличаются: flexDirection
по умолчанию column
вместо row
, alignContent
по умолчанию flex-start
вместо stretch
, flexShrink
по умолчанию 0
вместо 1
, параметр flex
поддерживает только одно число.
Flex¶
flex
определяет, как ваши элементы будут "заполнять " доступное пространство вдоль главной оси. Пространство будет распределено в соответствии со свойством flex
каждого элемента.
В следующем примере красное, оранжевое и зеленое представления являются дочерними в представлении контейнера, для которого установлен параметр flex: 1
. Красный вид использует flex: 1
, оранжевый вид использует flex: 2
, а зеленый вид использует flex: 3
. 1+2+3 = 6, что означает, что красный вид получит 1/6
пространства, оранжевый 2/6
пространства, а зеленый 3/6
пространства.
Flex Direction¶
flexDirection
управляет направлением, в котором располагаются дочерние узлы узла. Это также называется главной осью. Поперечная ось — это ось, перпендикулярная главной оси, или ось, по которой располагаются линии обводки.
column
(значение по умолчанию) Выравнивание дочерних элементов сверху вниз. Если включено обертывание, то следующая строка будет начинаться справа от первого элемента в верхней части контейнера.row
Выравнивание детей слева направо. Если включено обертывание, то следующая строка будет начинаться под первым элементом слева от контейнера.column-reverse
Выравнивание детей снизу вверх. Если обертывание включено, то следующая строка будет начинаться справа от первого элемента внизу контейнера.row-reverse
Выравнивание детей справа налево. Если обертывание включено, то следующая строка будет начинаться под первым элементом справа от контейнера.
Вы можете узнать больше здесь.
Layout Direction¶
Layout direction
определяет направление, в котором должны располагаться дочерние элементы и текст в иерархии. Направление компоновки также влияет на то, к какому краю относятся start
и end
. По умолчанию React Native выстраивает макет в направлении LTR. В этом режиме start
относится к левому краю, а end
— к правому.
LTR
(значение по умолчанию) Текст и дочерние элементы располагаются слева направо. Маржа и отступы, примененные к началу элемента, применяются с левой стороны.RTL
Текст и дочерние элементы располагаются справа налево. Маржа и отступы, применяемые к началу элемента, применяются с правой стороны.
Justify Content¶
justifyContent
описывает, как выровнять дочерние элементы по главной оси их контейнера. Например, вы можете использовать это свойство для центрирования дочернего элемента по горизонтали в контейнере с flexDirection
, установленным на row
, или по вертикали в контейнере с flexDirection
, установленным на column
.
flex-start
(значение по умолчанию) Выравнивание дочерних элементов контейнера по началу главной оси контейнера.flex-end
Выравнивание дочерних элементов контейнера по концу главной оси контейнера.center
Выравнивание дочерних элементов контейнера по центру главной оси контейнера.space-between
Равномерно распределяет дочерние элементы по главной оси контейнера, распределяя оставшееся пространство между ними.space-around
Равномерно распределяет пространство между детьми по главной оси контейнера, распределяя оставшееся пространство вокруг детей. По сравнению сspace-between
, использованиеspace-around
приведет к распределению пространства между началом первого и концом последнего ребенка.space-evenly
Равномерно распределить дочерние элементы в контейнере выравнивания вдоль главной оси. Расстояние между каждой парой соседних элементов, начальным краем главной оси и первым элементом и конечным краем главной оси и последним элементом, абсолютно одинаково.
Вы можете узнать больше здесь.
Align Items¶
alignItems
описывает, как выровнять дочерние элементы по поперечной оси их контейнера. Это очень похоже на justifyContent
, но вместо применения к главной оси, alignItems
применяется к поперечной оси.
stretch
(значение по умолчанию) Растягивает дочерние элементы контейнера в соответствии свысотой
поперечной оси контейнера.flex-start
Выравнивает дочерние элементы контейнера по началу поперечной оси контейнера.flex-end
Выравнивание дочерних элементов контейнера по концу поперечной оси контейнера.center
Выравнивание дочерних элементов контейнера по центру поперечной оси контейнера.baseline
Выравнивание дочерних элементов контейнера по общей базовой линии. Отдельные дочерние элементы могут быть установлены в качестве базовой линии для своих родителей.
Чтобы stretch
имело эффект, дочерние элементы не должны иметь фиксированный размер вдоль вторичной оси. В следующем примере установка alignItems: stretch
ничего не дает, пока width: 50
не будет удалено из дочерних элементов.
Вы можете узнать больше здесь.
Align Self¶
alignSelf
имеет те же опции и эффект, что и alignItems
, но вместо того, чтобы влиять на дочерние элементы внутри контейнера, вы можете применить это свойство к одному дочернему элементу, чтобы изменить его выравнивание внутри родителя. alignSelf
переопределяет любую опцию, установленную родителем с помощью alignItems
.
Align Content¶
alignContent определяет распределение линий вдоль поперечной оси. Это имеет значение только в том случае, если элементы обернуты в несколько линий с помощью flexWrap
.
flex-start
(значение по умолчанию) Выравнивание обернутых линий по началу поперечной оси контейнера.flex-end
Выравнивает обернутые линии по концу поперечной оси контейнера.stretch
(значение по умолчанию при использовании Yoga в Интернете) Растягивает обернутые линии в соответствии с высотой поперечной оси контейнера.center
Выравнивание обернутых линий по центру поперечной оси контейнера.space-between
Равномерно распределять обернутые линии по поперечной оси контейнера, распределяя оставшееся пространство между линиями.space-around
Равномерно распределять обернутые линии по поперечной оси контейнера, распределяя оставшееся пространство вокруг линий. По сравнению сspace-between
, использованиеspace-around
приводит к распределению пространства между началом первой и концом последней строки.
Вы можете узнать больше здесь.
Flex Wrap¶
Свойство flexWrap
устанавливается для контейнеров и управляет тем, что происходит, когда дочерние элементы превышают размер контейнера вдоль главной оси. По умолчанию дочерние элементы вытягиваются в одну линию (что может привести к сжатию элементов). Если обертывание разрешено, элементы будут обернуты в несколько линий вдоль главной оси, если это необходимо.
При обертывании строк можно использовать alignContent
, чтобы указать, как строки будут располагаться в контейнере. Подробнее здесь.
Flex Basis, Grow и Shrink¶
-
flexBasis
— это независимый от оси способ задать размер элемента по умолчанию вдоль главной оси. УстановкаflexBasis
дочернего элемента аналогична установкеwidth
этого элемента, если его родитель является контейнером сflexDirection: row
или установкеheight
дочернего элемента, если его родитель является контейнером сflexDirection: column
.flexBasis
элемента — это размер элемента по умолчанию, размер элемента до выполнения любых вычисленийflexGrow
иflexShrink
. -
flexGrow
описывает, сколько места внутри контейнера должно быть распределено между его дочерними элементами вдоль главной оси. После размещения дочерних элементов контейнер распределяет оставшееся пространство в соответствии со значениями flex grow, заданными его дочерними элементами.flexGrow
принимает любое значение с плавающей точкой >= 0, при этом 0 является значением по умолчанию. Контейнер будет распределять оставшееся пространство между своими дочерними элементами, взвешивая значенияflexGrow
дочерних элементов. -
flexShrink
описывает, как уменьшить дочерние элементы вдоль главной оси в случае, когда общий размер дочерних элементов превышает размер контейнера на главной оси. СвойствоflexShrink
очень похоже наflexGrow
и может быть рассмотрено таким же образом, если любой переполняющий размер рассматривается как отрицательное оставшееся пространство. Эти два свойства также хорошо работают вместе, позволяя детям увеличиваться и уменьшаться по мере необходимости.flexShrink
принимает любое значение с плавающей точкой >= 0, при этом по умолчанию используется значение 0 (в Интернете по умолчанию используется значение 1). Контейнер будет уменьшать свои дочерние элементы, взвешивая значенияflexShrink
дочерних элементов.
Вы можете узнать больше здесь.
Row Gap, Column Gap и Gap¶
rowGap
задает размер промежутка (желоба) между строками элемента.columnGap
задает размер промежутка (желоба) между колонками элемента.gap
задает размер промежутка (желоба) между строками и столбцами. Это сокращение дляrowGap
иcolumnGap
.
Вы можете использовать flexWrap
и alignContent
вместе с gap
для добавления согласованного расстояния между элементами.
Ширина и высота¶
Свойство width
задает ширину области содержимого элемента. Аналогично, свойство height
определяет высоту области содержимого элемента.
И width
, и height
могут принимать следующие значения:
auto
(значение по умолчанию) React Native рассчитывает ширину/высоту для элемента на основе его содержимого, будь то другие дочерние элементы, текст или изображение.pixels
Определяет ширину/высоту в абсолютных пикселях. В зависимости от других стилей, установленных для компонента, это может быть или не быть окончательным размером узла.percentage
Определяет ширину или высоту в процентах от ширины или высоты родителя, соответственно.
Абсолютное и относительное позиционирование¶
Тип position
элемента определяет, как он располагается внутри своего родителя.
relative
(значение по умолчанию) По умолчанию элемент позиционируется относительно. Это означает, что элемент позиционируется в соответствии с нормальным потоком макета, а затем смещается относительно этой позиции на основе значенийtop
,right
,bottom
иleft
. Смещение не влияет на положение дочерних или родительских элементов.absolute
При абсолютном позиционировании элемент не участвует в обычном потоке компоновки. Вместо этого он располагается независимо от своих братьев и сестер. Положение определяется на основе значенийtop
,right
,bottom
иleft
.
Углубляемся¶
Посмотрите интерактивный yoga playground, который вы можете использовать для лучшего понимания flexbox.
Мы рассмотрели основы, но существует множество других стилей, которые могут понадобиться для макетов. Полный список пропсов, управляющих компоновкой, задокументирован здесь.
Кроме того, вы можете посмотреть некоторые примеры от Wix Engineers.