Как вы можете плавать: прямо в React Native?

157

У меня есть элемент, который я хочу плавать правильно, например

<View style={{width: 300}}>
  <Text style={{backgroundColor: "#DDD"}}>Hello</Text>
</View>

Как можно Textплавать / выравнивать вправо? Кроме того, почему он Textзанимает все пространство Viewвместо "Hello"?

Какой-то парень
источник
Интересно, нашли ли вы ответ, потому что все три верхних ответа говорят об использовании 3 разных стилевых атрибутов! justifyContent, alignItems, alignSelf. Интересно, что правильно.

Ответы:

278

почему текст занимает все пространство представления, а не просто "Hello"?

Потому что Viewэто гибкий контейнер и по умолчанию имеет flexDirection: 'column'и alignItems: 'stretch', что означает, что его дочерние элементы должны быть растянуты, чтобы заполнить его ширину.

(Обратите внимание, в соответствии с документами , что все компоненты в React Native display: 'flex'по умолчанию являются и display: 'inline'вообще не существуют. Таким образом, поведение по умолчанию для элемента Textвнутри Viewв React Native отличается от поведения по умолчанию для элемента spanвнутри divв Интернете; в последнем случае span не будет заполнять ширину, divпотому что a spanявляется встроенным элементом по умолчанию. В React Native такого понятия нет.)

Как текст может быть перемещен / выровнен вправо?

Это floatсвойство не существует в React Native, но есть множество доступных вам опций (с немного другим поведением), которые позволят вам выровнять текст по правому краю. Вот те, о которых я могу думать:

1. Используйте textAlign: 'right'на Textэлементе

<View>
  <Text style={{textAlign: 'right'}}>Hello, World!</Text>
</View>

(Этот подход не меняет тот факт, что Textзаполняет всю ширину View; он просто выравнивает текст по правому краю Text.)

2. Используйте alignSelf: 'flex-end'наText

<View>
  <Text style={{alignSelf: 'flex-end'}}>Hello, World!</Text>
</View>

Это сжимает Textэлемент до размера, необходимого для хранения его содержимого, и помещает его в конец поперечного направления (по умолчанию в горизонтальном направлении) View.

3. Используйте alignItems: 'flex-end'наView

<View style={{alignItems: 'flex-end'}}>
  <Text>Hello, World!</Text>
</View>

Это эквивалентно установке alignSelf: 'flex-end'на всех Viewдочерних элементах.

4. Используйте flexDirection: 'row'и justifyContent: 'flex-end'наView

<View style={{flexDirection: 'row', justifyContent: 'flex-end'}}>
  <Text>Hello, World!</Text>
</View>

flexDirection: 'row'устанавливает основное направление макета как горизонтальное, а не вертикальное; justifyContentточно так же alignItems, но управляет выравниванием в основном направлении, а не в поперечном направлении.

5. Используйте flexDirection: 'row'на Viewи marginLeft: 'auto'наText

<View style={{flexDirection: 'row'}}>
  <Text style={{marginLeft: 'auto'}}>Hello, World!</Text>
</View>

Этот подход демонстрируется в контексте Интернета и реального CSS на https://stackoverflow.com/a/34063808/1709587 .

6. Используйте position: 'absolute'и right: 0на Text:

<View>
  <Text style={{position: 'absolute', right: 0}}>Hello, World!</Text>
</View>

Как и в реальном CSS, это берет Text«вне потока», то есть его братья и сестры смогут перекрывать его, и его вертикальное положение будет Viewпо умолчанию сверху (хотя вы можете явно установить расстояние от вершины Viewиспользуя topсвойство style).


Естественно, какой из этих различных подходов вы хотите использовать - и будет ли вообще важен выбор между ними - будет зависеть от ваших конкретных обстоятельств.

Марк Эмери
источник
2
Ни одно из этих решений не работает. :( Моя цель состояла в том, чтобы поместить заголовок, и тогда текст, приходящий слева, обошел бы его. Вот так - stackoverflow.com/q/19179424/1828637 - Так я надеялся сделать:. <Text><Text>FLOAT TEXT</Text>multi line text here which wraps around float textИли то же самое, но с изображением, похожим на это: <View><Text><Image />multi line text which wrap around float image</Text>.
Noitidart
Спасибо за ответ @ Марк Эмери! Мне действительно нравится пятый (5-й) подход, так как я не люблю устанавливать константу для высоты представления / контейнера, так как он сам автоматически изменяет размер.
Монеро Жаннитон
№ 4 работал угощение для меня. Я подозреваю, что любой, у кого есть проблемы, должен посмотреть, как содержатся представления, это может иметь отношение к гибкой компоновке дочерних элементов.
Тахир Халид
82

Вы можете напрямую указать выравнивание элемента, например:

textright: {    
  alignSelf: 'flex-end',  
},
goodhyun
источник
3
@goodniceweb Ты в замешательстве; там нет ни одного инлайн элементов в React Адаптивное. Единственными допустимыми displayзначениями являются 'flex'и 'none'.
Марк Амери
34

Для меня установка alignItemsна родителя сделала свое дело, как:

var styles = StyleSheet.create({
  container: {
    alignItems: 'flex-end'
  }
});
Cherniv
источник
20

Вы не должны использовать поплавки в React Native. React Native использует flexbox для обработки всего этого.

В вашем случае вы, вероятно, захотите, чтобы контейнер имел атрибут

justifyContent: 'flex-end'

Что касается текста, занимающего все пространство, опять же, вам нужно взглянуть на свой контейнер.

Вот ссылка на действительно замечательное руководство по flexbox: Полное руководство по Flexbox

eyal83
источник
13
<View style={{ flex: 1, flexDirection: 'row', justifyContent: 'flex-end' }}>
  <Text>
  Some Text
  </Text>
</View>

flexDirection: Если вы хотите двигаться горизонтально (строка) или вертикально (столбец)

justifyContent: направление, в котором вы хотите двигаться.

Сантош Пиллаи
источник
1
Немного вводит в заблуждение; justifyContentне выбирает направление само по себе; он предлагает кучу вариантов того, как все расположено и разнесено вдоль основного направления изгиба.
Марк Амери
0

Вы можете использовать float: right в соответствии с native, используя flex:

 <View style={{flex: 1, flexDirection: 'row'}}>
        <View style={{width: 50, height: 50, backgroundColor: 'powderblue'}} />
        <View style={{width: 50, height: 50, backgroundColor: 'skyblue'}} />
        <View style={{width: 50, height: 50, backgroundColor: 'steelblue'}} />
</View>

для получения более подробной информации: https://facebook.github.io/react-native/docs/flexbox.html#flex-direction

Джитендра Сутар
источник
1
Это просто повторяет подход, который я уже опубликовал (это вариант 4 в моем ответе ), и я не вижу никакой добавленной стоимости.
Марк Амери