Макет с 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.